Ответ
Метрика типа 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 (датчик) — это про состояние. Может ходить туда-сюда, как температура у больного. Текущая глубина очереди, объём свободной памяти — вот это всё. Его значение само по себе уже информативно, можно просто смотреть на него и охуевать.
Вот и вся философия, блядь. Счётчик — чтобы считать, а не чтобы глазеть на него, как на иконку.