Доля ошибок — это одна сумма, делённая на другую, а порог отсекает то, что в норме.
Арифметика в PromQL работает между рядами: a / b делит ряд слева на ряд справа с теми же метками. Поэтому делят суммы — например, доля ответов 500 среди всех запросов приложения:
Чтобы получить долю по каждому адресу или методу, обе суммы берут с одним и тем же by: метки слева и справа должны совпасть. У ряда без пары с другой стороны результата нет. Сравнение > 0.05 в конце работает как фильтр: остаются только ряды больше порога, остальные пропадают, и пустой ответ значит «никто не превысил». С ключом bool — > bool 0.05 — сравнение вернёт каждому ряду 1 или 0.
Запрос rate(labapp_http_requests_total{code="500"}[1m]) / rate(labapp_http_requests_total[1m]) вернул одну строку со значением 1. Почему?
-
Без деления
rateпечатает дробные скорости вроде 0.52. Единица — итог деления ряда на самого себя. -
У адреса есть и ответы 200 — их показывает
rate(labapp_http_requests_total[1m]). Деление их просто не увидело.
Деление ищет справа ряд с теми же метками, включая code — и находит тот же ряд ошибок. Поэтому делят суммы с одинаковым by, где метки code нет: тогда ошибки делятся на все запросы.
Тот же запрос из скрипта удобнее слать в API: curl -s localhost:9090/api/v1/query --data-urlencode 'query=…' | jq '.data.result' (в Вики). В ответе у каждого ряда — метки и пара [время, "значение"]: время — секунды с 1970 года, значение — строкой. Такое выражение с порогом — заготовка правила алерта: Prometheus будет сам проверять его каждые несколько секунд и поднимать тревогу, когда ответ не пуст. Это следующий модуль.