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,$2issus 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 :
-
La métrique du disque
node_filesystem_size_bytespossède un labelinstance="192.168.1.10:9796". Elle n’a malheureusement pas le labelnode. -
La métrique d’infrastructure
kube_node_infopossède le labelnode="worker-01", et un labelinternal_ip="192.168.1.10". Elle n’a pas le port 9796. -
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 :
-
Prometheus prend la métrique
kube_node_info. -
Il lit le
src_labelqui estinternal_ip(ex:192.168.1.10). -
La regex
(.*)capture cette IP complète dans le groupe de capture$1. -
Il crée un
dst_labelappeléinstance. -
Il lui donne la valeur de remplacement
$1:9796(ce qui donne192.168.1.10:9796). -
BINGO ! La métrique de droite possède maintenant un label
instancestrictement identique à celle de gauche. La jointure* on (instance) group_left(node)peut enfin fonctionner, et importer le labelnodepour que Grafana l’affiche dynamiquement dans la légende via{{node}}.