Что такое метрика типа Counter в Prometheus и чем она отличается от Gauge?

Ответ

Метрика типа Counter (счетчик) в Prometheus — это кумулятивная метрика, значение которой может только монотонно возрастать или быть сброшено до нуля (например, при перезапуске сервиса).

Основные характеристики:

  • Монотонность: Значение никогда не уменьшается.
  • Назначение: Идеально подходит для подсчета событий, которые происходят с течением времени. Например:
    • Количество обработанных HTTP-запросов.
    • Число выполненных задач в очереди.
    • Количество возникших ошибок.

Пример кода на Go:

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promauto"
)

// promauto автоматически регистрирует метрику в default-регистре Prometheus.
var httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{
    Name: "myapp_http_requests_total",
    Help: "Total number of processed HTTP requests.",
})

func handleRequest() {
    // Увеличиваем счетчик на 1 при каждом вызове
    httpRequestsTotal.Inc()
    // ... логика обработки запроса
}

Как анализировать Counter? Сами по себе абсолютные значения счетчика редко бывают полезны. Гораздо важнее скорость их изменения. Для этого в языке запросов PromQL используются функции:

  • rate(http_requests_total[5m]): вычисляет среднюю скорость роста счетчика в секунду за последние 5 минут.
  • increase(http_requests_total[1h]): вычисляет, на сколько счетчик вырос за последний час.

Ключевое отличие от Gauge:

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

Ответ 18+ 🔞

А, слушай, про эту штуку — Counter в Прометее. Представь себе, блядь, обычный счётчик в машине, который только вперёд крутится, нахуй. Километраж, например. Ты же не можешь проехать сто километров, а потом волшебным пиздецом, чтобы на табло стало девяносто? Не, ну можешь, если откат сделаешь, но это уже мошенничество, ёпта. Так вот, Counter — он такой же честный, как пьяный Герасим: либо растёт, либо его в ноль сбросят, если приложение перезапустить, и всё.

Короче, суть:

  • Только плюс: Значение — строго вверх, блядь. Никаких "ой, я передумал, отниму единичку".
  • Для чего: Считать всё, что накапливается. Запросы, ошибки, ёбаные клики по кнопке "купить" — всё, что происходит раз за разом.

Смотри, как это в коде выглядит, на Go:

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promauto"
)

// promauto — вообще огонь, сам всё зарегистрирует, не надо париться.
var httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{
    Name: "myapp_http_requests_total", // Имя, чтоб потом в графане искать
    Help: "Total number of processed HTTP requests.", // Подсказка, а то забудешь, че это
})

func handleRequest() {
    // Вот тут магия — просто .Inc(), и счётчик подпрыгнул на единичку. Красота!
    httpRequestsTotal.Inc()
    // ... а тут уже твоя бизнес-логика, ебать её в сраку
}

А теперь самое важное, блядь! Смотреть на голое значение myapp_http_requests_total — это как смотреть на общий пробег машины и делать выводы о скорости. Бесполезно, ёпта! Нам же интересно: "сколько запросов в секунду щас летит?" или "на сколько ошибок за час стало больше?".

Для этого в PromQL есть две главные палочки-выручалочки:

  • rate(http_requests_total[5m]) — эта, сука, функция покажет среднюю скорость в секунду за последние пять минут. Овердохуища полезная штука!
  • increase(http_requests_total[1h]) — а эта скажет, на сколько именно вырос счётчик за последний час. Прямо вот число событий.

И последнее, чтоб не путаться, как мартышлюшка:

  • Counter (счётчик) — это про события. Только рост. rate() и increase() — его лучшие друзья.
  • Gauge (датчик) — это про состояние. Может ходить туда-сюда, как температура у больного. Текущая глубина очереди, объём свободной памяти — вот это всё. Его значение само по себе уже информативно, можно просто смотреть на него и охуевать.

Вот и вся философия, блядь. Счётчик — чтобы считать, а не чтобы глазеть на него, как на иконку.