Сбор метрик Spring Boot приложения c помощью Prometheus и Grafana

от автора

В данной статье рассмотрен полный цикл работы с метриками. В начале, настройка приложения для поставки метрик. Настройка Prometheus для сбора и хранения метрик. Настройка Grafana для отображения собранных метрик.

Требования

1. Maven, но можно адаптировать под другие сборщики.

2. Docker и docker-compose для запуска Prometheus и Grafana.

3. Spring boot 2 и выше, однако есть и порты для прошлых версий.

Введение

С выхода Spring boot 2 Micrometer стал провайдером метрик по умолчанию. С его помощью стало гораздо проще интегрировать приложение к различным провайдерам. В текущем руководстве Prometheus используется в качестве сборщика метрик.

Все примеры кода и скриптов для настройки окружения доступны на github

Настройка приложения

[Создание примера с помощью spring initilizr] опционально

Необходимо создать spring boot приложение и добавить необходимые зависимости.

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-web</artifactId> </dependency>

Настройка actuator

Spring boot предоставляет механизм, который позволяет получать различные метаданные приложения. Для этого необходимо добавить зависимость.

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

По-умолчанию, actutor находится на порту 8080 и uri /actuator

В приложении-примере на github actuator находится по следующему адресу localhost:8080/actuator

Если зайти на эту страницу, отобразится следующий ответ.

{    "_links":{       "self":{          "href":"http://localhost:8080/actuator",          "templated":false       },       "health-path":{          "href":"http://localhost:8080/actuator/health/{*path}",          "templated":true       },       "health":{          "href":"http://localhost:8080/actuator/health",          "templated":false       },       "info":{          "href":"http://localhost:8080/actuator/info",          "templated":false       }    } }

Теперь actuator настроен и мы можем добавить метрики.

Добавление метрик

Micrometer по-умолчанию включен в зависимости spring boot, нам лишь необходимо добавить адаптер в необходимый нам формат, так как в руководстве использован Prometheus необходимо добавить следующую зависимость.

<dependency>     <groupId>io.micrometer</groupId>     <artifactId>micrometer-registry-prometheus</artifactId> </dependency>

Далее необходимо отредактировать файл application.ymlдля отображения эндпоинта Prometheus в actuator.

management:   endpoints:     web:       exposure:         include: health,prometheus   metrics:     export:       prometheus:         enabled: true     distribution:       percentiles-histogram:         "[http.server.requests]": true

Здесь включены health,prometheusэндпоинты в actuator. Включен экспорт метрик в Prometheus, а также `percentiles-histogram`, которая позволяет верхнеуровнего оценить sla эндпоинтов приложения.

Теперь, если запустить приложение и зайти по адресу http://localhost:8080/actuator/prometheusдолжен отобразиться вывод примерно следующего содержания.

# TYPE jvm_memory_committed_bytes gauge jvm_memory_committed_bytes{area="heap",id="G1 Survivor Space",} 9437184.0 jvm_memory_committed_bytes{area="heap",id="G1 Old Gen",} 9.961472E7 jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 4.2254336E7 jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 2555904.0 # TYPE jvm_gc_live_data_size_bytes gauge jvm_gc_live_data_size_bytes 0.0 # HELP tomcat_sessions_active_max_sessions   # TYPE tomcat_sessions_active_max_sessions gauge tomcat_sessions_active_max_sessions 0.0 # HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads # TYPE jvm_threads_live_threads gauge jvm_threads_live_threads 27.0

Тут видна особенность, что метрики jvm доступны по-умолчанию.

Настройка окружения для сбора и отображения метрик

Файл docker-compose.ymlдля Prometheus и Grafana.

version: '3.7'  services:   grafana:     build: './config/grafana'     ports:       - 3000:3000     volumes:       - ./grafana:/var/lib/grafana     environment:       - GF_SECURITY_ADMIN_USER=admin       - GF_SECURITY_ADMIN_PASSWORD=admin     networks:       monitoring:         aliases:           - grafana   prometheus:     image: prom/prometheus     ports:       - 9090:9090     volumes:       - ./config/prometheus.yml:/etc/prometheus/prometheus.yml       - ./prometheus:/prometheus     networks:       monitoring:         aliases:           - prometheus networks:   monitoring:

Как можно заметить, образ Grafana собирается, это связано с тем, что настройка импорта дашбордов из файла работает некорректно при работе с volume.

Я включил в комплект с grafana два популярных дашборда для мониторинга, т.е Dockerfileдля Grafana выглядит следующим образом.

FROM grafana/grafana ADD ./provisioning /etc/grafana/provisioning

Подробнее ознакомиться с преднастроеным окружением можно по ссылке.

Далее необходимо внести изменения в файл prometheus.ymlдля сбора метрик.

В нашем случае файл выглядит следующим образом.

scrape_configs:   - job_name: 'sample_monitoring'     scrape_interval: 5s     metrics_path: '/actuator/prometheus'     static_configs:       - targets: ['host.docker.internal:8080']

Результат и отображение дашбордов

В подготовленном примере, сразу при запуске добавляется два популярных дашборда.

1. JVM

2. Response throughput

Заключение

1. Настроено приложение, которое предоставляет метрики.

2. Настроен сбор метрик с помощью Prometheus.

3. Настроены дашборды для визуализации результата в Grafana.

Ссылки

Приложение пример на github

ссылка на оригинал статьи https://habr.com/ru/post/548700/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *