Интеграция Prometheus метрик в Java: библиотека simpleclient

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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. Вы можете провери

Рекомендаций