Les filtres sont utilisés pour sélectionner les métriques qui correspondent à certaines conditions. Il existe différents types de filtres utilisés pour sélectionner les métriques:
up{job="node_exporter"}
node_network_receive_bytes_total{device="eth0"}
node_network_receive_bytes_total{device!="eth1"}
node_network_receive_bytes_total{device=~"eth.+"}
node_network_receive_bytes_total{instance="xxxx",device=~"eth.+"}
PromQL permet d'utiliser des opérations de regroupement similaires à SQL pour regrouper les métriques en fonction de certaines étiquettes. Ces opérations de regroupement sont utilisées pour agréger les données en fonction de certaines étiquettes, telles que "cpu" et "instance", pour obtenir des informations plus détaillées sur les métriques.
count(node_cpu_seconds_total) by (cpu)
sum(node_network_receive_bytes_total) by (interface)
.Il est également possible d'utiliser des opérations de regroupement multiples et de combiner les clauses GROUP BY pour obtenir des informations plus détaillées sur les métriques.
Par exemple, pour compter le nombre de fois que l'on trouve le nombre de lignes :
count(count(node_cpu_seconds_total) by (cpu,instance))
count(count(node_cpu_seconds_total) by (cpu,instance)) by (instance)
On affiche donc la valeur 2 qui est le nombre de CPU de mon instance node-exporter
.
PromQL permet de spécifier des plages de temps pour les requêtes afin de sélectionner les métriques pour une période spécifique. Il existe deux types de plages de temps:
Range Vector : Ce type de plage de temps permet de sélectionner les métriques pour un intervalle de temps donné. Par défaut, la plage de temps est définie par rapport à l'instant actuel. Par exemple, pour sélectionner les données pour les 3 dernières minutes pour node_cpu_seconds_total, vous pouvez utiliser la requête suivante : node_cpu_seconds_total[3m]
.
Offset : Cette option permet de déplacer le point de référence pour les plages de temps. C'est utile pour comparer des périodes de temps différentes. Par exemple, pour comparer le nombre de requêtes HTTP sur les 5 dernières minutes à celui des 5 minutes précédentes, vous pouvez utiliser la requête suivante : sum(prometheus_http_requests_total) by (code) - sum(prometheus_http_requests_total offset 5m) by (code)
.
Sum over time : Permet comme son nom l'indique de faire une somme sur une durée donnée : sum_over_time(prometheus_http_requests_total[5m])
Average over time : Faire une moyenne sur un lapse de temps donné : avg_over_time(prometheus_http_requests_total[5m])
On peut s'amuser à comparer la load 1 minutes par rapport à la moyenne de la load1 il y a 5-6 minutes : node_load1 - avg_over_time(node_load1[1m] offset 5m)
Il existe différentes unités de temps disponibles pour spécifier les plages de temps :
PromQL permet de travailler avec des métriques de compteur pour calculer le taux d'accroissement et l'augmentation sur une période donnée.
rate : cette fonction permet de calculer le taux d'accroissement d'une métrique de compteur pour une période de temps donnée. Il calcule la différence entre la valeur actuelle et la valeur précédente de la métrique, divisée par la différence de temps entre ces deux valeurs ((valueX - value1) / (TimeX - Time1)
). Cela permet de déterminer la vitesse à laquelle la métrique est en train de changer.
Exemple: rate(node_network_receive_bytes_total{device="eth0"}[1m])
pour connaître le taux d'accroissement de bytes reçus sur l'interface enp0s8 sur les dernières minutes.
increase : cette fonction permet de calculer l'augmentation d'une métrique de compteur pour une période de temps donnée. Il calcule le produit du taux d'accroissement (calculé avec la fonction rate) et de la durée de la période de temps. Cela permet de déterminer la quantité totale par laquelle la métrique a augmenté pendant la période de temps donnée.
Exemple: increase(node_network_receive_bytes_total{device="eth0"}[1m])
pour connaître l'augmentation de bytes reçus sur l'interface enp0s8 sur les dernières minutes.
Il est important de noter que ces fonctions s'appliquent uniquement aux métriques de compteur (counter) et ne peuvent pas être utilisées avec les métriques de jauge (gauge).
PromQL permet également de travailler avec des métriques de jauge pour calculer la dérivée et le delta sur une période donnée.
delta : cette fonction permet de calculer la différence entre la valeur actuelle et la valeur précédente d'une métrique de jauge pour une période de temps donnée. Il calcule la différence entre la valeur actuelle de la métrique et la valeur précédente de la métrique. Cela permet de déterminer la quantité par laquelle la métrique a changé pendant cette période de temps.
Exemple: delta(node_load1[1m])
pour connaître la différence entre la valeur actuelle de node_load1 et la valeur précédente de node_load1 sur les dernières minutes.
deriv : cette fonction permet de calculer la dérivée d'une métrique de jauge pour une période de temps donnée. Il calcule la différence entre la valeur actuelle et la valeur précédente de la métrique, divisée par la différence de temps entre ces deux valeurs. Cela permet de déterminer la vitesse à laquelle la métrique est en train de changer. Il est important de noter que le résultat de cette fonction est exprimé en unité par seconde.
Exemple: deriv(node_load1[1m])
pour connaître la dérivée de node_load1 sur les dernières minutes.
Si on fait deriv(node_load1[1m]) * 60
on va donc tomber sur le delta(node_load1[1m])
.
Le label est l'élément pour filtrer et typer les métriques. Le filtre va permettre d'éviter de colleter et stocker trop de métriques.
On peut par exemple droper des adresses IP :
global:
scrape_interval: 15s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
- job_name: node_exporter
static_configs:
- targets: ['192.168.1.10:9100'] # Exemple d'IP
relabel_configs:
- source_labels: [__address__] # Label disponible par défaut sur un static_configs
regex: '192.168(.*)' # On va donc droper tout ce qui est en 192.168.X.Y
action: drop
On peut aussi passer l'action en keep
afin de garder uniquement les IPs 192.168.X.Y. L'exemple est très simple et peu utile (inutile) mais cela peut être utile pour un discovery auto (via consul, gce...).
exemple réédition de ports :
relabel_configs:
- source_labels: ['__address__'] # 192.168.1.10:9100
separator: ':'
regex: '(.*):(.*)' # match IP en ${1} et le port en ${2}
target_label: '__address__'
replacement: '${1}:8080' # Remplace 192.168.1.10:9100 par 192.168.1.10:8080
Garder que quelques métriques :
metric_relabel_configs:
- source_labels: ['__name__'] # On regarde le nom de la métrique,
regex: '(node_load1|node_load15)' # On garde node_load1 et node_load15
action: keep
Permet d'ajouter un label à une métrique. Fonctionne de la manière suivante : label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
label_replace(up, "mylabel", "$1", "job", "(.*)")
# up{instance="node-exporter:9100", job="node_exporter", mylabel="node_exporter"}
label_replace(up, "port", "$2", "instance", "(.*):(.*)")
# up{instance="node-exporter:9100", job="node_exporter", port="9100"}
En PromQL, voici les principaux opérateurs :
== (equal)
!= (not-equal)
> (greater-than)
< (less-than)
>= (greater-or-equal)
<= (less-or-equal)
and (intersection)
or (union)
unless (complement)
Exemple simple :
node_load1 > 1.0 and node_load1 < 1.6