Micrometer используется для сбора метрик приложения JVM и позволяет экспортировать данные в различные системы мониторинга. В этой статье я расскажу, как подключить Micrometer для spring web приложения и экспортировать данные в Prometheus (хороший пост о нем). Так как мое приложение написано на Spring 3, то возможности использовать Spring boot без апгрейда в нем нет. Поэтому придется поработать руками.
Первым делом нам понадобятся зависимости Prometheus, сам клиент и сервлет для экспорта данных:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet</artifactId>
<version>0.6.0</version>
</dependency>
Далее добавляем servlet экспорта метрик в web.xml и указываем путь, по которому метрики будут доступны:
<servlet>
<servlet-name>prometheus</servlet-name>
<servlet-class>io.prometheus.client.exporter.MetricsServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>prometheus</servlet-name>
<url-pattern>/metrics</url-pattern>
</servlet-mapping>
Не забываем добавить при необходимости политику доступа:
<http pattern="/metrics" security="none"/>
Теперь по адресу localhost:8080/metrics будет доступна статистика, но пока это пустая страница. Для того чтобы в ней появились данные, нужно зарегистрировать сбор метрик приложения.
Для использования Micrometer добавляем зависимости:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.1.3</version>
</dependency>
Дальше нужно зарегистрировать необходимые сборщики метрик:
@WebListener
public class PrometheusInitListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
PrometheusMeterRegistry meterRegistry =
new PrometheusMeterRegistry(PrometheusConfig.DEFAULT, CollectorRegistry.defaultRegistry, Clock.SYSTEM);
new ClassLoaderMetrics().bindTo(meterRegistry);
new JvmMemoryMetrics().bindTo(meterRegistry);
new JvmGcMetrics().bindTo(meterRegistry);
new ProcessorMetrics().bindTo(meterRegistry);
new JvmThreadMetrics().bindTo(meterRegistry);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
Готово, теперь если мы перейдем на localhost:8080/metrics, мы получим данные по работе JVM.
Выглядит это примерно так:
У Prometheus есть своя библиотека для статистики JVM приложений simpleclient_hotspot, которая настраивается вызовом DefaultExports.initialize(); в методе инициализации веб-слушателя.
Для настройки сбора метрик в prometheus.yml добавьте цель:
scrape_configs:
- job_name: 'test-server'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
metrics_path: /metrics
static_configs:
- targets: ['localhost:8080']
Собираемые метрики в Prometheus можно просматривать с помощью специального языка PromQL. Плюс Micrometr'a в том, что можно ничего не писать, а использовать готовые плагины для систем визуализации метрик.
Отображение метрик приложения в Grafana, плагин 4683
Автор: taluks