# 📘 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