Sommaire

Supervision avec Telegraf

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 :

/supervision-avec-telegraf/img/Screenshot_1.webp
Via Nagios
/supervision-avec-telegraf/img/Screenshot_2.webp
Via Telegraf

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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 :

1
2
3
4
5
6
7
8
$ influx
Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
> SHOW databases
nagflux
home_assistant
telegraf
> exit
Syntaxe
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.

/etc/telegraf/telegraf.d/inputs.net.conf
1
2
3
[[inputs.net]]  
  interfaces = ["enp1s0"]  
  fieldpass = [ "bytes*" ]  
/etc/telegraf/telegraf.d/inputs.netstat.conf
1
[[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”) :

/supervision-avec-telegraf/img/Screenshot_7.webp
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.

/supervision-avec-telegraf/img/Screenshot_3.webp
Import d’un dashboard

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.

/supervision-avec-telegraf/img/Screenshot_4.webp
Édition de variable du dashboard

Le résultat est plutôt pas mal :

/supervision-avec-telegraf/img/Screenshot_5.webp
extrait du dashboard

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 :

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

1
2
3
4
<IfModule ssl_module>
        Listen 443
        Listen 8585
</IfModule>

On active donc la configuration et on relance Apache :

1
2
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 :

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

Installation

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

Configuration

Voici donc l’extrait de mes configurations :

/etc/telegraf/telegraf.conf/outputs.influxdb.conf
1
2
3
4
5
[[outputs.influxdb]]
  urls = ["https://namek.scrample.xyz:8585"]
  database = "telegraf"
  username = "sadara"
  password = "admin123456"
/etc/telegraf/telegraf.conf/inputs.net.conf
1
2
3
[[inputs.net]]  
  interfaces = ["ens3"]  
  fieldpass = [ "bytes*" ]  
/etc/telegraf/telegraf.conf/inputs.netstat.conf
1
[[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.

/supervision-avec-telegraf/img/Screenshot_6.webp
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 :

1
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” :

1
2
sudo usermod -aG docker telegraf
sudo systemctl restart docker

J’utilise le dashbord 10585 et voici mon fichier de configuration associé :

/etc/telegraf/telegraf.d/inputs.docker.conf
 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 :

1
 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 :

1
Get-Service telegraf | Restart-Service

On peut consulté le status avec :

1
Get-Service telegraf

Et s’assurer qu’il sera bien lancé au démarrage de la machine :

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