web-dev-qa-db-ja.com

Prometheusクエリで2つのメトリックを「結合」するにはどうすればよいですか?

consul exporter を使用して、サービスの正常性とステータスをPrometheusに取り込みます。 Consulのサービスとノードのステータスが重要な場合にアラートを発生させ、それらのアラートをルーティングするときにConsulから抽出したタグを使用したいと思います。

この説明 から、サービスタグは別のメトリックとしてエクスポートされる可能性が高いことを理解していますが、ヘルスステータスのタグを活用できるように、あるシリーズを別のシリーズに結合する方法がわかりません。

たとえば、次のクエリ:

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

返すことができます:

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

しかし、私はこのシリーズの「env」も欲しいです:

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

nodeとservice_nameに沿って結合され、以下を単一のシリーズとしてAlertmanagerに渡します。

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

その後、ルーティングで「env」と一致させることができます。

これを行う方法はありますか?私には、操作や関数がこのようにグループ化または参加する能力を与えてくれるようには思えません。私が見る限り、タグはconsul_health_service_statusメトリックのラベルである必要があります。

22
Rob Best

_group_left_の引数リストを使用して、右側のオペランドから追加のラベルを含めることができます(わかりやすくするために括弧とインデント)。

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

ここで重要な部分は、操作+ on(service_name,node) group_left(env)です:

  • _+_は、結合演算子として「乱用」されています(_0 * consul_service_tags_の値は常に0であるため、問題ありません)
  • group_left(env)は、右からの追加ラベルenvを含む修飾子です(_consul_service_tags_)
20
user2361830