Présentation Telegraf
Parmi les différentes présentations et ateliers que j'ai animés dans mon entreprise, les deux heures consacrées à Telegraf ont fait naître quelques vocations, ou du moins quelques bonnes pratiques en matière de collecte de données.
Ci-dessous les slides PowerPoint (oui, je sais...) projetés lors de la présentation.
Atelier Telegraf
Avant l'heure, c'est poller.
Comment faire un affreux poller vite et bien
« Dis donc, j’aurais besoin de savoir si super_server a accès au net 24h/24, tu peux me faire ça ? Prends ton temps, c’est pas pressé, si tu peux me le faire pour hier c’est parfait. »
« Ok… »
ssh super_server
mysql
CREATE DATABASE IF NOT EXISTS affreuse_base;
CREATE TABLE IF NOT EXISTS affreuse_base.affreuse_table (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
sent TINYINT UNSIGNED NOT NULL,
received TINYINT UNSIGNED NOT NULL,
stamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP);
nano affreux_poller.sh
ping -c 3 8.8.8.8 | grep transmitted | awk '{ print "insert into affreuse_base.affreuse_table (sent, received) values ("$1","$4")" }' | mysql
crontab -eComment faire évoluer un affreux poller vite et bien
« C’est bien mais j’ai quand même besoin d’en savoir un peu plus sur l’accès, tu peux ajouter les temps de réponse aux stats ? Je les ai promises à Jean-Hub pour la semaine dernière, merci. »
« Mais c’était pas… Ok… »
CREATE TABLE IF NOT EXISTS affreuse_base.affreuse_table_v2 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
sent TINYINT UNSIGNED NOT NULL,
received TINYINT UNSIGNED NOT NULL,
min DECIMAL(5,3) UNSIGNED NOT NULL,
avg DECIMAL(5,3) UNSIGNED NOT NULL,
max DECIMAL(5,3) UNSIGNED NOT NULL,
dev DECIMAL(5,3) UNSIGNED NOT NULL,
stamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP);
nano affreux_poller_v2.sh
ping -c 3 8.8.8.8 > affreux_ping.tmp
values=$( cat affreux_ping.tmp | grep transmitted | awk '{ print $1","$4 }' )
values="${values},$( cat affreux_ping.tmp | grep 'rtt min' | awk '{ print $4 }' | sed 's@/@,@g' )"
mysql -e "INSERT INTO affreuse_base.affreuse_table_v2 (sent, received, min, avg, max, dev) values ($values)"
crontab -e
Comment abandonner un affreux poller vite et bien … et définitivement
« Super tes stats, il me faudrait les mêmes sur une dizaine de serveurs sur le net, mais pas des chiffres hein, des graphes, parce que les chiffres c’est so last week. Fais vite hein, je dois les présenter au Comex à 14h30, ça te laisse… Attends voir… Ouais, 17 minutes. Allez champion, je compte sur toi ! »
C'est quoi, un bon poller ?
- Évolutif : doit être capable de récupérer de nouvelles valeurs, de différentes manières
- Adaptatif : doit être capable de fournir ses relevés sous différents formats
- Stable : démarre, s’exécute et s’arrête exactement quand on le lui demande
- Facile à maintenir : on ne doit pas toucher à son code pour le faire évoluer ou l’adapter à un autre besoin
Comment faire un bon poller vite et bien
« Dis donc, j’aurais besoin de savoir si super_server a accès au net 24h/24, tu peux me faire ça ? Prends ton temps, c’est pas pressé, si tu peux me le faire pour hier c’est parfait. »
« Pas d'souci. »
ssh super_server
nano /etc/telegraf/telegraf.d/bon_poller.conf
[[inputs.ping]]
name_override = "bon_ping"
urls = [ "8.8.8.8" ]
method = "native"
count = 5
ping_interval = 1.0
timeout = 6.0
ipv6 = false
service telegraf reloadComment faire évoluer un bon poller vite et bien
« C’est bien mais j’ai quand même besoin d’en savoir un peu plus sur l’accès, tu peux ajouter les temps de réponse aux stats ? Je les ai promises à Jean-Hub pour la semaine dernière, merci. »
« Déjà fait. »
Mesures ICMP retournées par Telegraf:
packets_transmitted( from ping output )reply_received( increasing only on valid metric from echo replay, eg. 'Destination net unreachable' reply will increment packets_received but not reply_received )packets_received( from ping output )percent_reply_loss( computefrom packets_transmittedandreply_received)percent_packets_loss( compute frompackets_transmittedandpackets_received)errors( when host can not be found or wrong parameters is passed to application )response timeaverage_response_ms( compute fromminimum_response_msandmaximum_response_ms)minimum_response_ms( from ping output )maximum_response_ms( from ping output )result_code:0(success) /1(no such host)
Comment se féliciter d’avoir fait un bon poller vite et bien
« Super tes stats, il me faudrait les mêmes sur une dizaine de serveurs sur le net, mais pas des chiffres hein, des graphes, parce que les chiffres c’est so last week. Fais vite hein, je dois les présenter au Comex à 14h30, ça te laisse… Attends voir… Ouais, 17 minutes. Allez champion, je compte sur toi ! »
« Mouais, s'tu veux. »
ssh super_server
nano /etc/telegraf/telegraf.d/bon_poller.conf
[[inputs.ping]]
name_override = "bon_ping"
urls = [
"www.mozilla.org",
"raspberrypi.org",
"wikipedia.org",
"linux.org",
"debian.org",
"archive.org",
"ietf.org",
"1.1.1.1",
"8.8.8.4",
"9.9.9.9"
]
method = "native"
count = 5
ping_interval = 1.0
timeout = 6.0
ipv6 = false
service telegraf reloadCréation du dashboard Influx v2 ou Grafana.
Composants de Telegraf
- Agent : Telegraf s’exécute habituellement sous forme d’un daemon qui effectue diverses mesures à intervalles réguliers
- Inputs plugins : les modules de relevés
- Outputs plugins : les modules d’exports de relevés
- Processors et aggregators : modules particuliers de traitement basique des relevés
Telegraf : agent
- Orchestrateur des mesures
- Configuration générale
- Paramètres globaux
- Paramètres par défaut des plugins
- Journalisation
Exemple :
[agent]
# Relevé toutes les 10 minutes…
interval = "10m"
# … à un intervalle entier
round_interval = true
# Global : tag du nom d’hôte
hostname = "super_server"Telegraf : inputs
- Plugins nombreux (237) et variés
- Prise en charge native de nombreux services et valeurs notables
- Quelques plugins :
- snmp
- kafka
- http_response
- dns_query
- file
- ping
Exemple :
[[inputs.dns_query]]
# Le nom de la mesure
name_override = "mesures_dns"
# Les DNS à utiliser pour la résolution
servers = [ "8.8.8.8", "9.9.9.9" ]
# On se fie à la résolution d'adresse IP
record_type = "A"
# On n'attend pas plus de 2 secondes
timeout = 2
# Domaines à résoudre
domains = [ "www.mozilla.org",
"www.raspberrypi.org"]Telegraf : inputs utilisateur
- Intégration simple de plugins développés par l’utilisateur
- Deux méthodes pour la prise en charge des plugins utilisateur :
inputs.execpour une commande simpleinputs.execdpour un daemon
Exemple : plugin de génération de deux nombre aléatoires
cat /tmp/mon_plugin.sh
echo "random,source=mon_plugin random1=$( shuf -i 1-100 -n1 ),random2=$( shuf -i 1-100 -n1 )"
cat /tmp/mon_plugin.conf
[[inputs.exec]]
commands = [ "bash /tmp/mon_plugin.sh" ]
timeout = "2s"
data_format = "influx"
telegraf --test --config ./mon_plugin.conf
2022-07-20T10:52:17Z I! Starting Telegraf 1.19.1
> random,host=myhost,source=mon_plugin random1=79,random2=63 1658314337000000000Telegraf : outputs
- Nombreux protocoles d’export (54)
- Excellente intégration avec InfluxDB
- Nombreux formats d’export
- Quelques plugins :
- influxdb
- kafka
- file
- exec
Exemple :
[[outputs.influxdb]]
# Une ou plusieurs bases Influx
urls = [ 'https://idb.prod.lan:8086' ]
# La base, ou bucket
database = "ma_belle_base"
# Identifiants
username = "telegraf"
password = "W0w_WH4T_a_P4ssW0rd!"
# Le certificat SSL est auto-signé
insecure_skip_verify = trueTelegraf : processors
- Renommage de champs
- Modifications de type (tag, champ…)
- Manipulations de chaînes
- Filtrage de mesures
Exemple :
[[processors.enum]]
[[processors.enum.mapping]]
# Modification uniquement des mesures DNS
namepass = [ 'mesures_dns' ]
# En fonction du tag server…
tag = "server"
# … on crée le tag server_name
dest = "server_name"
[processors.enum.mapping.value_mappings]
# Ajout des noms d’hôtes
"9.9.9.9" = "Quad9"
"1.1.1.1" = "Quad1"
Telegraf : aggregators
- Fonctions de base d’agrégation :
- Minimum et maximum de mesures sur une période
- Nombre de mesures sur une période
- Ajout d’un champ de mesure aux métriques collectées
- Peu utilisé
Routage des mesures
- Telegraf est agnostique : tout input peut partir vers n’importe quel processor / aggregator puis vers n’importe quel output
- Un input peut aller vers autant de processor / aggregator puis vers autant de output que souhaité
- Pour router les inputs vers des processor / aggregator et des output bien précis, Telegraf utilise des filtres inclusion / exclusion sur différents critères (tags, noms…)
Exemple :

Telegraf : configuration
- La bonne pratique consiste à scinder les configurations Telegraf
- La configuration principale est dans
/etc/telegraf/telegraf.confet contient a minima la section[agent] - Les outputs peuvent aussi être placés dans la configuration générale
- Les inputs, quant à eux, se trouvent dans des fichiers de configuration différents (un par serveur, ou un par type, par exemple), dans
/etc/telegraf/telegraf.d
Member discussion