Supervision avec Telegraf
2020-04-15T19:24:36+02:00 | 9 minutes de lecture | Mise à jour le 2021-02-10T20:00:36+02:00
Dans le but de moderniser mon système de supervision, j’ai installé Telegraf afin de l’associer à InfluxDB et Grafana.
Introduction
Ayant déjà le couple InfluxDB et Grafana sur mon serveur,
je collectais déjà les données avec Nagios.
Le problème est que cela est un peu lourd et que le polling n’est pas trop efficace.
En effet, un polling toutes les 5 minutes ne donne pas trop d’information
et du coup certaines informations ne sont pas représentatives de l’état réel.
Voyez l’exemple de la bande passante du port Ethernet de mon serveur sur la même période :
Avec Telegraf, c’est l’hôte qui envoie ces données et non le serveur (de supervision) qui lui demande. Les données de Telegraf sont alors transmissent toutes les 10 secondes !
Nous allons donc ici voir comment j’ai mis en place Telegraf au sein d’InfluxDB et
comment j’ai créé les graphes sous Grafana.
Vous verrez sur Internet que l’on parle souvent de ces trois-là sous l’acronyme TIG.
On verra aussi comment j’ai fait pour récupérer les données d’un serveur distant de manière sécurisé (enfin je crois 🤔).
TIG en local
Installation
Je ne vais pas couvrir l’installation d’InfluxDB et Grafana car je l’ai fait sur un autre tutoriel. Je remets tous de même les commandes d’installation ici.
sudo apt update && sudo apt install apt-transport-https
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
curl https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt update
sudo apt install influxdb grafana telegraf
Telegraf est dans le dépôt “influxdata”.
À ce niveau, Telegraf devrait déjà être actif (sudo systemctl status telegraf
)
et ajouté au lancement au démarrage (sudo systemctl list-unit-files --state=enabled
).
Configuration
InfluxDB
Telegraf devrait déjà avoir créé sa base et commencé à transmettre ces données basiques. On peut vérifier cela au sein d’InfluxDB :
$ influx
Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
> SHOW databases
nagflux
home_assistant
telegraf
> exit
[!NOTE] Pour les extraits de terminal de ce type (avec entrées et sorties de commandes), les commandes bash sont précédées d’un $ et celle d’influx par un >.
Pour mettre cela en évidence, je ne mets pas de colorisation syntaxique sur ces blocs.
On voit donc bien qu’une TSDB
telegraf
a été créé.
Il n’y a donc rien à faire.
Telegraf
Les données transmises par défaut sont presque suffisantes pour moi (pour l’instant). Il manque seulement les données de l’interface Ethernet ainsi que les statistiques réseau.
Pour la configuration, on peut éditer le fichier /etc/telegraf/telegraf.conf
mais ce dernier sera remis à l’origine à chaque mise à jour de Telegraf…
Par défaut, Telegraf prend aussi en compte les fichiers du
dossier /etc/telegraf/telegraf.d
.
Vous pouvez vérifier cela avec un ps -ef | grep telegraf
.
J’ai donc décidé de créer un fichier par service monitoré,
vous trouverez donc ci-dessous mes ajouts.
Fichier /etc/telegraf/telegraf.d/inputs.net.conf
:
[[inputs.net]]
interfaces = ["enp1s0"]
fieldpass = [ "bytes*" ]
Fichier /etc/telegraf/telegraf.d/inputs.netstat.conf
:
[[inputs.netstat]]
Ainsi on relance Telegraf avec un sudo systemctl restart telegraf
.
Grafana
On intègre donc la nouvelle base telegraf
dans les Data Sources
(“Configuration (⚙️)” > “Data Sources” > “Add data source”) :
Pour l’ajout d’un dashboard , j’ai tous de suite pensé que les graphes que je voulais obtenir
devraient-être assez commun. J’ai donc cherché au sein des
dashboards de la communauté
et je ne me suis pas trompé.
J’ai trouvé le dashboard
Linux System Overview-adv que j’ai
importé dans Grafana.
Pour que cela fonctionne bien chez moi, j’ai dû éditer la valeur de Server en mettant en dur les noms d’hôte de mes serveurs.
Le résultat est plutôt pas mal :
Telegraf sur hôte distant
Problématique
Le serveur étant dans mon LAN et le port n’étant pas exposé sur ma Box, je n’avais pas mis de sécurité particulière sur InfluxDB. J’ai tous de même Grafana qui fonctionne en HTTPS. Maintenant que je veux pouvoir récupérer les données de mon serveur (celui sur lequel vous consultez cet article 😎).
Passer InfluxDB en SSL va casser toutes les choses pour lequel je l’utilise déjà
(Home Assisstant & Nagios)… Étant donné que le trafic passe via des requêtes HTTP,
Je me suis dit que ça pourrait fonctionner derrière un reverse-proxy.
Effectivement, cela fonctionne et c’est ce que l’on va voir juste après.
Mais ce n’est pas tout, de cette manière n’importe qui peut envoyer des données
sur mon serveur ! Il faut donc que j’authentifie cela. Je vais donc ajouter
une authentification basique pour cet hôte virtuel que je vais créer sous Apache.
Partie serveur TIG
Authentification basique
Pour pouvoir créer le fichier .htpasswd
, il faut le paquet apache2-utils
qu’on installe donc avec sudo apt install apache2-utils
.
La commande suivante créera le fichier (avec l’option -c
) avec une entrée pour
l’utilisateur “sadara”.
sudo htpasswd -c /etc/apache2/.htpasswd sadara
Le prompt demande ensuite d’entrer le mot de passe (“admin123456” pour cet exemple).
Le contenue du fichier est donc le suivant :
sadara:$apr1$hr0a694t$ReQUIxnflLAgQgr2u5oyH1
On peut vérifier le mot de passe avec la commande :
htpasswd -vb /etc/apache2/.htpasswd sadara admin123456
Maintenant que notre fichier est créé, on va pouvoir l’utiliser dans la configuration du reverse-proxy.
Configuration du Reverse-Proxy
On continue sur le serveur où TIG est installé.
J’ai donc créé un nouveau fichier de configuration
(vi /etc/apache2/sites-available/influxdb.conf
)
avec le contenu suivant :
<VirtualHost *:8585>
ServerName namek.scrample.xyz
ServerAdmin webmaster@scrample.xyz
ErrorLog ${APACHE_LOG_DIR}/influxdb-error.log
CustomLog ${APACHE_LOG_DIR}/influxdb-access.log combined
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/namek.scrample.xyz/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/namek.scrample.xyz/privkey.pem
<Proxy *>
Order deny,allow
Allow from all
Authtype Basic
Authname "Password Required"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Proxy>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8086/
ProxyPassReverse / http://127.0.0.1:8086/
RedirectMatch ^/$ https://127.0.0.1:8086/
RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Le trafic en HTTPS se fera donc via le port 8585. On ajoutera donc une règle de NAT pour que le trafic arrive sur mon serveur.
On ajoute ensuite le port “8585” dans le fichier /etc/apache2/ports.conf
dans la section SSL.
<IfModule ssl_module>
Listen 443
Listen 8585
</IfModule>
On active donc la configuration et on relance Apache :
sudo a2ensite influxdb.conf
sudo systemctl reload apache2
On va tester cela sur le serveur (hôte) distant avant l’installation de Telegraf.
Partie hôte distant
Test du Reverse-Proxy
On teste donc notre accès depuis l’extérieur depuis le serveur (hôte) distant avec une commande cURL :
curl --user sadara:admin123456 -G "https://namek.scrample.xyz:8585/query?pretty=true" --data-urlencode "q=show databases"
Le résultat est le suivant :
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "databases",
"columns": [
"name"
],
"values": [
[
"_internal"
],
[
"nagflux"
],
[
"home_assistant"
],
[
"telegraf"
]
]
}
]
}
]
}
L’accès est bien fonctionnel. Tester aussi avec un mauvais mot de passe ou aucun identifiant, vous devriez obtenir une erreur 401.
Installation
On installe encore Telegraf, mais cette fois-ci sur l’hôte que l’on veut superviser.
sudo apt update && sudo apt install apt-transport-https
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt update
sudo apt install telegraf
Configuration
Voici donc l’extrait de mes configurations :
Fichier /etc/telegraf/telegraf.conf/outputs.influxdb.conf
:
[[outputs.influxdb]]
urls = ["https://namek.scrample.xyz:8585"]
database = "telegraf"
username = "sadara"
password = "admin123456"
Fichier /etc/telegraf/telegraf.conf/inputs.net.conf
:
[[inputs.net]]
interfaces = ["ens3"]
fieldpass = [ "bytes*" ]
Fichier /etc/telegraf/telegraf.conf/inputs.netstat.conf
:
[[inputs.netstat]]
En plus de ces modifications, j’ai dû commenter la section [[outputs.influxdb]]
du fichier de configuration principal car, avec cette entrée, Telegraf essaye
d’envoyer ces données localement et ça pourrit mes logs…
Je devrais alors refaire cette opération à chaque MAJ de Telegraf…
Le problème est d’ailleurs connu.
Vérification
Après avoir redémarré Telegraf, j’ai fait un tcpdump
afin de vérifier deux choses :
- Que les informations sont bien transmises
- Que le trafic est bel et bien chiffré
J’ai donc fait une capture (sudo tcpdump -i ens3 port 8585 -w aaa.pcap -c 100
)
que j’ai récupérée sur mon poste pour l’ouvrir avec Wireshark.
Le trafic est bel et bien chiffré.
En sélectionnant le serveur dans le dashboard Grafana, je vois bien apparaitre les données ! 🍻
J’ai aussi modifié la valeur de la variable $nio
du dashboard pour qu’elle s’adapte automatiquement avec celle du serveur choisi.
Pour cela, j’ai remplacé la requête par la suivante :
SHOW TAG VALUES WITH KEY = "interface" WHERE "host" =~ /^$Server$/
Compléments
Pour récolter les données de Docker, il faut que l’utilisateur “telegraf” puisse avoir accès au socket docker. Pour cela, il faut l’ajouter au groupe “docker” :
sudo usermod -aG docker telegraf
sudo systemctl restart docker
J’utilise le dashbord 10585 et voici mon fichier de configuration associé :
Fichier /etc/telegraf/telegraf.d/inputs.docker.conf
:
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
gather_services = false
source_tag = false
container_state_include = []
container_state_exclude = []
timeout = "5s"
perdevice = true
total = false
docker_label_include = []
docker_label_exclude = []
Bonus : Telegraf sur Windows
J’ai aussi ajouté les métriques de mon PC Windows et ceux de ma carte graphique Nvidia (GTX 1070).
J’ai installé Telegraf via Chocolatey :
choco install telegraf -y
Une fois installé on édite la configuration situé
normalement ici : C:\Program Files\telegraf\telegraf.conf
Voici ma configuration :
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
hostname = "MonPC"
omit_hostname = false
[[outputs.influxdb]]
urls = ["https://namek.scrample.xyz:8585"]
database = "telegraf"
skip_database_creation = true
username = "monpc"
password = "dansleplacardsouslescalier"
[[inputs.win_perf_counters]]
[[inputs.win_perf_counters.object]]
ObjectName = "Processor"
Instances = ["*"]
Counters = [
"% Idle Time",
"% Interrupt Time",
"% Privileged Time",
"% User Time",
"% Processor Time",
"% DPC Time",
]
Measurement = "win_cpu"
IncludeTotal=true
[[inputs.win_perf_counters.object]]
ObjectName = "LogicalDisk"
Instances = ["*"]
Counters = [
"% Idle Time",
"% Disk Time",
"% Disk Read Time",
"% Disk Write Time",
"Current Disk Queue Length",
"% Free Space",
"Free Megabytes",
]
Measurement = "win_disk"
[[inputs.win_perf_counters.object]]
ObjectName = "PhysicalDisk"
Instances = ["*"]
Counters = [
"Disk Read Bytes/sec",
"Disk Write Bytes/sec",
"Current Disk Queue Length",
"Disk Reads/sec",
"Disk Writes/sec",
"% Disk Time",
"% Disk Read Time",
"% Disk Write Time",
]
Measurement = "win_diskio"
[[inputs.win_perf_counters.object]]
ObjectName = "Network Interface"
Instances = ["*"]
Counters = [
"Bytes Received/sec",
"Bytes Sent/sec",
"Packets Received/sec",
"Packets Sent/sec",
"Packets Received Discarded",
"Packets Outbound Discarded",
"Packets Received Errors",
"Packets Outbound Errors",
]
Measurement = "win_net"
[[inputs.win_perf_counters.object]]
ObjectName = "System"
Counters = [
"Context Switches/sec",
"System Calls/sec",
"Processor Queue Length",
"System Up Time",
]
Instances = ["------"]
Measurement = "win_system"
[[inputs.win_perf_counters.object]]
ObjectName = "Memory"
Counters = [
"Available Bytes",
"Cache Faults/sec",
"Demand Zero Faults/sec",
"Page Faults/sec",
"Pages/sec",
"Transition Faults/sec",
"Pool Nonpaged Bytes",
"Pool Paged Bytes",
"Standby Cache Reserve Bytes",
"Standby Cache Normal Priority Bytes",
"Standby Cache Core Bytes",
]
Instances = ["------"]
Measurement = "win_mem"
[[inputs.win_perf_counters.object]]
ObjectName = "Paging File"
Counters = [
"% Usage",
]
Instances = ["_Total"]
Measurement = "win_swap"
[[inputs.win_perf_counters.object]]
ObjectName = "Network Interface"
Instances = ["*"]
Counters = [
"Bytes Sent/sec",
"Bytes Received/sec",
"Packets Sent/sec",
"Packets Received/sec",
"Packets Received Discarded",
"Packets Received Errors",
"Packets Outbound Discarded",
"Packets Outbound Errors",
]
[[inputs.nvidia_smi]]
bin_path = "C:\\Program Files\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe"
timeout = "5s"
Une fois la configuration enregistré, on relance le service en PowerShell :
Get-Service telegraf | Restart-Service
On peut consulté le status avec :
Get-Service telegraf
Et s’assurer qu’il sera bien lancé au démarrage de la machine :
Get-Service telegraf | select -property name,starttype
Pour l’instant, j’utilise le Dashbord 12225.
Conclusion
On remarque donc que TIG est en fait assez simple à mettre en place. Je suis plutôt satisfait du résultat.
Je vais donc voir pour obtenir de nouvelles métriques en étudiant la configuration (qui est assez bien commentée) ainsi que la liste des plugins disponibles sur le GitHub d’InfluxData.