Разница между PromQL "по" и "без" неясна
У меня есть вопрос о расчете времени отклика с помощью сводных метрик Прометея.
Я создал сводную метрику, которая содержит не только имя службы, но также полный путь и http-метод.
Сейчас я пытаюсь рассчитать среднее время отклика для всего сервиса. Я прочитал статью о "ставка, а затем сумма" и либо я не понимаю, как выполняется расчет, либо расчет ИМХО неверен.
Насколько я прочитал, это должен быть правильный способ расчета времени отклика в секунду:
sum by(service_id) (
rate(request_duration_sum{status_code=~"2.*"}[5m])
/
rate(request_duration_count{status_code=~"2.*"}[5m])
)
Я понимаю, что для каждого подмножества создается значение "длительность в секунду" (сумма суммы / скорость счета), а затем создается сумма для service_id.
Это выглядит абсолютно неправильно для меня - но я думаю, что это не работает так, как я понимаю.
Другой способ получить равный результат - это:
sum without (path,host) (
rate(request_duration_sum{status_code=~"2.*"}[5m])
/
rate(request_duration_count{status_code=~"2.*"}[5m])
)
- Но в чем разница?
- Что на самом деле здесь происходит?
- И почему я честно получаю измеримые значения, только если я использую "max" вместо "sum"?
Если бы я игнорировал все прочитанное, я бы попробовал это следующим образом:
rate(sum by(service_id) request_duration_sum{status_code=~"2.*"}[5m])
/
rate(sum by(service_id) request_duration_count{status_code=~"2.*"}[5m])
Но это не будет работать вообще... (мгновенный вектор против вектора диапазона и так далее...).
Есть идеи?
THX заранее!!!
3 ответа
Все эти примеры агрегируют неправильно, поскольку вы усредняете среднее значение. Ты хочешь:
sum without (path,host) (
rate(request_duration_sum{status_code=~"2.*"}[5m])
)
/
sum without (path,host) (
rate(request_duration_count{status_code=~"2.*"}[5m])
)
Который вернет среднюю задержку за status_code
плюс любые другие оставшиеся ярлыки.
- В
by
модификатор группирует результаты по меткам, перечисленным внутриby(...)
. - В
without
группы модификаторов агрегирования функцийагрегируют результаты функции по всем меткам, кроме перечисленных внутриwithout(...)
.
Например, предположим
process_resident_memory_bytes
метрика существует с ,
instance
и этикетки:
process_resident_memory_bytes{job="job1",instance="host1",datacenter="dc1"} N1
process_resident_memory_bytes{job="job1",instance="host2",datacenter="dc1"} N2
process_resident_memory_bytes{job="job1",instance="host1",datacenter="dc2"} N3
process_resident_memory_bytes{job="job2",instance="host1",datacenter="dc1"} N4
затем
sum(process_resident_memory_bytes) by (datacenter)
вернет сводку по использованию памяти, в то время как
sum(process_resident_memory_bytes) without (instance)
вернет сводку по
job
за-
datacenter
использование памяти.
Используя метрики Prometheus в Grafana, without
ключевое слово не сработало для меня (по крайней мере, как я ожидал). Я получил удовлетворительные результаты сby
:
sum by (status_code)(
rate(request_duration_sum{status_code=~"2.*"}[5m])
)
/
sum by (status_code)(
rate(request_duration_sum{status_code=~"2.*"}[5m])
)