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