# 📘 Cours Avancé Grafana & PromQL --- ## 🔹 Partie 1 – Concepts PromQL pour l'infrastructure ### 📌 1.1. Comprendre les séries temporelles Une métrique dans Prometheus (et VictoriaMetrics) est une série temporelle identifiée par : - un **nom** de métrique (ex: `node_cpu_seconds_total`) - un **ensemble de labels** (ex: `mode="idle", instance="server01"`) Les vecteurs sont : - **instant vector** : une valeur par série à un instant donné - **range vector** : une série continue de valeurs `[5m]`, `[1h]` --- ## 🔹 Partie 2 – Opérateurs vectoriels & fonctions utiles ### 📌 2.1. Agrégations pour infrastructure | Fonction | Utilisation typique | |------------------|--------------------------------------------| | `avg()` | Moyenne CPU/mémoire/débit | | `sum()` | Total RAM/disque utilisé | | `max()` / `min()`| Surveillance températures | | `rate()` | Variation débit réseau, IOPS, load average | | `quantile()` | P95 des charges, températures | | `topk()` | Top serveurs les plus chargés | --- ## 🔹 Partie 3 – Requêtes PromQL pratiques ### ✔️ Débit entrant réseau par interface : ```promql rate(if_in_octets[1m]) ``` ### ✔️ Débit sortant réseau par interface : ```promql rate(if_out_octets[1m]) ``` ### ✔️ Top 5 interfaces réseau par trafic total : ```promql topk(5, rate(if_in_octets[1m]) + rate(if_out_octets[1m])) ``` --- ## 🔹 Partie 4 – Dashboards avancés ### 📌 4.1. Templating avec variables dynamiques Créez des variables comme `$instance` : ```promql label_values(node_cpu_seconds_total, instance) ``` Puis utilisez-les dans vos panels : ```promql rate(node_cpu_seconds_total{mode="system", instance="$instance"}[5m]) ``` ### 📌 4.2. Requêtes filtrées avec regex Exemple pour surveiller uniquement certaines interfaces : ```promql rate(if_in_octets{interface=~"eth0|eth1"}[1m]) ``` --- ## 🔹 Partie 5 – Alertes ### ✔️ CPU utilisé > 90 % sur 5 minutes ```promql 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90 ``` ### ✔️ Espace disque < 10 % disponible ```promql (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.1 ``` ### ✔️ Température CPU > 80 °C ```promql max(node_hwmon_temp_celsius) by (instance) > 80 ``` ### ✔️ Serveur inaccessible (ping KO) ```promql probe_success == 0 ``` --- ## 🔹 Partie 6 – Dashboards types à construire 1. **Vue réseau** : - Débit entrant/sortant - Erreurs réseau - Interfaces en alerte - Top interfaces par trafic 2. **Vue supervision ping/HTTP** : - Temps de réponse - Serveurs down - Disponibilité sur 30j --- ## 🔹 Partie 7 – Optimisation & bonnes pratiques - **Limiter la cardinalité** : pas trop de labels dynamiques (ex: nom d’interface unique, URL…) - **Utiliser des `recording rules`** pour éviter les calculs lourds à chaque requête - **Préférer les panels par groupe d’host (via `job`, `cluster`, `datacenter`...)** - **Grouper les alertes via Grafana Alerting** et créer des silences programmés - **Sauvegarder et versionner vos dashboards JSON via Git** --- ## 🔹 Bonus – Bonnes extensions/exporters - `ipmi_exporter` : température, voltage, fan speed