Разница между 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])
  )
Другие вопросы по тегам