Spring Boot c Prometheus и Grafana. Локальная установка и настройка
Как только приложение запущено в производство, мы должны убедиться в том, что оно работает безперебойно. Хорошо, что у нас для этого есть полезные и действенные инструменты: Prometheus и Grafana, которые помогают нам выявить проблемы на ранней стадии и избежать катастроф в будущем. В этом руководстве мы покажем Вам, как включить метрики в приложении Spring Boot так, чтобы они могли собираться Prometheus и отображаться в Grafana. Настройка будет локальной с использованием Docker и Docker Compose, ее можно создать с помощью всего одной команды.
Приложение
В качестве примера я использую простое приложение Spring Boot, которое обрабатывает информацию о клиентах. Оно сохраняет информацию в базе данных SQL. Для простоты в приложении используется база данных H2. Она предоставляет REST API, позволяющий выполнять базовые CRUD-операции. В приложении есть класс загрузчика данных, который при запуске загружает в базу «фальшивые» данные, так что мы можем легко протестировать его. Полный код можно найти здесь: GitHub - polovyivan/spring-with-prometheus-grafana
Включение метрик Spring Boot
Сначала нам нужно включить метрики в нашем приложении Spring Boot. Для этого нам нужно добавить следующие зависимости, одну для Prometheus и другую для исполнительного механизма:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <scope>runtime</scope> </dependency>
В YAML-файл приложения нужно добавить следующую конфигурацию для открытия доступа к метрикам через конечную точку REST:
spring:
application:
name: spring-with-prometheus-grafana
management:
endpoints:
web:
exposure:
include: health, metrics, prometheus
metrics:
tags:
application: ${spring.application.name}
В конфигурации я указал тег для метрики для того, чтобы ее можно было запросить в Prometheus.
Когда мы запускаем приложение и выполняем запрос по URL:
http://localhost:8001/spring-with-prometheus-grafana/actuator/prometheus
Мы получаем широкий список метрик, собранных библиотекой Prometheus.
Конфигурация Prometheus
Теперь нам нужно дать команду на сканирование метрик. Для этого нам нужно создать файл следующего вида:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'spring-with-prometheus-grafana'
metrics_path: '/spring-with-prometheus-grafana/actuator/prometheus'
scrape_interval: 2s
static_configs:
- targets: [ 'host.docker.internal:8001' ]
labels:
app: 'spring-with-prometheus-grafana'
Этот файл определяет два конфига для сбора метрик. Один из них будет указывать Prometheus получать метрики из самого себя. Этот конфиг необязателен, просто мы хотели показать, что это возможно, и это хорошая метрика для обучения. Другой будет указывать Prometheus на получение метрик из приложения Spring Boot.
В обоих конфигурациях указывается имя и интервал сбора данных, определяющий частоту, с которой Prometheus будет получать метрики. В нашем случае Prometheus будет делать запрос к конечной точке метрик приложения SpringBoot, раскрытой в предыдущей главе, каждые 2 секунды. В разделе target мы указываем список хостов и портов, на которые Prometheus должен отправлять запросы. Подробнее об этих значениях я напишу чуть позже.
Конфигурация Grafana
Теперь нам нужно настроить Grafana на использование Prometheus в качестве источника данных. Для этого нам нужно создать следующий конфигурационный файл:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
jsonData:
httpMethod: POST
manageAlerts: true
prometheusType: Prometheus
prometheusVersion: 2.44.0
cacheLevel: 'High'
Это очень простой файл в формате YAML. Здесь я определяю Prometheus как источник данных, настраиваю URL и версию Prometheus. Это базовые настройки, но их более чем достаточно, чтобы Grafana могла запрашивать данные из Prometheus.
Собираем все вместе
Приложение Spring Boot будет запускаться из IntelliJ. Экземпляры Prometheus и Grafana будут размещены в контейнерах Docker. Чтобы упростить создание конфигурации, я использую Docker Compose, поскольку он позволяет создать файл определения docker-compose.yaml, а затем запустить его с помощью всего одной командой. Файл определения приведен ниже:
version: "3.8"
services:
grafana:
container_name: grafana
image: grafana/grafana:9.3.8
restart: always
ports:
- "3000:3000"
volumes:
- ./grafana:/etc/grafana/provisioning/datasources
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
networks:
- prometheus-network
prometheus:
container_name: prometheus
image: prom/prometheus:v2.44.0
user: root
volumes:
- ./prometheus:/etc/prometheus
command:
- --config.file=/etc/prometheus/prometheus-config.yaml
- --log.level=debug
ports:
- "9090:9090"
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- prometheus-network
networks:
prometheus-network:
Этот файл определяет два контейнера. Один из них - контейнер Grafana, основанный на официальном Docker-образе Grafana. Этот контейнер сопоставляет один том, который содержит файл конфигурации, созданный в предыдущей главе. При запуске контейнера Grafana подхватит этот файл и настроит на себя. В этом контейнере прописан порт, который позволит нам получить доступ к Grafana из браузера.
Второй контейнер - это контейнер Prometheus, основанный на официальном Docker-образе Prometheus. Как и у Grafana, у него есть отображение тома, и этот том содержит ранее созданный файл конфигурации. В разделе команд указывается путь к этому файлу конфигурации. При запуске Prometheus прочитает этот файл и настроит все описанные в нем задания. Контейнер открывает порт, чтобы мы могли получить доступ к пользовательскому интерфейсу Prometheus через браузер.
Файл определения docker-compose определяет сеть, к которой подключаются оба контейнера. Docker compose имеет внутреннюю DNS, поэтому контейнер Grafana может вызывать контейнер Prometheus, используя его имя службы. Поэтому в файле конфигурации Grafana URL имеет следующий вид:
http://prometheus:9090
Приложение Spring Boot запущено внутри IntelliJ и доступно с локального хоста. Если мы настроим Prometheus на использование localhost для связи с приложением Spring Boot, это не сработает, потому что контейнер Prometheus имеет свой собственный localhost. Когда он попытается связаться со своим локальным хостом, то получит ошибку, потому что приложение Spring boot запущено не внутри контейнера Prometheus, а на ПК. Поэтому для того, чтобы предоставить Prometheus доступ к портам ПК, определение контейнера должно быть следующим:
extra_hosts:
- "host.docker.internal:host-gateway"
В конфигурации Prometheus цель также указывает на этот адрес. При таком подходе Prometheus, запущенный внутри Docker-контейнера, может собирать метрики из процесса, запущенного на ПК.
Установка
Из директории, где находится файл docker-compose.yaml, выполните следующую команду:
$docker compose up
В зависимости от установки Docker compose Вам может понадобиться использовать тире «-» между docker и compose. Через несколько секунд все контейнеры будут созданы.
Prometheus начнет собирать метрики сразу же. Если приложение Spring Boot не работает, в журналах Prometheus Вы увидите следующие ошибки:
Как только вы запустите его, эти ошибки исчезнут.
Теперь мы можем получить доступ к пользовательскому интерфейсу Prometheus, набрав в браузере следующий адрес:
http://localhost:9090
Чтобы проверить список метрик, полученных с помощью Prometheus, нажмите на кнопку с изображением глобуса, как показано ниже:
Теперь метрика доступна для запросов.
Пользовательский интерфейс Prometheus ограничен, и здесь на помощь приходит Grafana. В браузере введите следующий адрес:
http://localhost:3000
Перейдите на вкладку Explore и в качестве источника данных выберите Prometheus, а затем браузер Metrics (чтобы просмотреть метрики прямо из приложения).
Вот так, выполнив всего одну команду, вы получили экземпляры Prometheus и Grafana, обрабатывающие метрики из весеннего приложения. В проекте есть коллекция Postman, поэтому Вы можете спокойно использовать ее для вызова REST API и просмотра изменений в метриках.
Заключение
Данная статья была написана специально для разработчиков, интересующихся метриками. Представленный здесь алгоритм установки поможет понять, как метрики попадают из приложения в Prometheus, а затем в Grafana. Используя эту настройку локально, Вы сможеье определить метрики, протестировать их, а затем воспроизвести поток в производственной среде.










