5 min read

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

Comment 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 reload

Comment 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 ( compute from packets_transmitted and reply_received )
  • percent_packets_loss ( compute from packets_transmitted and packets_received )
  • errors ( when host can not be found or wrong parameters is passed to application )
  • response time
  • average_response_ms ( compute from minimum_response_ms and maximum_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 reload

Cré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.exec pour une commande simple
    • inputs.execd pour 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 1658314337000000000

Telegraf : 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 = true

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

Routage des mesures

Telegraf : configuration

  • La bonne pratique consiste à scinder les configurations Telegraf
  • La configuration principale est dans /etc/telegraf/telegraf.conf et 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