#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
.
- Может быть, это происходит потому, что
application_executor_recordsWritten
получено за последний 1 час, в то время какkafka_server_brokertopicmetrics_messagesin_total
получено более 6 часов. -
Может ли это произойти из-за того, что эти показатели имеют разные «настройки сбора», рассмотрим вывод консоли 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>
.