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 + встроенная панель | Много готового функционала, поддержка | Платно, нет полного контроля над данными |