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() ou increase().

  • 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 : s pour secondes, m pour 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érateurActionExempleExplication
=Correspondance exactejob="api"Garde uniquement le job “api”.
!=Exclusion exacteenv!="dev"Garde tout sauf l’environnement “dev”.
=~Correspondance Regexhost=~"web-.*"Garde tous les hosts commençant par “web-”. (Indispensable avec les variables Grafana multiples).
!~Exclusion Regexstatus!~"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.
  • 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.

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 par instance.
  • 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) ?