Selectors и matchers
Тема дорожной карты · Prometheus
Селекторы и матчеры в PromQL представляют собой мощный инструмент для фильтрации временных рядов по значениям меток, что позволяет сузить круг метрик, включаемых в результат запроса. Это особенно важно при работе с большими наборами данных, где без использования селекторов и матчеров сложно получить точную информацию. Селекторы записываются путем добавления к имени метрики фигурных скобок с одним или несколькими матчерами меток, например http_requests_total{job="api", status=~"5.."}. В PromQL используются четыре типа матчеров: = (точное равенство), != (неравенство), =~ (соответствие регулярному выражению) и !~ (несоответствие регулярному выражению). Эти матчеры применяются к значениям меток хранящихся временных рядов. Благодаря этому, матчеры можно объединять в одном селекторе, например, {job="api", method!="OPTIONS", path=~"/api/.*"}, для точного выбора подмножества рядов. Селекторы, использующие только матчеры меток без имени метрики (например, {__name__=~"http_.*"}), также допустимы в PromQL и полезны для кросс-метричных запросов, хотя они могут быть ресурсозатратными на крупных экземплярах TSDB Prometheus, если они совпадают со многими рядами.
Как это работает
Selectors и matchers — это язык запросов Prometheus. Селекторы: metric_name{label="value"} возвращает мгновенные значения. Range-vectors: metric_name[5m] — последние 5 минут samples. Агрегации: sum, avg, max, min, count, topk, bottomk. by (label) группирует; without (label) исключает из группировки. Распространённое использование: rate(counter[5m]) (per-second rate за 5 мин — самая используемая функция). Subqueries: <query>[5m:1m].
Когда применять
Селекторы и матчеры полезны при создании запросов для получения конкретной информации из данных Prometheus. Например, rate(counter[5m]) (не irate — rate усредняет по окну, менее шумно). Также можно использовать histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m]))) для расчета p95 latency. Если вы хотите получить информацию по каждому хосту, используйте sum by (instance) вместо sum by (job). Всегда тестируйте запросы в Prometheus UI graph view перед тем, как добавлять их в дашборды или алерты.
Типичные ошибки
Типичные ловушки при использовании селекторов и матчеров включают в себя использование слишком короткого окна для rate(counter[1m]) (что может привести к NaN или шуму, если оно меньше обычного интервала scrape). Также часто возникает проблема с потерей меток при использовании sum(rate(...)) (используйте by для сохранения меток). Важно различать instant vector и range vector (функции требуют определенных типов — rate() принимает range vector). Неправильная агрегация histogram может привести к неправильным результатам (всегда сначала используйте sum by (le)).