fr en fr en en fr fr fr fr en fr en oc en en ca sv it fr fr fr fr en fr fr en en fr fr fr en en fr fr fr it sv fr fr fr fr oc en fr fr en fr fr en ca fr fr en fr fr fr fr fr sv fr fr fr pt fr en es en zh fr it fr fr fr fr de fr fr fr fr fr fr fr fr fr fr fr fr fr ja fr fr en fr es fr en fr fr fr en fr fr fr en fr en es fr fr fr fr en en fr fr en fr en fr fr en en fr es fr en pt fr en es en zh fr fr fr fr fr fr fr fr fr fr en en fr fr en it fr it fr en fr fr fr en fr fr fr fr en fr en en fr en sv fr en en fr en fr fr fr pl fr fr en fr
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 🤔).
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.
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).
Telegraf devrait déjà avoir créé sa base et commencé à transmettre ces données basiques. On peut vérifier cela au sein d’InfluxDB :
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.
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.
[[inputs.net]] interfaces = ["enp1s0"] fieldpass = [ "bytes*" ]
Ainsi on relance Telegraf avec un sudo systemctl restart telegraf.
On intègre donc la nouvelle base telegraf dans les Data Sources (“Configuration (⚙️)” > “Data Sources” > “Add data source”) :
Ajout de la source de données
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.
Édition de variable du dashboard
Le résultat est plutôt pas mal :
Telegraf sur hôte distant
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.
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 :
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.
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
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   Order deny,allow Allow from all Authtype Basic Authname "Password Required" AuthUserFile /etc/apache2/.htpasswd Require valid-user   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"
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.
1 2 3 4
Listen 443 Listen 8585
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.
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
{ "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.
On installe encore Telegraf, mais cette fois-ci sur l’hôte que l’on veut superviser.
1 2 3 4 5 6 7 8
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
Voici donc l’extrait de mes configurations :
1 2 3 4 5
[[outputs.influxdb]] urls = ["https://namek.scrample.xyz:8585"] database = "telegraf" username = "sadara" password = "admin123456"
[[inputs.net]] interfaces = ["ens3"] fieldpass = [ "bytes*" ]
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.
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.
extrait de la capture via 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$/
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é :
1 2 3 4 5 6 7 8 9 10 11
[[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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
[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 :
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.
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.