Какие типы метрик знаешь (counter/gauge/histogram/summary) и где что применять?
1️⃣ Как кратко ответить
Counter используется для подсчета событий, которые только увеличиваются, например, количество запросов. Gauge измеряет значения, которые могут увеличиваться и уменьшаться, например, текущая температура. Histogram собирает распределение значений, например, время ответа запросов, и позволяет анализировать их по интервалам. Summary также собирает распределение значений, но предоставляет более детализированную статистику, такую как перцентили.
2️⃣ Подробное объяснение темы
В системах мониторинга и сбора метрик важно правильно выбирать тип метрики для точного и эффективного сбора данных. Рассмотрим основные типы метрик: Counter, Gauge, Histogram и Summary.
Counter
Counter — это метрика, которая используется для подсчета событий. Она всегда увеличивается и никогда не уменьшается. Примером может служить количество HTTP-запросов, обработанных сервером. Counter сбрасывается только при перезапуске приложения.
Пример использования Counter:
import io.prometheus.client.Counter;
// Создаем Counter для подсчета HTTP-запросов
Counter requests = Counter.build()
.name("http_requests_total")
.help("Total number of HTTP requests.")
.register();
// Увеличиваем счетчик при каждом запросе
public void handleRequest() {
requests.inc(); // Увеличиваем на 1
}
Counter.build()— создает новый объект Counter..name("http_requests_total")— задает имя метрики..help("Total number of HTTP requests.")— описание метрики..register()— регистрирует метрику в системе мониторинга.requests.inc()— увеличивает значение счетчика на 1.
Gauge
Gauge — это метрика, которая измеряет текущее значение, которое может как увеличиваться, так и уменьшаться. Примером может быть температура в серверной комнате или количество активных пользователей в системе.
Пример использования Gauge:
import io.prometheus.client.Gauge;
// Создаем Gauge для измерения температуры
Gauge temperature = Gauge.build()
.name("room_temperature_celsius")
.help("Current temperature in Celsius.")
.register();
// Устанавливаем текущее значение температуры
public void updateTemperature(double currentTemperature) {
temperature.set(currentTemperature);
}
Gauge.build()— создает новый объект Gauge..name("room_temperature_celsius")— задает имя метрики..help("Current temperature in Celsius.")— описание метрики..register()— регистрирует метрику в системе мониторинга.temperature.set(currentTemperature)— устанавливает текущее значение температуры.
Histogram
Histogram используется для сбора распределения значений. Он разбивает данные на интервалы (бины) и подсчитывает количество значений, попадающих в каждый интервал. Это полезно для анализа времени ответа запросов или размера файлов.
Пример использования Histogram:
import io.prometheus.client.Histogram;
// Создаем Histogram для времени ответа
Histogram requestLatency = Histogram.build()
.name("http_request_latency_seconds")
.help("Request latency in seconds.")
.register();
// Измеряем время выполнения запроса
public void processRequest() {
Histogram.Timer timer = requestLatency.startTimer();
try {
// Обработка запроса
} finally {
timer.observeDuration(); // Записываем время выполнения
}
}
Histogram.build()— создает новый объект Histogram..name("http_request_latency_seconds")— задает имя метрики..help("Request latency in seconds.")— описание метрики..register()— регистрирует метрику в системе мониторинга.requestLatency.startTimer()— начинает измерение времени.timer.observeDuration()— записывает продолжительность выполнения.
Summary
Summary также собирает распределение значений, но предоставляет более детализированную статистику, такую как перцентили. Это полезно для анализа времени выполнения операций, где важны точные перцентили.
Пример использования Summary:
import io.prometheus.client.Summary;
// Создаем Summary для времени выполнения
Summary requestDuration = Summary.build()
.name("request_duration_seconds")
.help("Request duration in seconds.")
.quantile(0.5, 0.05)
.quantile(0.9, 0.01)
.quantile(0.99, 0.001)
.register();
// Измеряем время выполнения запроса
public void handleRequest() {
Summary.Timer timer = requestDuration.startTimer();
try {
// Обработка запроса
} finally {
timer.observeDuration(); // Записываем время выполнения
}
}
Summary.build()— создает новый объект Summary..name("request_duration_seconds")— задает имя метрики..help("Request duration in seconds.")— описание метрики..quantile(0.5, 0.05)— добавляет перцентиль (например, медиана) с допустимой ошибкой..register()— регистрирует метрику в системе мониторинга.requestDuration.startTimer()— начинает измерение времени.timer.observeDuration()— записывает продолжительность выполнения.
Каждый тип метрики имеет свои особенности и применяется в зависимости от задачи. Counter подходит для подсчета событий, Gauge — для измерения текущих значений, Histogram — для анализа распределения значений по интервалам, а Summary — для детализированного анализа распределения с перцентилями.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться