> Приходилось ли писать PromQL запросы (Go)
Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Aston
Стек: Go
> Пример ответа
Короткий ответ
Да, приходилось. В основном писал PromQL для алертов и дашбордов в Grafana: rate, histogram_quantile, запросы с grouping по label'ам, join между метриками. Также сталкивался с подводными камнями вроде counter reset и работы с гистограммами. Уверенно читаю и отлаживаю запросы, понимаю разницу между instant и range query.
Подробное объяснение
PromQL - это язык запросов для Prometheus. Ключевые концепции:
- Instant vector - набор временных рядов с одним значением на момент запроса.
- Range vector - набор временных рядов с массивом значений за окно времени.
- Rate - скорость изменения counter'а за окно, учитывает counter reset.
- Histogram - обычно используется
histogram_quantileдля расчёта перцентилей. - Aggregation -
sum,avg,max,minсbyилиwithout. - Binary operators - арифметика, сравнения, логические операции, join через
on/ignoring.
Типичные сценарии: алертинг на ошибки (rate(http_requests_total{status=~"5.."}[5m])), утилизация CPU (rate(node_cpu_seconds_total{mode!="idle"}[5m])), latency через histogram.
На практике
В Go-проектах обычно используется Prometheus client для экспорта метрик, а PromQL применяется в правилах алертинга и Grafana. Важно помнить про:
- Counter vs Gauge - rate только для counter.
- Окно запроса - слишком маленькое даёт шум, слишком большое - запаздывание.
- Label matching - точное совпадение, regex,
=~. - Recording rules - для тяжёлых запросов, чтобы не грузить Prometheus на каждый запрос дашборда.
Пример алерта: sum(rate(http_requests_total{status=~"5.."}[5m])) by (service) / sum(rate(http_requests_total[5m])) by (service) > 0.05 - доля 5xx ответов больше 5%.
Пример кода
# Ошибки в процентах от общего трафика sum(rate(http_requests_total{status=~"5.."}[5m])) by (service) / sum(rate(http_requests_total[5m])) by (service) * 100 # p95 latency histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service)) # CPU usage per container sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (container)
Как отвечать на собеседовании
- Начни с конкретного примера: "Да, писал для алертов на 5xx и p95 latency".
- Покажи понимание разницы между instant и range vector.
- Упомяни counter reset и почему rate обязателен для counter.
- Расскажи про join между метриками через
on/ignoring- это частый вопрос. - Если спрашивают про оптимизацию - упомяни recording rules и снижение cardinality.
Что проверяет интервьюер
- Понимание базовых типов данных Prometheus (counter, gauge, histogram).
- Умение читать и писать запросы с агрегацией и rate.
- Знание подводных камней: counter reset, окна, label matching.
- Практический опыт - не просто заученные синтаксис, а реальные кейсы.
Типичные ошибки
- Применение
rateк gauge - это некорректно, rate только для counter. - Использование
sumбезby- теряется разбивка по сервисам. - Забывают про
histogram_quantile- считают среднее вместо перцентиля. - Игнорируют counter reset - получают резкие падения на графиках.
- Не учитывают, что
rateсглаживает за окно - слишком маленькое окно даёт шум.
> Похожие задачи по Go
Что такое b-tree индекс и что означает буква B
Что такое лимиты и запросы ресурсов в Kubernetes
Какую метрику Prometheus использовать для подсчета RPS сервера
Влияют ли индексы на другие запросы кроме ускорения поиска
> Похожие задачи по backend
Что такое b-tree индекс и что означает буква B
Что такое лимиты и запросы ресурсов в Kubernetes
Какую метрику Prometheus использовать для подсчета RPS сервера
Влияют ли индексы на другие запросы кроме ускорения поиска
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью