Как получить разницу между двумя разными метриками prometheus?

#apache-spark #apache-kafka #prometheus #metrics #prometheus-operator

#apache-spark #apache-kafka #prometheus #метрики #prometheus-operator

Вопрос:

Рассмотрим примеры метрик:

 increase(application_executor_recordsWritten[20m])
increase(kafka_server_brokertopicmetrics_messagesin_total{topic="my_topic"}[20m])
  

Если я выполняю эти метрики отдельно на графике prometheus — все работает. Но когда вы пытаетесь что-то вроде:

 increase(application_executor_recordsWritten[20m]) -  increase(kafka_server_brokertopicmetrics_messagesin_total{topic="my_topic"}[20m])
  

Я получил No datapoints error .

  1. Может быть, это происходит потому, что application_executor_recordsWritten получено за последний 1 час, в то время как kafka_server_brokertopicmetrics_messagesin_total получено более 6 часов.
  2. Может ли это произойти из-за того, что эти показатели имеют разные «настройки сбора», рассмотрим вывод консоли prometheus:

    application_executor_recordswriten

    {app_name=»app-name»,exported_instance=»application_111111111111111111″,exported_job=»application_111111111111111111″,instance=»XX.XXX.X.XX»,job=»job_name»,number=»1″,role=»executor»}

    kafka_server_brokertopicmetrics_messagesin_total

    {экземпляр=»XX.XXX.X.XX»,задание=»job_name», тема =»my_topic»}

Prometheus использует что-то вроде ignore(???) ключевого слова, но я не могу понять, как это работает и как применить его к этим метрикам.

Есть идеи, как добиться разницы в метриках? Каков правильный синтаксис для этого?

Ответ №1:

В PromQL арифметические двоичные операторы между двумя диапазонами метрик (они же векторы) подлежат векторному сопоставлению: операция применяется только к записям, которые имеют одинаковый набор меток (name и avalue).

Если есть разница, а значения не сопоставлены, вы получаете печально известную No data point ошибку.

Если вы хотите, чтобы они совпадали, вы должны

  • либо игнорирование некоторых меток, которые не совпадают ( metric1 - ignoring(a_lone_label) metric2 )
  • или указание, на какой метке выполняется сопоставление ( metric1 - on(common_label_name_and_value) metric2 )

В приведенных вами примерах неясно, что должно совпадать. Я бы сказал instance и job ; это может быть:

 increase(application_executor_recordsWritten[...]) - on (job,instance) increase(kafka_server_brokertopicmetrics_messagesin_total{topic="my_topic"}[...])
  

Если у вас есть одна сторона оператора, содержащая элементы, которые должны быть сопряжены с более чем одним элементом другой стороны (вызовите сопоставление «один ко многим»), вы должны указать, на какой стороне оператора (правой или левой) больше записей: используя group_<side:rigth|left> .