Ответ
В Prometheus существует четыре основных типа метрик, каждый из которых предназначен для разных сценариев мониторинга:
-
Counter — монотонно возрастающий счетчик. Используется для подсчета событий, которые со временем только накапливаются, например, общее количество HTTP-запросов, выполненных задач или возникших ошибок.
Пример на Go:
http_requests_total = prometheus.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", })
-
Gauge — измеряет значение, которое может как увеличиваться, так и уменьшаться. Идеально подходит для отслеживания текущих состояний: количество активных горутин, размер очереди, используемая память.
Пример на Go:
active_goroutines = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "active_goroutines", Help: "Current number of active goroutines.", })
-
Histogram — семплирует наблюдения (обычно длительность запросов или размеры ответов) и распределяет их по настраиваемым корзинам (buckets). Позволяет на стороне сервера вычислять квантили (например, 95-й перцентиль времени ответа) и строить распределения. Отлично подходит для расчета SLO/SLI.
Пример на Go:
http_response_time_seconds = prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "http_response_time_seconds", Help: "Response time distribution.", Buckets: prometheus.LinearBuckets(0.1, 0.1, 10), // 10 корзин от 0.1 до 1.0 })
-
Summary — похож на Histogram, но вычисляет квантили на стороне клиента и отправляет их в Prometheus уже в готовом виде. Это делает его более точным для перцентилей, но затрудняет агрегацию данных с разных инстансов сервиса.
Пример на Go:
http_request_duration_seconds = prometheus.NewSummary(prometheus.SummaryOpts{ Name: "http_request_duration_seconds", Help: "Request duration in seconds.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, })
Ключевой особенностью Prometheus являются метки (labels), которые позволяют добавлять измерения к метрикам (например, method="POST"
, status_code="500"
). Это превращает метрики в многомерные данные и обеспечивает мощные возможности для фильтрации и агрегации.