Prometheus метрики в Java: полное руководство по библиотеке simpleclient
Prometheus — это мощная система мониторинга и оповещения с открытым исходным кодом, ставшая де-факто стандартом в мире Cloud Native. Для Java-разработчиков существует несколько библиотек для интеграции, но официальная библиотека simpleclient (также известная как prometheus/client_java) является самой популярной и поддерживаемой. В этой статье мы подробно разберём, как добавить Prometheus метрики в Java-приложение, используя эту библиотеку.
Что такое simpleclient?
simpleclient — это официальный Java-клиент для Prometheus, предоставляющий простой и эффективный способ создания и экспорта метрик. Библиотека поддерживает четыре основных типа метрик Prometheus:
- Counter (Счётчик) — монотонно возрастающее значение (например, количество запросов).
- Gauge (Датчик) — значение, которое может произвольно изменяться (например, текущая загрузка CPU).
- Histogram (Гистограмма) — распределение значений по предопределённым "ведрам" (например, время ответа).
- Summary (Сводка) — квантили наблюдаемых значений (например, p50, p99 времени ответа).
Установка и настройка
Для начала работы добавьте следующие зависимости в ваш pom.xml (Maven) или build.gradle (Gradle).
Maven
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.16.0</version>
</dependency>
<!-- Для экспорта метрик через HTTP -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_httpserver</artifactId>
<version>0.16.0</version>
</dependency>
Gradle
implementation 'io.prometheus:simpleclient:0.16.0'
implementation 'io.prometheus:simpleclient_httpserver:0.16.0'
Создание и использование метрик
Рассмотрим пример создания всех основных типов метрик в одном классе.
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.Histogram;
import io.prometheus.client.Summary;
public class MetricsExample {
// 1. Counter: количество обработанных запросов
static final Counter requestsCounter = Counter.build()
.name("app_requests_total")
.help("Total number of processed requests.")
.labelNames("endpoint", "method")
.register();
// 2. Gauge: текущее количество активных пользователей
static final Gauge activeUsersGauge = Gauge.build()
.name("app_active_users")
.help("Current number of active users.")
.register();
// 3. Histogram: время выполнения запроса в миллисекундах
static final Histogram requestDurationHistogram = Histogram.build()
.name("app_request_duration_ms")
.help("Request duration in milliseconds.")
.buckets(10, 50, 100, 200, 500, 1000, 5000)
.register();
// 4. Summary: квантили времени выполнения
static final Summary requestDurationSummary = Summary.build()
.name("app_request_duration_summary_ms")
.help("Request duration summary in milliseconds.")
.quantile(0.5, 0.05) // p50 с допустимой погрешностью 5%
.quantile(0.99, 0.01) // p99 с допустимой погрешностью 1%
.register();
public static void main(String[] args) throws Exception {
// Симуляция обработки запросов
for (int i = 0; i < 100; i++) {
processRequest("/api/users", "GET");
}
// Запуск HTTP-сервера для экспорта метрик
new HTTPServer(9090);
System.out.println("Metrics server started on port 9090");
Thread.currentThread().join();
}
private static void processRequest(String endpoint, String method) {
// Увеличиваем счётчик запросов
requestsCounter.labels(endpoint, method).inc();
// Увеличиваем датчик активных пользователей
activeUsersGauge.inc();
// Замеряем время выполнения
Histogram.Timer histogramTimer = requestDurationHistogram.startTimer();
Summary.Timer summaryTimer = requestDurationSummary.startTimer();
try {
// Симуляция работы (от 10 до 200 мс)
Thread.sleep((long) (Math.random() * 200 + 10));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// Останавливаем таймеры
histogramTimer.observeDuration();
summaryTimer.observeDuration();
// Уменьшаем датчик активных пользователей
activeUsersGauge.dec();
}
}
}
Экспорт метрик через HTTP
После запуска приложения метрики будут доступны по адресу http://localhost:9090/metrics. Вы можете провери
Также в библиотеке
Очереди задач для Swift: полное руководство по GCD и Operation Queues
Обработка изображений на C++: resize и crop с библиотекой OpenCV
Работа с датами в Go (Golang): обзор библиотек и пакетов
Интернационализация (i18n) в C# (.NET): полное руководство