• en: Monitoring - Storing Prometheus metrics in the INFLUXDB engine ()
  • blog-image

    Monitoring - Stocker les métriques Prometheus dans le moteur INFLUXDB

    • dHENRY
    • 16/01/2020
    • (Durée de lecture : 9 mn)

    Comme indiqué dans la documentation Prometheus :

    (**) Traduit par www.DeepL.com/Translator
    [..]
    Notez qu'une limitation du stockage local est qu'il n'est pas en "cluster" ou répliqué.  
    Ainsi, il n'est pas arbitrairement  extensible ou durable face aux pannes de disque ou de noeud et devrait être traité  
    comme vous le feriez pour n'importe quel autre  type de base de données à noeud unique. L'utilisation du RAID pour la  
    disponibilité des disques, les instantanés pour les  sauvegardes, la planification de la capacité, etc. est recommandée pour  
    améliorer la durabilité. Avec une durabilité de stockage  appropriée et une planification, il est possible de stocker des années de données dans le stockage local. 
    
    Il est également possible d'utiliser un stockage externe via les API de lecture/écriture à distance.  
    Une évaluation minutieuse est nécessaire pour ces systèmes car ils varient grandement en termes de durabilité, de performances et  
    d'efficacité. 
    [..]
    

    (Source)

    Comprenez que le système de stockage n’est pas extensible comme le peut un système de base de données. Prometheus supporte plusieurs moteurs de base de données. J’ai essayé Postgres, peu concluant sur des unités de type Raspberry Pi ou Rock64 (manque de performances évidentes). Tandis que le moteur InfluxDB fait le travail à merveille.

    Cet article explique comment installer le système InfluxDB sur Rock64, comment coupler Prometheus avec Influxdb et comment vérifier le bon fonctionnement. Cette procédure devrait aussi fonctionner sur un Raspberry PI4 et facilement être adaptée à d’autres plateformes supportées par InfluxDB. InfluxDB n’est pas prévu pour fonctionner sur Raspberry PI3.

    Notez bien : Grafana ne nécessite aucune modifications

    Installation du service InfluxDB

    Sur le futur serveur InfluxDB (Rock64 ou Raspberry PI4), copier le contenu qui suit dans le fichier /tmp/installinflux.sh. Ce shell installe la version 1.7.9 de moteur InfluxDB :

    #!/bin/bash
    ######################################################################
    ## Built with mytinydc-automation process - https://www.mytinydc.com
    ######################################################################
    export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE="DontWarn"
    export DEBIAN_FRONTEND="noninteractive"
    
    apt-get update
    apt-get -y install curl net-tools
    ########################################################
    UserExec=influxdb
    LINK="https://dl.influxdata.com/influxdb/releases/influxdb-1.7.9_linux_armhf.tar.gz"
    SERVICEFILE="/etc/systemd/system/influxdb.service"
    INFLUXDBDIR="/var/lib/influxdb"
    INFLUXDBFILESLISTINSTALLED="/tmp/influxdbfileslistinstalled"
    
    
    SERVER="`uname -n`"
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Commande] SERVER=`uname -n`" >&2
        exit $ERR
    fi
    
    ARCH="`uname -m`"
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] ARCH=`uname -m`" >&2
        exit $ERR
    fi
    
    if [ -f "/usr/bin/influxd" ];then
        echo "[ERR] Une installation existe deja "
        exit 1
    fi
    
    cd /tmp
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] cd /tmp" >&2
        exit $ERR
    fi
    
    curl "$LINK" | tar xvfz -
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] curl $LINK | tar xvfz -" >&2
        exit $ERR
    fi
    
    cd influxdb-1.7.9*
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] cd influxdb-1.7.9*" >&2
        exit $ERR
    fi
    # Map list files
    find  . > $INFLUXDBFILESLISTINSTALLED
    cat $INFLUXDBFILESLISTINSTALLED
    echo "-----"
    echo ""
    echo "[INFO] Ci-avant, la liste des fichiers installes sur votre systeme"
    echo "       Conserver une copie de cette liste"
    echo "       pour permettre une suppression de ce service"
    echo "       Cette liste est aussi disponible dans le fichier : "
    echo "       $INFLUXDBFILESLISTINSTALLED"
    echo "-----"
    
    cp -rp * /.
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] cp -rp service /." >&2
        exit $ERR
    fi
    
    ISGROUPEXISTS=`getent group $UserExec` #DONTCATCH
    if [ "$ISGROUPEXISTS" = "" ];then
        addgroup $UserExec
        ERR=$?
        if [ "$ERR" != "0" ];then
            echo "[Code Erreur] $ERR" >&2
            echo "[Serveur] $SERVER" >&2
            echo "[Commande] addgroup $UserExec" >&2
            exit $ERR
        fi
    fi
    
    ISUSEREXISTS=`getent passwd $UserExec` #DONTCATCH
    if [ "$ISUSEREXISTS" = "" ];then
        adduser --system --home /var/lib/infludb --no-create-home --disabled-password  --shell /bin/nologin --ingroup $UserExec $UserExec
        ERR=$?
        if [ "$ERR" != "0" ];then
            echo "[Code Erreur] $ERR" >&2
            echo "[Serveur] $SERVER" >&2
            echo "[Commande] adduser --system --home /var/lib/infludb --no-create-home --disabled-password --shell /bin/nologin --ingroup $UserExec $UserExec" >&2
            exit $ERR
        fi
    fi
    
    # InfluxDB data directory Debian compliance
    mkdir -p $INFLUXDBDIR
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] mkdir -p $INFLUXDBDIR" >&2
        exit $ERR
    fi
    # permissions
    chown -R $UserExec:$UserExec $INFLUXDBDIR
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] chown -R $UserExec:$UserExec /var/lib/influxdb" >&2
        exit $ERR
    fi
    chmod 750 /var/lib/influxdb
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] chmod 750 /var/lib/influxdb" >&2
        exit $ERR
    fi
    
    # Nettoyage
    rm -rf /tmp/influxdb-1.7.9*
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] rm -f /tmp/influxdb-1.7.9*" >&2
        exit $ERR
    fi
    
    ## Service File
    cat << 'EOT' > $SERVICEFILE
    [Unit]
    Description=InfluxDB service - #ARCH#
    After=network.target syslog.target
    
    [Service]
    User=influxdb
    Group=influxdb
    Type=simple
    ExecStart=/usr/bin/influxd  -config /etc/influxdb/influxdb.conf
    Restart=on-failure
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=influxdb
    
    [Install]
    WantedBy=multi-user.target
    EOT
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] creation du fichier service $SERVICEFILE" >&2
        exit $ERR
    fi
    
    
    # permission service file
    chmod 644 $SERVICEFILE
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] chmod 644 $SERVICEFILE" >&2
        exit $ERR
    fi
    
    # Replace #ARCH# fichier service
    sed -i "s/#ARCH#/$ARCH/" $SERVICEFILE
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] sed -i "s/#ARCH#/$ARCH/" $SERVICEFILE" >&2
        exit $ERR
    fi
    
    
    systemctl daemon-reload
    ERR=$?
    if [ "$ERR" != "0" ];then
        echo "[Code Erreur] $ERR" >&2
        echo "[Serveur] $SERVER" >&2
        echo "[Commande] systemctl daemon-reload" >&2
        exit $ERR
    fi
    
    echo "[OK] Installation terminee"
    

    Rendre ce shell exécutable :

    chmod 755 installinflux.sh
    

    Exécutez l’installation :

    ./installinflux.sh
    

    Modification de la configuration influxDB

    L’adresse IP de mon serveur est 172.21.0.11

    vi /etc/influxdb/influxdb.conf

    # Ne pas envoyer la télémétrie ajoutez cette ligne
    reporting-disabled = true
    
    # Chemin des donnéees
    [meta]
      # Where the metadata/raft database is stored
      dir = "/var/lib/influxdb/meta"
    [data]
      # The directory where the TSM storage engine stores TSM files.
      dir = "/var/lib/influxdb/data"
    
      # The directory where the TSM storage engine stores WAL files.
      wal-dir = "/var/lib/influxdb/wal"
    
    [http]
      # Adresse d'écoute indiquer l'adresse IP de serveur sur le réseau
      bind-address = "172.21.0.11:8086"
      
      # Desactiver les logs http
      log-enabled = false
      write-tracing = false
    
    [logging]
      # Log uniquement les erreurs 
      level = "error"
    
    [continuous_queries]
      # Desactiver les logs
      log-enabled = false
    
    

    Démarrage du service InfluxDB

    systemctl start influxdb
    

    Vérification fonctionnement du service

    # Service démarré ?
    systemctl status influxdb
    
    # Réponse type : 
    ● influxdb.service - InfluxDB service - armhf
       Loaded: loaded (/etc/systemd/system/influxdb.service; disabled; vendor preset: enabled)
       Active: active (running) since Sat 2020-01-18 10:32:29 CET; 4s ago
     Main PID: 8394 (influxd)
        Tasks: 6 (limit: 1150)
       Memory: 22.6M
       CGroup: /system.slice/influxdb.service
               └─8394 /usr/bin/influxd -config /etc/influxdb/influxdb.conf
    
    

    Vérification écoute sur les ports 8086 et 8088

    L’adresse IP de mon serveur est 172.21.0.11, le port 8086 est en écoute sur l’interface connéctée au réseau, pour être joignable par le serveur Prometheus, le port “8088” est en écoute sur localhost uniquement.

    netstat -ant|grep -E "8088|8086"
    
    # Réponse type 
    tcp        0      0 172.21.0.11:8086         0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:8088          0.0.0.0:*               LISTEN     
    
    

    Création de la base prometheus

    Sur le serveur InfluxDB

    $ influx -precision rfc3339
    Connected to http://localhost:8086 version 1.7.x
    InfluxDB shell 1.7.x
    >
    

    tapez

    CREATE DATABASE "prometheus"
    exit
    

    Firewall

    • Sur le serveur InfluxDB :
    Port  sens Etat Source
    8086  Input Ouvert Serveur prometheus
    • Sur le serveur Prometheus :
    Port  sens Etat Destination
    8086 Output Ouvert Serveur InfluxDB

    Paramétrage du serveur Prometheus

    modifier le fichier de configuration /opt/prometheus/prometheus.yaml en ajoutant après la propriété “global”

    global:
    [..]
    remote_write:
      - url: "http://[Adresse IP ou FQDN serveur InfluxDB]:8086/api/v1/prom/write?db=prometheus"
    
    remote_read:
      - url: "http://[Adresse IP ou FQDN serveur InfluxDB]:8086/api/v1/prom/read?db=prometheus"
    [..]
    

    Exemple pour le serveur InfluxDB avec le FQDN “infludb.mtdc”

    global:
    [..]
    remote_write:
      - url: "http://infludb.mtdc:8086/api/v1/prom/write?db=prometheus"
    
    remote_read:
      - url: "http://infludb.mtdc:8086/api/v1/prom/read?db=prometheus"
    [..]
    

    Exemple pour le serveur InfluxDB avec l’adresse IP “172.21.0.11”

    global:
    [..]
        remote_write:
        - url: "http://172.21.0.11:8086/api/v1/prom/write?db=prometheus"
    
        remote_read:
        - url: "http://172.21.0.11:8086/api/v1/prom/read?db=prometheus"
    [..]
    

    Démarrage de l’affichage des logs de démarrage Prometheus en arrière plan :

    tail -f /var/log/syslog &
    

    Redémarrage du service Prometheus

    systemctl restart prometheus
    

    Prometheus injecte les données dans le moteur InfluxDB :

    Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b14d2df-0345-11ea-818f-b827eb69fd03 29699
    Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b1a8954-0345-11ea-8190-b827eb69fd03 26346
    Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b1fbeb1-0345-11ea-8191-b827eb69fd03 25807
    Nov 10 00:05:00 raspi4 influxdb[10898]: [httpd] 127.0.0.1 - username [10/Nov/2019:00:05:00 +0100] "POST /api/v1/prom/write?db=prometheus&p=%5BREDACTED%5D&u=username HTTP/1.1" 204 0 "-" "Prometheus/2.6.0" 5b24cd98-0345-11ea-8192-b827eb69fd03 29254
    

    Arrêtez la visualisation des logs :

    fg
    CTRL+C
    

    Laisser tourner 3 heures en vérifiant vos dashboard Grafana.

    Vérification du bon fonctionnement

    Pour vérifier, ouvrez un Dashboard Grafana, avec les données des 3 dernières heures.

    # Arret du service prometheus
    systemctl stop prometheus
    cd /opt/prometheus/
    # Copie du répertoire data vers data.old
    cp -rp data data.old
    # Suppression des données situées dans le répertoire **data**
    rm -rf data/*
    systemctl start prometheus
    

    Vérifiez que votre tableau de bord Grafana affiche bien les données des 3 dernières heures.
    Les données Prometheus n’étant plus accessibles, ce sont donc les données InfluxDB qui alimentent les tableaux de bord Grafana. Vous pouvez supprimer le répertoire /opt/prometheus/data.old

    Sauvegarde des données InfluxDB

    Ajouter un fichier d’ordonnancement : /etc/cron.d/backup-influxDB

    #INFLUXDB à 23h tous les jours dans le répertoire /var/lib/backup-influxdb/
    0 23 * * * root /usr/bin/influxd backup -portable -database prometheus /var/lib/backup-influxdb/
    # Nettoyage des backups influxDB à 1h tous les jours
    0 1 * * * root /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh
    

    Créer le répertoire /var/lib/backup-influxdb/

    mkdir /var/lib/backup-influxdb/
    

    Créer le fichier /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh

    mkdir -p /opt/mytinydc/sbin/
    
    # Créer le fichier /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh avec ce contenu : 
    #!/bin/bash
    DIRBACKUP=/var/lib/backup-influxdb/
    NBRJOURRETENTION=5
    
    ## Functions
    
    function end_success {
    echo ""
    echo "*****************************************************************"
    echo " Traitement terminé avec succès"
    echo "*****************************************************************"
    exit 0
    }
    
    function end_unsuccess {
    echo ""
    echo "*****************************************************************"
    echo " Une erreur s'est produite : $ERR"
    echo "*****************************************************************"
    }
    
    # Suppression des backup de + de $NBREJOURRETENTION
    echo "*****************************************************************"
    echo "   Traitement de nuit - Influxdb - Nettoyage des sauvegardes"
    echo "*****************************************************************"
    echo " Parametres :"
    echo "         - Répertoire : $DIRBACKUP"
    echo "         - Nbre de jours (retention) : $NBRJOURRETENTION"
    echo ""
    echo " Liste des fichiers qui vont être supprimés : "
    FILES=`find $DIRBACKUP -type f -mtime +$NBRJOURRETENTION`
    if [ "$FILES" = "" ];then
    echo "      Aucun"
    end_success
    else
    for F in $FILES
    do
    echo "    * $F"
    done
    fi
    echo ""
    find $DIRBACKUP -type f -mtime +$NBRJOURRETENTION -exec /bin/rm -f {} \;
    ERR=$?
    if [ "$ERR" = "0" ];then
    end_success
    else
    end_unsuccess
    exit $ERR
    fi
    

    Rendre ce fichier exécutable :

    chmod 755 /opt/mytinydc/sbin/backup-influxdb-nettoyage.sh
    

    L’utilisateur “root” recevra deux emails tous les jours, mentionnant le déroulement de ces opérations.

    Liens interressants

    Licence de ce document : Creative Commons (CC BY-NC-ND 4.0)

    CETTE DOCUMENTATION EST LIVRÉE “EN L’ÉTAT”, SANS GARANTIE D’AUCUNE SORTE ET DISTRIBUÉE DANS UN BUT ÉDUCATIF EXCLUSIVEMENT. L’AUTEUR, CONTRIBUTEURS DE CETTE DOCUMENTATION OU ©MYTINYDC.COM NE SAURAIENT EN AUCUN CAS ÊTRE TENUS RESPONSABLES DES DOMMAGES DIRECTS OU INDIRECTS POUVANT RÉSULTER DE L’APPLICATION DES PROCÉDURES MISES EN ŒUVRE DANS CETTE DOCUMENTATION, OU DE LA MAUVAISE INTERPRÉTATION DE CE DOCUMENT.

    Poster un commentaire

    Désolé, la réponse à la question Captcha est incorrecte
    Merci. le message est dans le tuyau :)
    Désolé, il y a un problème dans le tuyau, veuillez réessayer plus tard :(
    Un champs est invalide

    Commentaires (non traduits)

    Pas de commentaires