← Назад к вопросам

Что такое Counter метрика в Prometheus?

2.2 Middle🔥 161 комментариев
#Observability

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Counter метрика в Prometheus

Counter — это один из четырех основных типов метрик в Prometheus (Counter, Gauge, Histogram, Summary). Это фундаментальная концепция системы мониторинга, и понимание ее особенностей критически важно для разработчика.

Определение и ключевые характеристики

Counter представляет собой монотонно возрастающую числовую величину. Его значение может только увеличиваться (или оставаться неизменным), но никогда уменьшаться. Снижение значения возможно только при сбросе счетчика до нуля (обычно при перезапуске процесса). Типичные примеры использования:

  • Количество выполненных HTTP запросов.
  • Количество обработанных задач или сообщений.
  • Количество возникших ошибок.
  • Количество переданных байтов.

В отличие от Gauge, который может свободно увеличиваться и уменьшаться (например, текущая нагрузка CPU или количество активных соединений), Counter предназначен для измерения кумулятивных событий.

Реализация и использование в коде

В библиотеках клиентов Prometheus (например, для Go) Counter создается и используется следующим образом:

package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    // Создаем метрику Counter с именем и описанием
    requestsTotal := prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests processed.",
            // Можно добавить постоянные метки, например:
            // ConstLabels: prometheus.Labels{"service": "api"},
        },
    )

    // Регистрируем метрику в стандартном реестре
    prometheus.MustRegister(requestsTotal)

    // Обработчик HTTP, который инкрементирует счетчик
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // Увеличиваем значение счетчика на 1
        requestsTotal.Inc()
        w.Write([]byte("OK"))
    })

    // Экспортируем метрики на отдельном эндпоинте
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

Для более сложных случаев, например, счетчика с динамическими метками (labels), используется CounterVec:

requestsTotalByMethod := prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "http_requests_by_method_total",
        Help: "Total number of HTTP requests by method.",
    },
    []string{"method"}, // Название динамической метки
)

prometheus.MustRegister(requestsTotalByMethod)

// В обработчике теперь можно инкрементировать конкретный элемент вектора
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    requestsTotalByMethod.WithLabelValues(r.Method).Inc()
    w.Write([]byte("OK"))
})

Особенности работы и запросов

  • Монотонность: Самое важное свойство. Prometheus и его инструменты (например, графики в Grafana) рассчитывают на то, что значение счетчика не уменьшается между скрапами (сборами метрик).
  • Сброс при рестарте: При перезапуске экспортирующего приложения счетчик может быть инициализирован с нуля. Системы визуализации обычно используют функции для корректного отображения таких данных.
  • Функции агрегации в PromQL: В языке запросов Prometheus для работы с Counter используются специальные функции, учитывающие его монотонность:
    *   `rate(http_requests_total[5m])` — вычисляет **среднюю скорость увеличения** счетчика за последние 5 минут (например, запросов в секунду). Это одна из самых часто используемых функций.
    *   `increase(http_requests_total[1h])` — вычисляет абсолютное увеличение значения за последний час.
    *   `irate()` — похожа на `rate`, но использует последние две точки данных для вычисления мгновенной скорости, что может быть полезно для более резких изменений.

Практическое применение и важность

Counter является основой для измерения скоростей событий в системе. Простое абсолютное значение "1000 запросов" малоинформативно. Гораздо важнее знать динамику: "20 запросов в секунду в течение последнего часа" или "скорость упала до 5 запросов в секунду после деградации базы данных". Именно функции rate() и increase() преобразуют кумулятивный счетчик в понятные и полезные для алертинга и анализа графики трендов.

Таким образом, Counter в Prometheus — это не просто "счетчик", а специальный тип метрики, закладывающий фундамент для корректного анализа временных рядов и поведения системы через расчет скоростей и изменений. Его правильное использование отличает простой сбор данных от профессионального мониторинга.