Monitoring

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

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.).

blank

Grafana sera accessible depuis l’extérieur via Nginx utilisé comme reverse proxy et sera sécurisé grâce à un certificat SSL/TLS délivré par Let’s Encrypt.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 20.04. 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.
  • 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 & Docker Compose

  • Mettez à jour la liste des fichiers disponibles dans vos dépôts APT :

    sudo apt-get update
  • Installez Docker :

    sudo apt-get install -y docker.io
  • Vérifiez que Docker est correctement installé avec la commande docker -v :

    docker -v

    La commande doit retourner la version installée de Docker.

  • Téléchargez Docker Compose avec la commande suivante en modifiant la version si besoin avec la dernière release du repository officiel de Docker :

    sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  • Ajoutez les droits d’exécution sur le binaire de Docker Compose :

    sudo chmod +x /usr/local/bin/docker-compose
  • Vérifiez l’installation de Docker Compose avec la commande docker-compose -v :

    docker-compose -v
    Si l’installation s’est correctement effectuée, cette commande doit vous renvoyer la version de Docker Compose.

3 – 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 guard :

    sudo adduser guard
  • Ajoutez-le au groupe docker :

    sudo adduser guard docker

4 – Création des volumes Telegraf, InfluxDB et Grafana

  • Connectez-vous sous l’utilisateur guard et déplacez-vous dans le répertoire personnel de cet utilisateur :

    su guard
    cd
  • Créez le fichier /home/guard/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
        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
        links:
          - influxdb:influxdb
        tty: true
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /home/guard/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
        privileged: true
    
      grafana:
        image: grafana/grafana:latest
        depends_on:
          - influxdb
        container_name: grafana
        restart: always
        ports:
          - 3000:3000
        links:
          - influxdb:influxdb
        environment:
          GF_INSTALL_PLUGINS: "abhisant-druid-datasource,\
                              alexanderzobnin-zabbix-app,\
                              bosun-app,\
                              bosun-datasource,\
                              briangann-gauge-panel,\
                              digiapulssi-breadcrumb-panel,\
                              fastweb-openfalcon-datasource,\
                              fetzerch-sunandmoon-datasource,\
                              foursquare-clouderamanager-datasource,\
                              grafana-clock-panel,\
                              grafana-influxdb-08-datasource,\
                              grafana-kairosdb-datasource,\
                              grafana-piechart-panel,\
                              grafana-simple-json-datasource,\
                              grafana-worldmap-panel,\
                              gridprotectionalliance-openhistorian-datasource,\
                              gridprotectionalliance-osisoftpi-datasource,\
                              hawkular-datasource,\
                              jdbranham-diagram-panel,\
                              kentik-app,\
                              mtanda-heatmap-epoch-panel,\
                              mtanda-histogram-panel,\
                              ns1-app,\
                              percona-percona-app,\
                              praj-ams-datasource,\
                              rackerlabs-blueflood-datasource,\
                              raintank-snap-app,\
                              raintank-worldping-app,\
                              ryantxu-ajax-panel,\
                              savantly-heatmap-panel,\
                              sileht-gnocchi-datasource,\
                              sraoss-sunburst-panel,\
                              stagemonitor-elasticsearch-app,\
                              udoprog-heroic-datasource,\
                              voxter-app"
          GF_SECURITY_ADMIN_USER: "grafana_user"
          GF_SECURITY_ADMIN_PASSWORD: "grafana_password"
        volumes:
          - grafana-data:/var/lib/grafana
    volumes:
      influxdb-data:
      grafana-data:
    

    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/guard/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.

5 – Reverse proxy avec Nginx

Si vous souhaitez accéder à Grafana de l’extérieur via une URL de type http://grafana.mondomaine.com/ alors un reverse proxy est nécessaire. Le reverse proxy remplit le rôle de passerelle entre l’extérieur (Internet) et le réseau local de votre serveur.

N’oubliez pas de modifier les règles DNS dans l’interface administrateur du fournisseur de votre nom de domaine pour pointer vers l’IP de votre serveur.

Notre choix se portera sur le serveur HTTP Nginx pour une question de performances. Nginx est reconnu pour ses hautes performances, sa stabilité, son ensemble de fonctionnalités, sa configuration simple ainsi que sa faible consommation en ressources.

  • Repassez sous votre super-utilisateur :

    exit
  • Installez le paquet nginx :

    sudo apt-get -y install nginx
  • Modifiez les directives suivantes du fichier de configuration Nginx /etc/nginx/nginx.conf :

    user www-data;
    worker_processes 8;
    pid /run/nginx.pid;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
        worker_connections 768;
        # multi_accept on;                                                                                                                                                                                                                   
    }
    
    http {
    
        ##                                                                                                                                                                                                                                   
        # Basic Settings                                                                                                                                                                                                                     
        ##                                                                                                                                                                                                                                   
    
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;                                                                                                                                                                                                                 
    
        # server_names_hash_bucket_size 64;                                                                                                                                                                                                  
        # server_name_in_redirect off;                                                                                                                                                                                                       
    
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
    ...
    • worker_processes : pour profiter pleinement de la puissance de votre serveur, il est recommandé de mettre autant de worker_processes que de cœurs disponibles sur votre serveur. Pour connaître le nombre de cœurs sur votre serveur, il suffit de lancer la commande :

      grep processor /proc/cpuinfo | wc -l
      8
    • server_tokens : pour des raisons de sécurité, il est recommandé de désactiver l’envoi d’informations telles que le numéro de version de votre Nginx. Pour cela, décommentez cette directive dans le bloc http.
  • Créez le virtual host /etc/nginx/sites-available/grafana et modifiez la ligne en surbrillance en fonction de votre configuration :

    server {
        listen         80;
        listen         [::]:80;
        server_name    grafana.mondomaine.com;
    
        location / {
            proxy_pass http://localhost:3000;
            include    proxy_params;
        }
    }
  • Activez le virtual host :

    sudo ln -s /etc/nginx/sites-available/grafana /etc/nginx/sites-enabled/grafana
  • Rechargez la configuration Nginx :

    sudo systemctl reload nginx.service

    Grafana est désormais accessible via http://grafana.mondomaine.com.

(Facultatif) URL de type http://www.mondomaine.com/grafana

Si l’URL d’accès à votre Grafana n’est pas la racine de votre domaine (http://www.mondomaine.com/grafana par exemple), il est nécessaire de le préciser dans votre fichier docker-compose.yml.

  • Connectez-vous sous l’utilisateur guard et déplacez-vous dans le répertoire personnel de cet utilisateur :

    su guard
    cd
  • Ajoutez la ligne suivante dans votre fichier /home/guard/docker-compose.yml et modifiez l’URL en fonction de votre configuration :

    version: "3"
    services:
      influxdb:
        image: influxdb:latest
        container_name: influxdb
        restart: always
        hostname: influxdb
        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
        links:
          - influxdb:influxdb
        tty: true
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /home/guard/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
        privileged: true
    
      grafana:
        image: grafana/grafana:latest
        depends_on:
          - influxdb
        container_name: grafana
        restart: always
        ports:
          - 3000:3000
        links:
          - influxdb:influxdb
        environment:
          GF_INSTALL_PLUGINS: "abhisant-druid-datasource,\
                              alexanderzobnin-zabbix-app,\
                              bosun-app,\
                              bosun-datasource,\
                              briangann-gauge-panel,\
                              digiapulssi-breadcrumb-panel,\
                              fastweb-openfalcon-datasource,\
                              fetzerch-sunandmoon-datasource,\
                              foursquare-clouderamanager-datasource,\
                              grafana-clock-panel,\
                              grafana-influxdb-08-datasource,\
                              grafana-kairosdb-datasource,\
                              grafana-piechart-panel,\
                              grafana-simple-json-datasource,\
                              grafana-worldmap-panel,\
                              gridprotectionalliance-openhistorian-datasource,\
                              gridprotectionalliance-osisoftpi-datasource,\
                              hawkular-datasource,\
                              jdbranham-diagram-panel,\
                              kentik-app,\
                              mtanda-heatmap-epoch-panel,\
                              mtanda-histogram-panel,\
                              ns1-app,\
                              percona-percona-app,\
                              praj-ams-datasource,\
                              rackerlabs-blueflood-datasource,\
                              raintank-snap-app,\
                              raintank-worldping-app,\
                              ryantxu-ajax-panel,\
                              savantly-heatmap-panel,\
                              sileht-gnocchi-datasource,\
                              sraoss-sunburst-panel,\
                              stagemonitor-elasticsearch-app,\
                              udoprog-heroic-datasource,\
                              voxter-app"
          GF_SECURITY_ADMIN_USER: "grafana_user"
          GF_SECURITY_ADMIN_PASSWORD: "grafana_password"
          GF_SERVER_ROOT_URL: "http://www.mondomaine.com/grafana"
        volumes:
          - grafana-data:/var/lib/grafana
    
    volumes:
      influxdb-data:
      grafana-data:
    
  • Redémarrez les containers :

    docker-compose restart
  • Fermez la session de l’utilisateur guard et revenez sous votre super-utilisateur :

    exit
  • Modifiez les lignes en surbrillance dans votre virtual host (/etc/nginx/sites-available/grafana) :

    server {
        listen         80;
        listen         [::]:80;
        server_name    www.mondomaine.com;
    
        location /grafana/ {
            proxy_pass http://localhost:3000/;
            include    proxy_params;
        }
    }
  • Rechargez la configuration Nginx :

    sudo systemctl reload nginx.service

    Grafana est désormais accessible via http://www.mondomaine.com/grafana.

6 – Sécuriser Grafana avec SSL/TLS

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte. Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. En mai 2018, Let’s Encrypt avait délivré plus de 70 millions de certificats.

6.1 – Installation

Installez les paquets software-properties-common et certbot :

sudo apt-get install -y software-properties-common
sudo apt-get install -y certbot

6.2 – Génération des certificats

Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins apache et nginx entièrement automatisés. Ces plugins mettent à jour automatiquement la configuration des virtual hosts mais le plugin nginx est encore expérimental. Dans cet article, nous recommandons d’utiliser le plugin webroot qui permet de générer et renouveler son certificat sans interrompre le serveur Nginx.

Le plugin webroot crée un fichier temporaire .well-known/acme-challenge dans un dossier spécifique accessible à Nginx, celui-ci permettra aux serveurs de Let’s Encrypt d’appeler ce fichier temporaire et ainsi de valider votre certificat.

  • Créez le répertoire destiné au fichier temporaire de Let’s Encrypt :

    sudo mkdir -p /var/www/letsencrypt
  • Créez le fichier /etc/nginx/snippets/letsencrypt avec les lignes suivantes pour rediriger Let’s Encrypt vers le dossier local précédemment créé :

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root         /var/www/letsencrypt;
    }
    
  • Importez le fichier précédemment créé dans votre virtual host :

    server {
        listen         80;
        listen         [::]:80;
        server_name    grafana.mondomaine.com;
    
        location / {
            proxy_pass http://localhost:3000;
            include    proxy_params;
        }
    
        include        /etc/nginx/snippets/letsencrypt;
    }
  • Recharchez votre configuration Nginx :

    sudo systemctl reload nginx.service
  • Générez votre certificat en remplaçant email@mondomaine.com et grafana.mondomaine.com par vos informations personnelles :

    sudo certbot certonly --webroot -w /var/www/letsencrypt --agree-tos --no-eff-email --email email@mondomaine.com -d grafana.mondomaine.com --rsa-key-size 4096
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for grafana.mondomaine.com
    Using the webroot path /var/www/letsencrypt for all unmatched domains.
    Waiting for verification...
    Cleaning up challenges
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/grafana.mondomaine.com/fullchain.pem. Your cert
       will expire on 20XX-XX-XX. To obtain a new or tweaked version of
       this certificate in the future, simply run certbot again. To
       non-interactively renew *all* of your certificates, run "certbot
       renew"
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le
    

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/grafana.mondomaine.com :

    • cert.pem : le certificat de votre domaine grafana.mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • SSL/TLS utilise un système de chiffrement asymétrique (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS. Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions :

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
    sudo chmod 600 /etc/ssl/certs/dhparam.pem

6.3 – Renouvellement automatique du certificat

Les certificats délivrés par Let’s Encrypt sont valides 90 jours. Une tâche planifiée permettant de renouveler l’ensemble des certificats présents sur votre serveur est fournie avec le paquet certbot. Celle-ci est exécutée deux fois par jour et les renouvelle si et seulement si vos certificats expirent dans un délai inférieur à 30 jours.

  • Testez si le renouvellement automatique est fonctionnel avec la commande suivante :

    sudo certbot renew --dry-run

6.4 – Vhost

  • Modifiez votre virtual host et les lignes en surbrillance en fonction de votre configuration :

    server {
        listen                    80;
        listen                    [::]:80;
        server_name               grafana.mondomaine.com;
        return                    301 https://$server_name$request_uri;
    }
    
    server {
        listen                    443 ssl;
        listen                    [::]:443 ssl;
        server_name               grafana.mondomaine.com;
    
        ssl_certificate           /etc/letsencrypt/live/grafana.mondomaine.com/fullchain.pem;
        ssl_certificate_key       /etc/letsencrypt/live/grafana.mondomaine.com/privkey.pem;
        ssl_trusted_certificate   /etc/letsencrypt/live/grafana.mondomaine.com/chain.pem;
        ssl_dhparam               /etc/ssl/certs/dhparam.pem;
    
        ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers               'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
        ssl_ecdh_curve            secp384r1;
        ssl_session_cache         shared:SSL:1m;
        ssl_session_timeout       1440m;
        ssl_stapling              on;
        ssl_stapling_verify       on;
        ssl_buffer_size           8k;
        add_header                Strict-Transport-Security "max-age=63072000";
        
        location / {
            proxy_pass            http://localhost:3000;
            include               proxy_params;
        }
    
        include                   /etc/nginx/snippets/letsencrypt;
    }
  • Rechargez votre configuration Nginx :

    sudo systemctl reload nginx.service

7 – HTTP2

Je vous conseille vivement d’activer le nouveau protocole HTTP2 qui augmentera la sécurité et la rapidité de votre Grafana.

HTTP2 permet notamment :

  • la compression des headers des requêtes et des réponses réduisant la bande passante lorsque les headers (comme les cookies) sont similaires.
  • le multiplexage des requêtes au serveur consistant à faire passer de multiples informations via un seul tuyau de transmission. Ainsi, on économise les multiples connexions entre le client et le serveur. Les requêtes, quant à elles, sont effectuées simultanément par le navigateur. Les requêtes ne se suivent donc plus les unes derrière les autres (HTTP1) et les plus prioritaires (CSS par exemple) ne sont plus bloquées par les moins prioritaires (images par exemple).
  • le push des ressources du serveur au navigateur. Désormais, le serveur pourra envoyer l’ensemble des ressources référencées dans une même page (CSS, JS…), avant même que le navigateur n’ait analysé celle-ci.

L’activation du protocole HTTP2 est très simple et consiste en l’ajout de la directive http2 dans votre virtual host (/etc/nginx/sites-available/grafana) :

server {
    listen                    80;
    listen                    [::]:80;
    server_name               grafana.mondomaine.com;
    return                    301 https://$server_name$request_uri;
}

server {
    listen                    443 ssl http2;
    listen                    [::]:443 ssl http2;
    server_name               grafana.mondomaine.com;

    [...]

}

Une fois la modification effectuée, n’oubliez pas de recharger votre configuration Nginx :

sudo systemctl reload nginx.service

8 – Configuration

8.1 – Grafana : ajouter la base de données InfluxDB…

Deux possibilités s’offrent à vous pour importer une source de données.

Lors de la première connexion en tant qu’administrateur, cliquez sur Add data source :


1
2
3
4
5
6
7
blank
1

Renseignez le nom de la source de données (purement indicatif)

2

Choisissez le type de données InfluxDB

3

Saisissez l’URL de votre InfluxDB

4

Laissez par défaut le type d’accès Server

5

Renseignez le nom de la base de données

6

Renseignez le nom d’utilisateur et le mot de passe de la base de données

7

Cliquez sur Save & Test


Tapez la commande suivante en remplaçant les lignes en surbrillance par vos informations personnelles :

curl -L -i 
   -H "Accept: application/json" 
   -H "Content-Type: application/json" 
   -X POST -d '{
    "name":"Telegraf via InfluxDB",
    "type":"influxdb",
    "url":"http://influxdb:8086",
    "access":"proxy",
    "basicAuth":false,
    "database":"telegraf",
    "user":"telegraf_user",
    "password":"telegraf_password"}
  ' 
  http://"grafana_user":"grafana_password"@localhost:3000/api/datasources

En cas de succès, vous obtiendrez de Grafana la réponse suivante :

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Mon, 22 Jul 2018 09:36:57 GMT
Content-Length: 441

{"datasource":{"id":2,"orgId":1,"name":"Telegraf via InfluxDB","type":"influxdb","typeLogoUrl":"","access":"proxy","url":"http://influxdb:8086","password":"telegraf_password","user":"telegraf_user","database":"telegraf","basicAuth":false,"basicAuthUser":"","basicAuthPassword":"","withCredentials":false,"isDefault":false,"secureJsonFields":{},"version":1,"readOnly":false},"id":1,"message":"Datasource added","name":"Telegraf via InfluxDB"}

8.2 – Grafana : importer des tableaux de bord

La liste des dashboards Grafana est consultable ici. Veillez à choisir un dashboard acceptant les sources de données de type InfluxDB et les collecteurs de type Telegraf.

Je vous conseille le dashboard 1443 pour afficher les données de votre système et le 1150 pour les données de vos containers Docker.

  1. Copiez l’identifiant du dashboard souhaité dans Home → Import Dashboard :

    1
    blank
    1

    Copiez l’identifiant du dashboard


  2. Sélectionnez la source de données et importez le dashboard :

    1
    2
    blank
    1

    Sélectionnez la source de données Telegraf

    2

    Cliquez sur Import


Libre à vous désormais de modifier ou de créer vos propres dashboards et de configurer vos alertes et vos canaux de diffusions.

8.3 – InfluxDB : définir une politique de rétention

Pour éviter de rapidement saturer votre serveur avec vos métriques, il est possible via InfluxDB de définir une durée de rétention. Toutes les données antérieures à la durée spécifiée seront automatiquement supprimées

La suite est réservée aux membres. Déjà membre ? Se connecter

Accédez à l'intégralité des contenus de HowTo Wared en illimité.

Soutenez la publication de tutoriels et une rédaction indépendante.

Obtenez des réductions (VPN, plugins Nextcloud, Wordpress, ...)


Ubuntu 20.04 ServerDocker 19.03.8
Docker Compose 1.25.5
Nginx 1.17.10
Telegraf 1.7.2
InfluxDB 1.6.0
Grafana 5.2.1



12 réponses
  1. Olivier
    Olivier dit :

    Bonjour,
    Est-ce que vous pouvez me confirmer que Telegraf et InfluxDB sont libre et open-source ? Mais c’est pas très clair sur le site web d’InfluxData, c’est écrit en gros « free for 14 days » …

    Répondre
  2. Olivier
    Olivier dit :

    Bonjour,
    Est-ce que vous savez comment il faut faire pour faire le ménage dans les données stockés par telegraf ? Par exemple si je veux supprimer toutes les données de monitoring qui ont plus de 1 semaine ?

    Répondre
  3. Methy
    Methy dit :

    Merci pour ce super tuto très complet, je voulais me lancer dans le monitoring avec Grafana / Prometheus mais je vais suivre le tien pour mon week end 🙂

    Merci encore

    Répondre
  4. MoHedi
    MoHedi dit :

    Bonjour,

    Lorsque j’arrive à la fin de la 4ème partie, je remarque avec la commande « docker ps -a » dans la colonne « STATUS » que mon conteneur grafana redémarre toutes les 15 secondes environ avec ce message « Restarting (1) Less than a second ago » 🙁
    Je fais tourner ma machine sur Virtualbox et je ne vois pas comment avoir accès à Grafana par interface Web, j’ai essayé http://:3000 et ça ne fonctionne pas 🙁

    Merci pour ton article qui est très détaillé 🙂

    Répondre
    • Edouard WATTECAMPS
      Edouard WATTECAMPS dit :

      Bonjour,

      La dernière version de Grafana n’est plus compatible avec les plugins crate-datasource et grafana-example-plugin. Il faut donc les supprimer du docker-compose.yml et relancer un docker-compose up -d. L’article a été mis à jour.

      Merci

      W.

      Répondre
  5. Sofiane
    Sofiane dit :

    Bonjour,
    Je signale une petite erreur dans le cas ou on utilise /grafana au lieux de grafana.mondomaine.com il faut changer aussi le server_name et ne pas le laisser grafana.mondomaine.com.
    Bonne journee

    Répondre

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *