Частота ошибок, не возвращающих никаких данных при группировании по статусу HTTP - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть график в Grafana, использующий источник данных Prometheus для отображения частоты ошибок из моего API.Это нормально работает с этим запросом:

sum(rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m])) by (exported_endpoint, statusCode)

Я получаю частоту не-200 кодов ответов из моего API, а затем суммирую эти показатели, так как у меня есть 3 экземпляра моего API.Затем я группирую их по exported_endpoint (фактический путь, запрошенный пользователем) и statusCode, который является точным кодом состояния HTTP, возвращенного.

Хотя это немного полезно в качестве необработанного числа, это не так полезно,Наличие 100 ошибок в секунду из 100 запросов - это очень плохо, наличие 100 ошибок из 1 000 000 запросов - это не проблема.Поэтому я хотел бы разделить на общее количество запросов, но я изо всех сил.Если я сделаю:

(sum(rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m])) by (exported_endpoint, statusCode))/(sum(rate(va_request_response_code{endpoint="api"}[5m])) by (exported_endpoint))

, тогда он просто отображает No data points, что имеет смысл, поскольку в первом случае он группируется по statusCode в дивиденде, а не в делителе, поэтому это должно означать, что он пытаетсянайти совпадения перед делением.Вместо этого это работает:

(sum(rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m])) by (exported_endpoint))/(sum(rate(va_request_response_code{endpoint="api"}[5m])) by (exported_endpoint))

Но затем я теряю группировку по коду статуса, который мне нужен.В идеале я хотел бы знать, что x% запросов возвращают 404, а y% возвращают 500.Это возможно?

1 Ответ

0 голосов
/ 21 февраля 2019

Вам нужно написать это так:

sum by (exported_endpoint, statusCode) (rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m]))
  / ignoring(statusCode) group_left
sum by (exported_endpoint) (rate(va_request_response_code{endpoint="api"}[5m]))

Т.е. взять два вектора, слева один с меткой statusCode, справа без;разделите их, игнорируя метку statusCode;затем примените метки левого вектора к результату.

Вот ссылка на документацию Prometheus о сопоставлении «многие к одному» и «один ко многим» в PromQL.

...