Ubuntu 20.04 & 21.04 – Outils de monitoring avec Telegraf, InfluxDB et Grafana

• Procédure exécutée avec succès le 16 février 2021 à 23h42

Le monitoring ou surpervision est une activité de surveillance et de mesure d'une activité informatique. Ces mesures permettent de construire des graphes afin de visualiser les performances et de voir les tendances, de détecter voire d'anticiper des anomalies ou des pannes et d'alerter en cas de dysfonctionnement.

Le monitoring peut vous permettre de déclencher des alertes sur certains seuils de métriques afin de réagir avant qu’un problème devienne critique.

Les indicateurs peuvent être :
  • un pic de charge important indiquant un problème de performance ou un pic de visiteurs
  • un pic de trafic anormal causé par une attaque
  • à l’inverse une perte soudaine de traffic pouvant indiquer une panne ou une indisponibilité.

Dans ce tutoriel, nous allons mettre en place la stack TIG (Telegraf - InfluxDB - Grafana) où Telegraf sera utilisé comme collecteur, InfluxDB comme solution de stockage et Grafana comme outil de mise en forme et de visualisation des données.

Telegraf est un collecteur de données créé par les créateurs d’InfluxDB : InfluxData. Il permet de collecter des données systèmes (CPU, mémoire, I/O, disque, etc.) ou les données liées à vos containers Docker et dispose de très nombreux plugins d’entrées (pour collecter) et de sortie (pour stocker).

Comme plugin de sortie, nous utiliserons InfluxDB, une base de données écrite en Go spécialisée dans le stockage de métriques et d’événements. Egalement développé par InfluxData, l’intégration d'InfluxDB avec Telegraf est très aisée.

Grafana est une des références pour la visualisation et la mise en forme de données métriques. Il permet de réaliser des tableaux de bord et des graphiques à partir d’une multitude de sources de données (InfluxDB, Graphite, Prometheus, Elasticsearch, etc.) et permet également de vous alerter en fonction de seuils définis via différents canaux (Slack, email, PagerDuty, etc.).

Grafana

Grafana sera accessible depuis l'extérieur via Traefik et sera sécurisé grâce à un certificat SSL/TLS délivré par Let's Encrypt.

1 - Prérequis

  • Vous devez disposer d'Ubuntu en version 20.04 ou supérieure Desktop, Server ou ARM (Raspberry Pi). Si vous disposez d'une version antérieure, vous pouvez mettre à jour votre système en suivant cette procédure.
  • Votre utilisateur doit avoir accès à sudo.
  • Vos dépôts APT doivent être à jour. Dans le doute, tapez la commande suivante :
    sudo apt-get update
  • Les paquets curl et software-properties-common doivent être installés sur votre système. Dans le doute, tapez la commande suivante :
    sudo apt-get install -y curl software-properties-common

2 - Installation de Docker

  1. Installez Docker :
    sudo apt-get install -y docker.io
  2. Vérifiez que Docker est correctement installé avec la commande :
    docker -v
    Docker version 19.03.8, build afacb8b7f0
    La commande doit retourner la version installée de Docker.

3 - Installation de Docker Compose

  1. Téléchargez Docker Compose avec la commande suivante en modifiant, si besoin, la version avec la dernière release du repository officiel de Docker :
    sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  2. Ajoutez les droits d'exécution sur le binaire de Docker Compose :
    sudo chmod +x /usr/local/bin/docker-compose
  3. Vérifiez l'installation de Docker Compose avec la commande :
    docker-compose -v
    docker-compose version 1.27.4, build 8a1c60f6
    Si l'installation s'est correctement effectuée, cette commande doit vous renvoyer la version de Docker Compose.

4 - Droits Unix

Il est recommandé, pour des raisons de sécurité, de créer un utilisateur dédié à la gestion des volumes Docker et de ne pas le lancer sous votre super-utilisateur.

  • Créez un utilisateur grafana :
    sudo adduser grafana
  • Ajoutez-le au groupe docker :
    sudo adduser grafana docker

5 - Création des volumes Telegraf, InfluxDB et Grafana

  • Connectez-vous sous l'utilisateur grafana :
    su grafana
  • Déplacez-vous dans le répertoire personnel de cet utilisateur :
    cd
  • Créez le fichier /home/grafana/docker-compose.yml et modifiez les lignes en surbrillance en fonction de la configuration souhaitée :
    version: "3"
    services:
      influxdb:
        image: influxdb:latest
        container_name: influxdb
        restart: always
        hostname: influxdb
        networks:
          - lan
        ports:
          - 8086:8086
        environment:
          INFLUX_DB: "telegraf"
          INFLUXDB_USER: "telegraf_user"
          INFLUXDB_USER_PASSWORD: "telegraf_password"
        volumes:
          - influxdb-data:/var/lib/influxdb
    
      telegraf:
        image: telegraf:latest
        depends_on:
          - influxdb
        container_name: telegraf
        restart: always
        networks:
          - lan
        links:
          - influxdb:influxdb
        tty: true
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /home/grafana/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
        privileged: true
    
      grafana:
        image: grafana/grafana:latest
        depends_on:
          - influxdb
        container_name: grafana
        restart: always
        networks:
          - lan
        ports:
          - 3000:3000
        links:
          - influxdb:influxdb
        environment:
          GF_INSTALL_PLUGINS: "grafana-clock-panel,\
                              grafana-influxdb-08-datasource,\
                              grafana-kairosdb-datasource,\
                              grafana-piechart-panel,\
                              grafana-simple-json-datasource,\
                              grafana-worldmap-panel"
          GF_SECURITY_ADMIN_USER: "grafana_user"
          GF_SECURITY_ADMIN_PASSWORD: "grafana_password"
        volumes:
          - grafana-data:/var/lib/grafana
    volumes:
      influxdb-data:
      grafana-data:
    
    networks:
      lan:
    
    Les données suivantes seront créées automatiquement au démarrage des containers :
    • INFLUX_DB : nom de la base de données créée dans InfluxDB.
    • INFLUXDB_USER : utilisateur créé avec les droits de lecture/écriture sur la base de données INFLUX_DB.
    • INFLUXDB_USER_PASSWORD : mot de passe de l'utilisateur INFLUXDB_USER.
    • GF_SECURITY_ADMIN_USER : administrateur de l'interface Grafana.
    • GF_SECURITY_ADMIN_PASSWORD : mot de passe de l'administrateur de Grafana.
  • Créez le répertoire de configuration de Telegraf et générez un fichier de configuration à jour avec la commande suivante :
    mkdir telegraf
    docker run --rm telegraf telegraf config > telegraf/telegraf.conf
  • Modifiez ou décommentez les lignes suivantes dans le fichier de configuration /home/grafana/telegraf/telegraf.conf :
    [...]
    
    # Configuration for telegraf agent                                                
    [agent]
        [...]
        
        ## Override default hostname, if empty use os.Hostname()
        hostname = "telegraf"
        
        [...]
        
    ###############################################################################
    #                            OUTPUT PLUGINS                                   #
    ###############################################################################
    # Configuration for sending metrics to InfluxDB                                                                                                                                                                                              
    [[outputs.influxdb]]
      ## The full HTTP or UDP URL for your InfluxDB instance.                                                                                                                                                                                    
      ##                                                                                                                                                                                                                                         
      ## Multiple URLs can be specified for a single cluster, only ONE of the                                                                                                                                                                    
      ## urls will be written to each interval.                                                                                                                                                                                                  
      # urls = ["unix:///var/run/influxdb.sock"]                                                                                                                                                                                                 
      # urls = ["udp://127.0.0.1:8089"]                                                                                                                                                                                                          
      # urls = ["http://127.0.0.1:8086"]                                                                                                                                                                                                         
      urls = ["http://influxdb:8086"]
    
      ## The target database for metrics; will be created as needed.                                                                                                                                                                             
      database = "telegraf"
    
      ## If true, no CREATE DATABASE queries will be sent.  Set to true when using                                                                                                                                                               
      ## Telegraf with a user without permissions to create databases or when the                                                                                                                                                                
      ## database already exists.                                                                                                                                                                                                                
      # skip_database_creation = false                                                                                                                                                                                                           
    
      ## Name of existing retention policy to write to.  Empty string writes to                                                                                                                                                                  
      ## the default retention policy.  Only takes effect when using HTTP.                                                                                                                                                                       
      # retention_policy = ""                                                                                                                                                                                                                    
    
      ## Write consistency (clusters only), can be: "any", "one", "quorum", "all".                                                                                                                                                               
      ## Only takes effect when using HTTP.                                                                                                                                                                                                      
      # write_consistency = "any"                                                                                                                                                                                                                
    
      ## Timeout for HTTP messages.                                                                                                                                                                                                              
      # timeout = "5s"                                                                                                                                                                                                                           
    
      ## HTTP Basic Auth                                                                                                                                                                                                                         
      username = "telegraf_user"
      password = "telegraf_password"
      
      [...]
      
    [...]
    
    ###############################################################################
    #                             INPUT PLUGINS                                   #
    ###############################################################################
    
    [...]
    
    # # Read metrics about docker containers
    [[inputs.docker]]
    #   ## Docker Endpoint
    #   ##   To use TCP, set endpoint = "tcp://[ip]:[port]"
    #   ##   To use environment variables (ie, docker-machine), set endpoint = "ENV"
        endpoint = "unix:///var/run/docker.sock"
        
        [...]
        
    [...]
    • hostname = "telegraf" : donnée purement indicative permettant d'identifier dans Grafana la provenance des métriques relevées par Telegraf.
    • urls = ["http://influxdb:8086"] : le host doit correspondre à la valeur de la directive hostname déclarée dans votre docker-compose.yml pour le container influxdb. Le port d'écoute par défaut d'InfluxDB est le 8086.
    • database = "telegraf" : le nom de la base données doit correspondre à la valeur de la directive INFLUX_DB déclarée dans votre docker-compose.yml pour le container influxdb.
    • username = "telegraf_user" : cette ligne doit être décommentée et la valeur doit correspondre à celle de la directive INFLUXDB_USER déclarée dans votre docker-compose.yml pour le container influxdb.
    • password = "telegraf_password" : cette ligne doit être décommentée et la valeur doit correspondre à celle de la directive INFLUXDB_USER_PASSWORD déclarée dans votre docker-compose.yml pour le container influxdb.
    • [[inputs.docker]] : cette ligne doit être décommentée pour activer et lire les métriques liés à vos containers Docker.
    • endpoint = "unix:///var/run/docker.sock" : cette ligne doit être décommentée pour préciser le socket d'écoute de votre processus Docker.
  • Démarrez les containers :
    docker-compose up -d
  • Listez vos containers avec la commande docker ps -a :
    docker ps -a
    CONTAINER ID    IMAGE                     COMMAND                   CREATED           STATUS           PORTS                           NAMES
    9d32077ff753    grafana/grafana:latest    "/run.sh"                 42 seconds ago    Up 42 seconds    0.0.0.0:3000->3000/tcp          grafana
    4120c198969a    telegraf:latest           "/entrypoint.sh te..."    42 seconds ago    Up 42 seconds    8092/udp, 8125/udp, 8094/tcp    telegraf
    0bd12f99c1ef    influxdb:latest           "/entrypoint.sh in..."    42 seconds ago    Up 42 seconds    8086/tcp                        influxdb
    68ff10e49913    busybox                   "sh"                      42 seconds ago    Up 42 seconds                                    influxdb-data
    Si vous êtes en local, vous pouvez désormais accéder à Grafana via http://localhost:3000.

Suite du tutoriel ➔

Testé sur
Ubuntu Server 20.04 LTS
Auteur
Edouard WATTECAMPS

4 réflexions au sujet de “Ubuntu 20.04 & 21.04 – Outils de monitoring avec Telegraf, InfluxDB et Grafana”

Laisser un commentaire