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.