Как я могу "присоединиться" к двум метрикам в запросе Prometheus?

Я использую консула-экспортера, чтобы забрать здоровье и статус моих услуг в Прометей. Я хотел бы активировать оповещения, когда статус служб и узлов в Консуле имеет решающее значение, а затем использовать теги, извлеченные из 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

чтобы присоединиться к узлу и имя_сервера, чтобы передать в Alertmanager следующее:

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

Тогда я мог бы сопоставить "env" в моей маршрутизации.

Есть какой-либо способ сделать это? Мне не кажется, что любые операции или функции дают мне возможность группироваться или присоединяться к этому. Насколько я вижу, метки уже должны быть метками на метке consul_health_service_status.

Ответ 1

Вы можете использовать список аргументов group_left для включения дополнительных ярлыков из правого операнда (для четкости: круглые скобки и отступы):

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

Важная часть здесь - операция * on(service_name,node) group_left(env):

  • * "злоупотребляется" как оператор объединения (отлично, поскольку consul_service_tags всегда имеет значение 1)
  • group_left(env) - это модификатор, который включает дополнительную метку env справа (consul_service_tags)

Ответ 2

Это не работает в приведенном ниже сценарии: если выражение дает более одной метрики, для которой env следует обновлять по-разному.

Пример: {узел = "приложение-сервер-02", имя_службы = "приложение-сервер", статус = "критический"} 1 {узел = "приложение-сервер-03", имя_сервера = "dev-сервер", статус = " критический "} 1

который должен быть объединен с {node = "app-server-02", service_name = "app-server", status = "критический", env = "prod"} 1 {node = "app-server-03", service_name = "dev-сервер", статус = "критический", env = "dev"} 1

И конечный результат должен быть: {node = "app-server-02", service_name = "app-server", status = "критический", env = "prod"} 1 {node = "app-server-03", service_name = "dev-сервер", status = "критический", env = "dev"} 1

Я получаю ниже ошибки:

Ошибка при выполнении запроса: несколько совпадений для меток: группировка меток должна обеспечивать уникальные совпадения