Перейти к содержанию

Monitoring и profiling

ИНСТРУМЕНТЫ ДЛЯ МОНИТОРИНГА В JAVA

1. Java Management Extensions (JMX)

JMX (Java Management Extensions) — это встроенный в JDK API (стандартная часть Java SE), позволяющий управлять и мониторить Java-программы через MBean-интерфейсы для отслеживания бизнес-метрик (например, количество запросов, ошибок). Он уже есть в JDK и используется другими инструментами.

Можно использовать JMX через:

  • JConsole
  • VisualVM
  • IntelliJ IDEA (через плагины или внешние подключения к JMX)

📌 Возможности:

  • Позволяет создавать собственные MBean’ы, через которые можно управлять состоянием приложения и читать метрики.
  • Работает через JMX-коннектор, доступный удалённо.
  • Интегрируется с JConsole, VisualVM, Prometheus и другими.
  • Внешнее управление поведением приложения (например, сброс кеша).

2. JConsole

JConsole — это встроенное приложение из JDK. Графическая утилита от Oracle для мониторинга Java-приложений через JMX.
Находится в папке bin/ JDK. Запускается как обычное приложение.

📌 Возможности:

  • Просмотр загрузки CPU, использования памяти, активных потоков.
  • Мониторинг Heap/PermGen/Metaspace памяти.
  • Поддержка просмотра и управления MBeans.
  • Подключение к локальным и удаленным JVM.

⚠️ Прост в использовании, но ограничен по функциональности по сравнению с VisualVM.


3. VisualVM

VisualVM — это стороннее приложение. Раньше поставлялось с JDK 6–8, сейчас скачивается отдельно.

📌 Профилирование:

  • Анализ потребления CPU: сколько времени тратится на выполнение каждого метода.
  • Анализ памяти: какие объекты занимают память, поиск утечек.
  • Дамп heap'а, анализ живых объектов.
  • Анализ активности потоков (в каком состоянии они находятся).

📌 Возможности:

  • Мониторинг метрик JVM (CPU, память, GC, потоки).
  • Просмотр стеков потоков, дампов памяти.
  • Профилирование методов и анализ утечек памяти.
  • Поддержка JMX и MBeans.

Особенности:

  • Поддерживает плагины, расширяющие функциональность.
  • Может подключаться к удаленным JVM.
  • Бесплатен и открыт (OpenJDK-проект).

4. Prometheus + Grafana

Тип: Мониторинг
Назначение: Мониторинг метрик на продакшене, построение графиков и оповещений.

📌 Как работает:

  • Prometheus собирает метрики с приложения через HTTP endpoints (например, /metrics, которые вы можете сгенерировать с помощью JMX Exporter).
  • Grafana отображает метрики в виде настраиваемых графиков и дашбордов.

📌 Для Java:

  • Используется JMX Exporter — адаптер, который конвертирует JMX-метрики в формат, понятный Prometheus.
  • Метрики: память, GC, потоки, количество вызовов MBean-методов и др.

Особенности:

  • Очень мощно на проде: метрики, алерты, исторические данные.
  • Требует настройки, особенно для подключения к Java-приложению.

ИНСТРУМЕНТЫ ДЛЯ ПРОФИЛИРОВАНИЯ В JAVA

5. JProfiler

JProfiler — коммерческое стороннее приложение. Один из самых мощных инструментов для профилирования.
Есть интеграция с IntelliJ IDEA: после установки плагина можно запускать профилирование прямо из среды разработки.
Требуется лицензионный ключ (есть бесплатный триал).

📌 Возможности:

  • CPU профилирование: измерение времени выполнения каждого метода.
  • Профилирование памяти: снимки памяти, отслеживание утечек.
  • Профилирование потоков и блокировок.
  • Интеграция с JMX, JDBC, HTTP, сервлетами и др.
  • Визуализация зависимостей и потоков исполнения.

О Grafana

Grafana — не альтернатива VisualVM или JProfiler, а инструмент для визуализации метрик, обычно используемый в продакшене. Она не заменяет профилировщик, а дополняет систему мониторинга, особенно в связке с Prometheus.

Grafana — это платформа дашбордов, которая отображает графики и алерты на основе метрик, собранных из различных источников: Prometheus, InfluxDB, Loki, Elasticsearch и др.
Grafana не собирает метрики сама, а подключается к системам, где они уже есть.

💡 Использование с разными языками:

Язык Интеграция через Библиотеки / экспортёры
Java JMX JMX Exporter, Micrometer, Dropwizard
Python client lib prometheus_client
Go встроено prometheus, expvar
Node.js / JS client lib prom-client
C# / .NET client lib prometheus-net
Rust, C++ и др. client lib Есть библиотеки и SDK

Компонент Что делает Передаёт данные в Протокол/фmt
Приложение Отдаёт метрики через HTTP (/metrics) Prometheus Prometheus text
Prometheus Скрапит endpoints, хранит TS-данные Grafana (через PromQL) HTTP/PromQL API
Grafana Дёргает Prometheus, строит дашборды
Приложение Пишет логи в файлы или stdout/stderr Promtail plain text (raw)
Promtail Считывает файлы, подписывает labels Loki HTTP API (Loki)
Loki Принимает, индексирует labels, хранит чанки Grafana (через LogQL) HTTP/LogQL API
Grafana Дёргает Loki, строит логовые view
Задача Рекомендуемый стек Плюсы Минусы
Лёгкие системные/приложенческие метрики Prometheus + Grafana Бесплатный, зрелый, простой в настройке Может потребоваться sharding/HA ручная настройка
Крупный кластер Kubernetes Prometheus + Thanos/Cortex + Grafana Масштабируемый, дедупликация, ретеншн Настройка сложнее, больше составляющих
Хранение метрик в Influx-стиле и TICK-стек Telegraf + InfluxDB + Chronograf/Graphite/Grafana Удобно для ряда готовых плагинов Меньше гибкости в PromQL, алертах
Логи из контейнеров / Pod’ов (K8s) Promtail (или Fluent Bit) + Loki + Grafana Лёгковесно, tight-integration с Grafana Пока не такой зрелый, как ELK
Полноценный ELK-стек для логов Filebeat + Logstash + Elasticsearch + Kibana Очень мощный поиск, экосистема плагинов Тяжёлый, ресурсоёмкий, инфраструктура сложнее
Совмещённый сбор метрик/логов/трейсов OpenTelemetry Collector + VictoriaMetrics/Jaeger + Grafana Стандартизовано, гибкие коннекторы Младше, может потребоваться ручная донастройка
Корпоративный SaaS Datadog / NewRelic / Dynatrace + встроенная панель Много готового функционала, поддержка Платно, нет полного контроля над данными