Méta : prometheus promql regex zettelkasten

Note mère : PromQL Avancé : Jointures et Opérations Binaires

📝 PromQL Avancé : La fonction label_replace()

Dans PromQL, il arrive très souvent que l’on veuille croiser deux métriques (Vector Matching) suite à vos apprentissages dans PromQL Avancé : Jointures et Opérations Binaires, mais que les labels ne correspondent pas exactement.

Exemple classique : une métrique utilise une IP avec un port (10.0.0.1:9100), et l’autre métrique utilise juste l’IP (10.0.0.1). Si vous tentez une jointure classique on(instance), elle plantera lamentablement.

C’est là qu’intervient la fonction label_replace(). Elle permet de créer, modifier ou renommer un label à la volée en utilisant une expression régulière (pour revoir la syntaxe regex RE2, consultez Déclaration des Variables Grafana), juste avant d’effectuer la jointure mathématique.

1. La Syntaxe

Extrait de code

label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
  • v : La métrique de base (votre vecteur).

  • dst_label : Le nom du nouveau label à créer (ou du label existant à écraser).

  • replacement : La valeur à injecter (on peut utiliser les groupes de capture $1, $2 issus de la regex).

  • src_label : Le label d’origine que l’on va lire et découper.

  • regex : L’expression régulière pour isoler ce qui nous intéresse dans le src_label.

2. Cas Pratique d’Excellence (Kubernetes Node Exporter)

Le But : Afficher le pourcentage de disque utilisé par nœud physique, tout en affichant le “vrai” nom du nœud (ex: worker-01) pour avoir une légende propre (comme vu dans Grafana Panels : Manipulation de l’Affichage et Légendes).

Le Problème :

  1. La métrique du disque node_filesystem_size_bytes possède un label instance="192.168.1.10:9796". Elle n’a malheureusement pas le label node.

  2. La métrique d’infrastructure kube_node_info possède le label node="worker-01", et un label internal_ip="192.168.1.10". Elle n’a pas le port 9796.

  3. Impossible de les joindre en l’état car aucun label n’a la même valeur exacte des deux côtés.

La Solution (Requête complète) :

Extrait de code

(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) 
/ node_filesystem_size_bytes{mountpoint="/"} * 100
* on (instance) group_left(node)
label_replace(
  kube_node_info{node=~"$node"}, 
  "instance", 
  "$1:9796", 
  "internal_ip", 
  "(.*)"
)

Explication de la magie label_replace étape par étape :

  1. Prometheus prend la métrique kube_node_info.

  2. Il lit le src_label qui est internal_ip (ex: 192.168.1.10).

  3. La regex (.*) capture cette IP complète dans le groupe de capture $1.

  4. Il crée un dst_label appelé instance.

  5. Il lui donne la valeur de remplacement $1:9796 (ce qui donne 192.168.1.10:9796).

  6. BINGO ! La métrique de droite possède maintenant un label instance strictement identique à celle de gauche. La jointure * on (instance) group_left(node) peut enfin fonctionner, et importer le label node pour que Grafana l’affiche dynamiquement dans la légende via {{node}}.