Какие основные типы метрик существуют в Prometheus и для чего они используются?

Ответ

В Prometheus существует четыре основных типа метрик, каждый из которых предназначен для разных сценариев мониторинга:

  1. Counter — монотонно возрастающий счетчик. Используется для подсчета событий, которые со временем только накапливаются, например, общее количество HTTP-запросов, выполненных задач или возникших ошибок.

    Пример на Go:

    http_requests_total = prometheus.NewCounter(prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests.",
    })
  2. Gauge — измеряет значение, которое может как увеличиваться, так и уменьшаться. Идеально подходит для отслеживания текущих состояний: количество активных горутин, размер очереди, используемая память.

    Пример на Go:

    active_goroutines = prometheus.NewGauge(prometheus.GaugeOpts{
        Name: "active_goroutines",
        Help: "Current number of active goroutines.",
    })
  3. 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
    })
  4. 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"). Это превращает метрики в многомерные данные и обеспечивает мощные возможности для фильтрации и агрегации.