Articles - Tutos tirés de vidéos

Supervision Grafana, InfluxDB et Télégraf + Raspberry PI en Kiosque

Dernière mise à jour :
Supervision Grafana, InfluxDB et Télégraf + Raspberry PI en Kiosque Bienvenue sur cet article concernant la mise en place d’une supervision Grafana et d’informations complémentaires à ma vidéo. Je vous recommande vivement de la regarder avant pour comprendre le contexte de cet article :


Pour rappel ma supervision s’organise ainsi :


Hôte à superviser Télégraf InfluxDB Grafana
(Physique ou VM) (Collecteur) (Base de données) (Afficheur)


Ou pour le cas de HomeAssistant en utilisant l’intégration InfluxDB :

Entité HA à superviser InfluxDB Grafana


Petit rappel visuel de la vidéo
Petit rappel visuel de la vidéo



Dans l’ordre de la vidéo, et pour exemple, voici mon fichier de configuration Télégraf.


Ficher de conf Télégraf



Pour superviser les interfaces du Fortinet (bien avoir le SNMP d’actif dans le forti ET dans l’interface LAN) :

Code BASH :
[[inputs.snmp]]
  agents = ["udp://<ipLANduforti>:161"]
  version = 2
  community = "public"
  interval = "30s"
  [[inputs.snmp.table]]
    name = "fortigate_interfaces"
    [[inputs.snmp.table.field]]
      name = "ifName"
      oid = "1.3.6.1.2.1.31.1.1.1.1"
      is_tag = true
    [[inputs.snmp.table.field]]
      name = "in_bytes"
      oid = "1.3.6.1.2.1.31.1.1.1.6"
    [[inputs.snmp.table.field]]
      name = "out_bytes"
      oid = "1.3.6.1.2.1.31.1.1.1.10"
    [[inputs.snmp.table.field]]
      name = "status"
      oid = "1.3.6.1.2.1.2.2.1.8"


Pour superviser les VPNs IPSec du Fortinet :

Code BASH :
[[inputs.snmp.table]]
  name = "fortigate_vpn_status"
  [[inputs.snmp.table.field]]
    name = "phase1_name"
    oid = "1.3.6.1.4.1.12356.101.12.2.2.1.2"
    is_tag = true
  [[inputs.snmp.table.field]]
    name = "status"
    oid = "1.3.6.1.4.1.12356.101.12.2.2.1.20"


Pour superviser mon onduleur Eaton (avec carte réseau Network-M2) :

Code BASH :
[[inputs.snmp]]
  agents = ["udp://<ipdelonduleur>:161"]
  version = 2
  community = "public"
  interval = "60s"
  name_override = "eaton_ups"
  [[inputs.snmp.field]]
    name = "battery_status"
    oid = "1.3.6.1.2.1.33.1.2.1.0"
  [[inputs.snmp.field]]
    name = "battery_charge_pct"
    oid = "1.3.6.1.2.1.33.1.2.4.0"
  [[inputs.snmp.field]]
    name = "battery_minutes_remaining"
    oid = "1.3.6.1.2.1.33.1.2.3.0"
  [[inputs.snmp.field]]
    name = "output_source"
    oid = "1.3.6.1.2.1.33.1.4.1.0"
  [[inputs.snmp.field]]
    name = "output_load_pct"
    oid = "1.3.6.1.2.1.33.1.4.4.1.5.1"
  [[inputs.snmp.field]]
    name = "output_power_w"
    oid = "1.3.6.1.2.1.33.1.4.4.1.4.1"



Pour superviser les pools ZFS sur TrueNAS :


Code BASH :
[[inputs.exec]]
  commands = ["/opt/telegraf/scripts/truenas_pool.sh"]
  timeout = "10s"
  interval = "5m"
  data_format = "influx"



Pour superviser les conteneurs Docker (attention avoir les healthchecks activés et activer l’API) :

Code BASH :
[[inputs.docker]]
  endpoint = "tcp://<IpDocker>:2375"
  gather_services = false
  container_state_include = ["running", "created", "exited", "paused"]
  perdevice_include = ["cpu", "network", "blkio"]
  total_include = ["cpu", "network", "blkio"]




Et dans la section « Output plugins » c’est la sortie des données de Télégraf qui les renvoie à InfluxDB :

Code BASH :
[[outputs.influxdb_v2]]
  urls = ["http://<IpetPortInfluxDB>"]
  token = "<TokenInfluxDB>"
  organization = "iMot3k"
  bucket = "homelab"



Fonctionnement des tuiles



Ensuite voici les morceaux de code de mon dashboard tuile par tuile :

Consommation de la baie



Panneau Stat
Calculation Last *
Fields Numeric Fields
Text mode Value and Name
Color mode Background Gradient
Graph mode Area
Unit Watt (W)
Color scheme From threshold (by value)
Thresholds Bleu Base
Threshold Rouge 330
Override Fields with name output_power_w Display name Consommation baie

Code XML :
from(bucket: "homelab")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "eaton_ups")
  |> filter(fn: (r) => r._field == "output_power_w")



Charge onduleur



Panneau Stat
Calculation Last *
Fields Numeric Fields
Text mode Value and name
Color mode Background Gradient
Unit Percent (0-100)
Color scheme From thresholds (by value)
Thresholds Vert Base
Thresholds Jaune 50
Thresholds Rouge 70
Override Fields with name output_load_pct Display name Charge onduleur

Code XML :
from(bucket: "homelab")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "eaton_ups")
  |> filter(fn: (r) => r._field == "output_load_pct")




Temps ondulée



Panneau Stat
Calculation Last *
Fields Numeric Fields
Color mode Background Gradient
Unit minutes (m)
Color scheme From thresholds (by value)
Thresholds Rouge base
Thresholds Violet 21
Override Fields with name battery_minutes_remaining Display name Temps ondulée

Code XML :
from(bucket: "homelab")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "eaton_ups")
  |> filter(fn: (r) => r._field == "battery_minutes_remaining")



Autotest onduleur



Panneau Stat
Fields All Fields
Text mode Value and name
Color mode Value
Text size Title 20
Text size Value 26
Value mappings Done and passed Fonctionnement optimal (bleu)
Thresholds Rouge Base
Override Fields with name state Display name Autotest Onduleur :

Transformations Time caché
Transformations state {domain="sensor", entity_id="cave_eaton_resultat_de_l_autotest"} montré

Code XML :
from(bucket: "homeassistant")
  |> range(start: -30d)
  |> filter(fn: (r) => r["entity_id"] == "cave_eaton_resultat_de_l_autotest")
  |> filter(fn: (r) => r["_field"] == "state")
  |> last()



TRUENAS-SSD (et HDD)



Panneau Gauge
Calculation Last *
Fields Numeric Fields
Text mode Auto
Unit bytes(IEC)
Min 0
Max 10470000000000
Display name TRUENAS-SSD
Color scheme Green-Yellow-Red (by value)

Code XML :
from(bucket: "homelab")
  |> range(start: -15m)
  |> filter(fn: (r) =>
    r._measurement == "truenas_dataset" and
    r._field == "used" and
    r.name == "TRUENAS-SSD/DATASET-SSD"
  )
  |> last()



Graphiques interfaces Fortinet



Panneau Stat
Calculation Last *
Fields Numeric Fields
Text mode Value and name
Color mode Value
Unit megabits/sec
Thresholds Bleu 50
Thresholds Jaune 100
Thresholds Orange 200
Thresholds Rouge 600
Override Fields with name in_bytes Display name DOWNLOAD
Override Fields with name out_bytes Display name UPLOAD

Code XML :
from(bucket: "homelab")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) =>
    r._measurement == "fortigate_interfaces" and
    r.ifName == "wan1" and
    (r._field == "in_bytes")
  )
  |> aggregateWindow(every: 1m, fn: last)
  |> difference(nonNegative: true)
  |> map(fn: (r) => ({
      r with
      _value: float(v: r._value) * 8.0 / 60.0 / 1000000.0
  }))



Tunnels IPSec



Panneau Table
Cell type Auto
Value mappings 1 Rouge
Value mappings 2 Vert
Value mappings <nom tunnel forti> <nom affiché>
Override Fields with name Value Color scheme From thresholds (by value) et Cell type Colored background. Apply to entire row coché.
Override Fields with name Value Hide in table coché

Code XML :
from(bucket: "homelab")
  |> range(start: -10m)
  |> filter(fn: (r) => r._measurement == "fortigate_vpn_status")
  |> filter(fn: (r) => r._field == "status")
  |> group(columns: ["phase1_name"])
  |> max()
  |> keep(columns: ["phase1_name", "_value", "_time"])



Mesure puissance instantanée Linky



Pannel Gauge
Calculation Last *
Fields Numeric Fields
Unit Volt-Ampere (VA)
Min 0
Max <pSouscrite>
Display name Puissance instantanée
Color scheme From thresholds (by value)
Thresholds Vert Base
Thresholds Jaune 4500
Thresholds Rouge 6000

Code XML :
from(bucket: "homeassistant")
  |> range(start: -24h)
  |> filter(fn: (r) => r["entity_id"] == "lixee_zlinky_tic_electricalmeasurementapparentpower")
  |> filter(fn: (r) => r["_field"] == "value")
  |> last()



Capteurs de température



Panneau Stat
Calculation Last *
Fields Numeric Fields
Color mode Value
Unit Celsius (°C)
Color scheme From thresholds (by value)
Thresholds Couleur température

Code XML :
from(bucket: "homeassistant")
  |> range(start: -24h)
  |> filter(fn: (r) => r["entity_id"] == "capteur_1_temperature_2")
  |> filter(fn: (r) => r["_field"] == "value")
  |> last()



Graphiques Proxmox



Panneau Time series
Unit Percent (0-100), ou megabytes pour la ram, megabits pour le réseau

Code XML :
from(bucket: "proxmox")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) =>
    r._measurement == "cpu" and
    r._field == "usage_idle" and
    r.cpu == "cpu-total"
  )
  |> aggregateWindow(
    every: 10s,
    fn: mean
  )
  |> map(fn: (r) => ({
      r with
      _value: 100.0 - r._value
  }))



Tuiles d’état hôte physique ou VM



Panneau Stat
Calculation Last *
Fields Numeric Fields
Text mode Value
Color mode Background Solid
Value mappings 0 Nom équipement (Rouge)
Value mappings 1 Nom équipement (Vert)

Code XML :
from(bucket: "homelab")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "prometheus")
  |> filter(fn: (r) => r._field == "monitor_status")
  |> filter(fn: (r) => r.monitor_name == "Mitel 470")
  |> last()



Tuiles d’état conteneur Docker



Panneau Stat
Calculation Last *
Fields Numeric Fields
Text mode Value
Color mode Background Solid
Value mappings starting Nom équipement (Jaune)
Value mappings healthy Nom équipement (Violet)
Value mappings unhealthy Nom équipement (Rouge)

Code XML :
from(bucket: "homelab")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "docker_container_health")
  |> filter(fn: (r) => r._field == "health_status")
  |> filter(fn: (r) => r.container_name == "duckdns")
  |> last()
  |> keep(columns: ["_time", "_value"])




Raspberry Pi en mode Kiosque



Tout d’abord imagez la carte SD du PI avec la dernière version de Raspberry Pi OS 64 bits.

Je vous conseille d’activer le SSH lors de l’installation.

Une fois le PI booté, réalisez

Code BASH :
sudo apt update && sudo apt full-upgrade


Une fois la mise à jour terminée faites

Code BASH :
sudo raspi-config


Et activez la connexion automatique sur le bureau dans 1 System Options S6 Auto Login et faites « No » sur « Would you like to automatically log in to the console? » et faites « yes » sur « Would you like to automatically log in to the desktop? ».

Ensuite créez le script avec

Code BASH :
nano grafana.sh


et mettez ça dedans :

Code BASH :
sleep 4
export MOZ_ENABLE_WAYLAND=1
/usr/bin/firefox --kiosk --profile /home/pi/.firefox-kiosk-profile "http://LeLienDuGrafanaAvecLesOptions>
sleep 300
wlrctl pointer move 0 -2000


Je vous conseilles comme ici d’utiliser Firefox car dans mes tests sur un PI 3B, chromium était au moins 2x plus lent, ce qui impacte la fréquence de rafraîchissement.

Ensuite réalisez un

Code BASH :
chmod +x grafana.sh


Puis on va faire en sorte que ce script soit exécuté au démarrage :

Code BASH :
mkdir -p ~/.config/labwc
nano ~/.config/labwc/autostart


Et renseignez ce contenu :

Code BASH :
swaybg -c 000000 &
/home/pi/grafana.sh &


Pour faire en sorte que le pointeur ne reste pas sur l’écran via un profil Firefox :


Code BASH :
mkdir -p /home/pi/.firefox-kiosk-profile
cat > /home/pi/.firefox-kiosk-profile/user.js << 'EOF'
user_pref("browser.shell.checkDefaultBrowser", false);
user_pref("browser.sessionstore.resume_from_crash", false);
user_pref("browser.startup.page", 1);
user_pref("signon.rememberSignons", false);
user_pref("browser.aboutwelcome.enabled", false);
user_pref("datareporting.policy.firstRunURL", "");
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
EOF


et également :

Code BASH :
mkdir -p /home/pi/.firefox-kiosk-profile/chrome
cat > /home/pi/.firefox-kiosk-profile/chrome/userContent.css << 'EOF'
* { cursor: none !important; }
EOF