> Приходилось ли писать 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 сглаживает за окно - слишком маленькое окно даёт шум.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью