web-dev-qa-db-fra.com

Comment puis-je "joindre" deux métriques dans une requête Prometheus?

J'utilise le exportateur consul pour ingérer la santé et le statut de mes services dans Prométhée. Je souhaite déclencher des alertes lorsque l'état des services et des nœuds dans Consul est critique, puis utiliser des balises extraites de Consul pour acheminer ces alertes.

Je comprends à partir de cette discussion que les balises de service sont susceptibles d’être exportées sous forme de mesure distincte, mais je ne suis pas sûr de savoir comment joindre une série à une autre afin de pouvoir exploiter les balises avec l’état de santé.

Par exemple, la requête suivante:

max(consul_health_service_status{status="critical"}) by (service_name, status,node) == 1

pourrait retourner:

{node="app-server-02",service_name="app-server",status="critical"} 1

mais je voudrais aussi 'env' de cette série:

consul_service_tags{node="app-server-02",service_name="app-server",env="prod"} 1

pour rejoindre le noeud noeud et service_name pour transmettre les éléments suivants à Alertmanager en tant que série unique:

{node="app-server-02",service_name="app-server",status="critical",env="prod"} 1

Je pourrais alors correspondre à "env" dans mon routage.

Est-ce qu'il y a un moyen de faire ça? Il ne me semble pas que des opérations ou des fonctions me permettent de grouper ou de rejoindre des groupes comme ceux-ci. Autant que je sache, les balises devraient déjà être des étiquettes sur la métrique consul_health_service_status.

22
Rob Best

Vous pouvez utiliser la liste d'arguments de group_left Pour inclure des étiquettes supplémentaires à partir de l'opérande de droite (parenthèses et retraits pour plus de clarté):

(
  max(consul_health_service_status{status="critical"}) 
  by (service_name,status,node) == 1
)
   + on(service_name,node) group_left(env)
(
   0 * consul_service_tags
)

La partie importante ici est l'opération + on(service_name,node) group_left(env):

  • le + est "abusé" en tant qu'opérateur de jointure (très bien puisque 0 * consul_service_tags a toujours la valeur 0)
  • group_left(env) est le modificateur qui inclut l'étiquette supplémentaire env à partir de la droite (consul_service_tags)
20
user2361830