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メトリックのラベルである必要があります。
_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
_)