Мониторинг приложений Java: инструменты и библиотеки для сбора метрик

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

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

Начать курс

Мониторинг приложений Java: обзор инструментов и библиотек

В современной разработке мониторинг Java-приложений стал обязательной практикой. Без него невозможно понять, как ведёт себя система под нагрузкой, где возникают узкие места и как быстро реагировать на сбои. В этой статье мы разберём ключевые библиотеки и инструменты для сбора метрик, трассировки и визуализации состояния Java-приложений: Micrometer, Prometheus Java Client, JMX и Java Flight Recorder.

1. Micrometer — фасад для метрик

Micrometer — это де-факто стандарт для сбора метрик в экосистеме Spring Boot и не только. Он предоставляет единый API, который можно использовать с разными бэкендами: Prometheus, Datadog, Graphite, InfluxDB и другими.

Основные возможности:

  • Поддержка счетчиков (Counter), таймеров (Timer), гистограмм (Histogram) и датчиков (Gauge).
  • Автоматическая интеграция с Spring Actuator.
  • Гибкая настройка тегов (tags) для фильтрации метрик.

Пример использования Micrometer с Prometheus:

// Добавьте зависимость в pom.xml:
// <dependency>
//     <groupId>io.micrometer</groupId>
//     <artifactId>micrometer-registry-prometheus</artifactId>
// </dependency>

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Counter;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.prometheus.PrometheusConfig;

public class MetricsExample {
    private final Counter requestCounter;

    public MetricsExample() {
        PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
        requestCounter = Counter.builder("http.requests.total")
                .description("Total HTTP requests")
                .tag("method", "GET")
                .register(registry);
    }

    public void handleRequest() {
        requestCounter.increment();
    }

    public String scrapeMetrics() {
        return registry.scrape(); // возвращает метрики в формате Prometheus
    }
}

Micrometer позволяет легко переключаться между системами мониторинга без изменения кода.

2. Prometheus Java Client — прямой сбор метрик

Prometheus Java Client — это официальная библиотека для экспорта метрик в формате Prometheus. Она менее абстрактна, чем Micrometer, но даёт полный контроль над сбором данных.

Основные компоненты:

  • CollectorRegistry — реестр всех метрик.
  • Counter, Gauge, Histogram, Summary — типы метрик.
  • Встроенный HTTP-сервер для эндпоинта /metrics.

Пример с использованием простого HTTP-сервера:

import io.prometheus.client.Counter;
import io.prometheus.client.exporter.HTTPServer;
import io.prometheus.client.hotspot.DefaultExports;

public class PrometheusExample {
    static final Counter requests = Counter.build()
            .name("requests_total")
            .help("Total requests.")
            .register();

    public static void main(String[] args) throws Exception {
        DefaultExports.initialize(); // добавляет метрики JVM (память, GC, потоки)
        HTTPServer server = new HTTPServer(8080); // эндпоинт /metrics

        while (true) {
            requests.inc();
            Thread.sleep(1000);
        }
    }
}

Библиотека идеальна для случаев, когда нужно быстро настроить мониторинг без лишних зависимостей.

3. JMX (Java Management Extensions)

JMX — встроенный механизм управления и мониторинга JVM. Позволяет получать информацию о памяти, потоках, классах, а также управлять MBeans (Managed Beans).

Как использовать:

  • Включите JMX при запуске JVM: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false.
  • Подключитесь через JConsole или VisualVM.
  • Программно через MBeanServerConnection.

Пример получения данных о куче (heap) через JMX:

import javax.management.*;
import java.lang.management.*;

public class JMXMonitor {
    public static void main(String[] args) throws Exception {
        MBeanServerConnection mbsc = ManagementFactory.getPlatformMBeanServer();
        ObjectName memoryMXBean = new ObjectName("java.lang:type=Memory");

        // Получаем использование кучи
        Object heapUsage = mbsc.getAttribute(memoryMXBean, "HeapMemoryUsage");
        System.out.println("Heap: " + heapUsage);
    }
}

JM

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