Méta : prometheus promql monitoring
Note mère : Prometheus Overview
Notes liées : Déclaration des Variables Grafana, Grafana Dashboards
📝 PromQL Basics (Syntaxe et Concepts de base)
PromQL est le langage d’interrogation natif de Prometheus. Il est conçu pour extraire et manipuler des séries temporelles (time-series data) en temps réel.
1. Les 4 Types de Métriques (Côté Application)
Avant de requêter, il faut comprendre ce qu’on requête. Prometheus stocke 4 types de données :
-
Counter : Un compteur qui ne fait qu’augmenter (ex: nombre total de requêtes HTTP, erreurs). Ne jamais afficher la valeur brute, toujours utiliser
rate()ouincrease(). -
Gauge : Une valeur qui peut monter et descendre (ex: utilisation CPU, mémoire, température). S’utilise souvent avec les valeurs brutes ou
avg(). -
Histogram : Échantillonne des observations et les classe dans des “buckets” (seaux) configurables (ex: temps de réponse HTTP).
-
Summary : Similaire à l’histogramme, mais calcule des quantiles (ex: 95e percentile) directement côté client.
2. Les Types de Vecteurs (Côté Requête)
C’est le concept central de PromQL pour comprendre comment appliquer les fonctions.
-
Instant Vector (Vecteur instantané) : Un seul échantillon de données pour chaque série temporelle, à un instant T.
-
Syntaxe :
node_cpu_seconds_total -
Résultat : La valeur exacte à la seconde où la requête est lancée.
-
-
Range Vector (Vecteur de plage) : Un ensemble d’échantillons sur une période de temps donnée.
-
Syntaxe :
node_cpu_seconds_total[5m](Les crochets[]définissent la plage :spour secondes,mpour minutes,h,d,w). -
Attention : Un Range Vector ne peut pas être affiché directement sur un graphique Grafana. Il doit d’abord être transformé par une fonction (comme
rate()).
-
3. Filtrage et Sélecteurs (Labels)
Pour cibler une métrique précise, on utilise des sélecteurs entre accolades {}.
| Opérateur | Action | Exemple | Explication |
|---|---|---|---|
= | Correspondance exacte | job="api" | Garde uniquement le job “api”. |
!= | Exclusion exacte | env!="dev" | Garde tout sauf l’environnement “dev”. |
=~ | Correspondance Regex | host=~"web-.*" | Garde tous les hosts commençant par “web-”. (Indispensable avec les variables Grafana multiples). |
!~ | Exclusion Regex | status!~"5.." | Exclut toutes les erreurs HTTP 5xx. |
Requête complète : http_requests_total{job="api", status="200"}
4. Fonctions Essentielles (Pour les Compteurs)
Les compteurs (Counters) augmentant à l’infini, leur valeur brute n’a pas de sens sur un graphique. On veut connaître leur vitesse d’évolution.
-
rate(metric[plage]): Calcule la vitesse d’augmentation par seconde sur la plage donnée. (La fonction la plus utilisée).- Exemple :
rate(http_requests_total[5m])→ Nombre de requêtes par seconde, calculé sur les 5 dernières minutes.
- Exemple :
-
irate(metric[plage]): Idem, mais se base uniquement sur les deux derniers points de données de la plage. Très réactif, idéal pour zoomer sur des pics très courts, mais mauvais pour les tendances longues. -
increase(metric[plage]): Calcule l’augmentation totale sur la plage.- Exemple :
increase(http_requests_total[1h])→ Combien de requêtes au total ont été reçues durant la dernière heure.
- Exemple :
5. Agrégation Spatiale (Regrouper les données)
Quand une requête retourne trop de séries (ex: un CPU par serveur, par cœur), on les regroupe.
-
sum(): Additionne toutes les valeurs. -
avg(): Fait la moyenne. -
min()/max(): Garde la valeur la plus basse / haute.
Les modificateurs by et without (Crucial) :
Ils permettent de conserver certains labels lors de l’agrégation.
-
by: Ne garde QUE les labels spécifiés.sum by (instance) (rate(http_requests_total[5m]))→ Affiche le total des requêtes par seconde, mais avec une courbe séparée parinstance.
-
without: Supprime les labels spécifiés et agrège le reste.avg without (cpu) (node_cpu_seconds_total)→ Fait la moyenne de tous les cœurs CPU, pour n’avoir plus qu’une ligne par serveur.
Souhaites-tu que je te prépare une note séparée (Zettelkasten) dédiée spécifiquement aux mathématiques entre métriques (comme calculer un pourcentage de CPU libre ou d’erreurs HTTP) et aux opérateurs logiques (and, or, unless) ?