Ответ
В современных системах мониторинга, и в частности в популярной для Go связке с Prometheus, выделяют четыре основных типа метрик:
-
Counter (Счётчик) — монотонно возрастающее значение. Используется для подсчета событий, например, общего числа HTTP-запросов или количества ошибок. Не может уменьшаться, только сбрасываться на 0 при перезапуске сервиса.
requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }) -
Gauge (Измеритель) — значение, которое может произвольно увеличиваться и уменьшаться. Идеально подходит для измерения текущих состояний: количество активных горутин, использование памяти, загрузка CPU, длина очереди.
activeConnections = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "current_active_connections", Help: "Current number of active connections.", }) -
Histogram (Гистограмма) — распределяет наблюдения (например, длительность запроса) по настраиваемым корзинам (бакетам) и предоставляет их суммарное значение. Позволяет вычислять квантили (например, 95-й перцентиль времени ответа) на стороне сервера Prometheus.
responseLatency = prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "http_response_latency_seconds", Help: "Response latency in seconds.", Buckets: prometheus.DefBuckets, // Предопределенные бакеты }) -
Summary (Сводка) — похожа на гистограмму, но вычисляет квантили непосредственно на стороне клиентского приложения и отправляет их в Prometheus. Более ресурсоемка для приложения, но менее требовательна к ресурсам сервера Prometheus при расчете квантилей.
Ответ 18+ 🔞
А, слушай, вот это тема, про которую можно сломать мозг, но если разобраться — всё проще пареной репы, ей-богу. Сидишь, смотришь на эти графики в Графане, а там какие-то цифры пляшут. А вся магия, блядь, начинается вот с этих четырёх типов метрик в Прометеусе. Их всего четыре, но если перепутать — будет пиздец, а не мониторинг.
Первое, счётчик, он же Counter. Представь себе счётчик Гейгера, только тикает он не от радиации, а от событий. Запрос пришёл — тик. Ошибка вылезла — тик. Он, сука, только вверх ползёт, как долг по ипотеке. Уменьшить его нельзя, только если сервис нахуй упал и обнулился. Нужен, чтобы отвечать на вопросы вроде «сколько всего запросов обработали за вчера?».
requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
})
Дальше — Gauge, или измеритель. Вот это уже веселее. Это как стрелка на бензобаке: может вверх, может вниз. Сколько сейчас горутин висят, сколько оперативки жрёт процесс, температура процессора — всё это он. Хочешь отследить, как очередь набухает, а потом сдувается — тебе сюда.
activeConnections = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "current_active_connections",
Help: "Current number of active connections.",
})
А теперь, блядь, готовься, тут начинается настоящая магия. Histogram, гистограмма. Это не просто цифра, это, сука, целое расследование. Она берёт твои замеры, например, время ответа сервера, и раскидывает их по корзинам. «От 0 до 100 мс», «от 100 до 200 мс» и так далее. Потом в Прометеусе можно спросить: «эй, а какой у меня 95-й перцентиль?» — и он тебе покажет, ниже какой задержки находятся 95% запросов. Охуенно удобно, но бакеты эти, корзины, надо заранее придумать.
responseLatency = prometheus.NewHistogram(prometheus.HistogramOpts{
Name: "http_response_latency_seconds",
Help: "Response latency in seconds.",
Buckets: prometheus.DefBuckets, // Готовые корзины, чтоб не париться
})
Ну и на десерт — Summary, сводка. Сестра-близнец гистограммы, но с прикрученным, блядь, фитильком. Она сама, прямо в твоём приложении, считает эти самые квантили (типа медиану, 95-й перцентиль). С одной стороны — для Прометеуса это легче, он готовые цифры получает. С другой — твоё приложение начинает потеть, потому что расчёты эти не из лёгких. Выбирай, что тебе дороже: ресурсы сервера мониторинга или ресурсы твоего гофера.
Вот и вся философия, ёпта. Четыре кита, на которых держится вся эта ебля с графиками и алертами. Перепутал Counter с Gauge — получишь алерт, что «всё пропало», когда на самом деле просто очередь опустела. Так что думай, что и зачем меришь, а то будет тебе, как в том анекдоте, «ядра — чистый изумруд», а ты такой: «Да не я дрочистый, блядь, изумруд!».