
В данной статье рассмотрен полный цикл работы с метриками. В начале, настройка приложения для поставки метрик. Настройка 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


Заключение
1. Настроено приложение, которое предоставляет метрики.
2. Настроен сбор метрик с помощью Prometheus.
3. Настроены дашборды для визуализации результата в Grafana.
          
 
Sora
Спасибо, неплохой «рецепт», как раз понадобилось поковырять.