отображение только данных с машин, которые не отображаются в другом запросе - PullRequest
0 голосов
/ 28 мая 2020

У меня есть довольно типичный запрос об использовании ЦП для показа

100 - (avg by (instance) (irate(wmi_cpu_time_total{mode="idle"}[2m])) * 100) > 80

, который приводит к данным, которые выглядят примерно так:

{instance="opus143.domain.com:9182"} 94.07140535559513 
{instance="opus162.domain.com:9182"} 90.00755315803018 
{instance="opus163.domain.com:9182"} 85.48084077380952 

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

opus_local_slaves_count > 0

opus_local_slaves_count{instance="opus143.domain.com:5100",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{instance="opus143.domain.com:5110",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{instance="opus145.domain.com:5100",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{instance="opus145.domain.com:5110",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{instance="opus146.domain.com:5100",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{instance="opus146.domain.com:5110",job="opus-live",runname="SimV3.1a"} 54 

Я думаю, что смог частично пройти там, используя label_replace чтобы предоставить мне хост в каждом случае

(label_replace((100 - (avg by (instance) (irate(wmi_cpu_time_total{mode="idle"}[2m])) * 100) > 80), "host", "$1","instance","(.*?)[.].*"))

{host="opus143",instance="opus143.domain.com:9182"} 94.07140535559513 
{host="opus162",instance="opus162.domain.com:9182"} 90.00755315803018 
{host="opus163",instance="opus163.domain.com:9182"} 85.48084077380952 

label_replace((opus_local_slaves_count > 0), "host", "$1","instance","(.*?)[.].*")

opus_local_slaves_count{host="opus143",instance="opus143.domain.com:5100",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{host="opus143",instance="opus143.domain.com:5110",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{host="opus145",instance="opus145.domain.com:5100",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{host="opus145",instance="opus145.domain.com:5110",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{host="opus146",instance="opus146.domain.com:5100",job="opus-live",runname="SimV3.1a"} 54 
opus_local_slaves_count{host="opus146",instance="opus146.domain.com:5110",job="opus-live",runname="SimV3.1a"} 54 

Но теперь я действительно застрял, пытаясь исключить хосты из список второй, из первого. Возможно ли это вообще в PromQL? В SQL это было бы простое NOT IN subquery

ОБНОВЛЕНИЕ: для контекста, я пытаюсь добиться, чтобы иметь возможность предупреждать о высокой загрузке ЦП на серверах, кроме серверов во втором списке, который должен иметь высокую загрузку ЦП. Может есть способ получше?

1 Ответ

0 голосов
/ 29 мая 2020

Решено!

Для тех, кто обнаружит, что это пытается сделать что-то похожее ... Ключевое слово saliant - UNLESS!

Сначала я упростил ситуацию, создав правила записи:

groups:
- name: custom_rules
  rules:
  - record: wmi_cpu_time_total_instance
    expr: 100 - (avg by (instance) (irate(wmi_cpu_time_total{mode="idle"}[2m])) * 100)
  - record: wmi_cpu_time_total_instance_host
    expr: label_replace(wmi_cpu_time_total_instance, "host", "$1", "instance","(.*?)[.].*")
  - record: opus_local_slaves_count_instance_host
    expr: label_replace(opus_local_slaves_count, "host", "$1", "instance","(.*?)[.].*")

, в котором была заключена большая часть сложности при вычислении и добавлении метки хоста, а затем я нашел этот блог (спасибо, Крис Зибенманн) https://utcc.utoronto.ca/~cks/space/blog/sysadmin/PrometheusFindUnpairedMetrics, который указал мне на ключевое слово UNLESS, чтобы я мог напишите простой запрос

wmi_cpu_time_total_instance_host unless on(host) (opus_local_slaves_count_instance_host > 0)

, который дает список хостов, у которых нет метки opus_local_slaves_count или для которых opus_local_slaves_count = 0

Voila!

...