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

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-configEt 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.shet 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.shPuis 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