Вступление
Мониторинг состояния и показателей приложения помогает нам лучше управлять им, замечать неоптимизированное поведение и приближаться к его производительности. Это особенно верно, когда мы разрабатываем систему с множеством микросервисов, где мониторинг каждой службы может оказаться решающим, когда дело доходит до обслуживания нашей системы.
Основываясь на этой информации, мы можем сделать выводы и решить, какой микросервис необходимо масштабировать, если дальнейшее улучшение производительности не может быть достигнуто при текущей настройке.
В этой статье мы расскажем, как отслеживать веб-приложения Spring Boot. Для этого мы будем использовать три проекта:
- Микрометр : показывает показатели из нашего приложения.
- Прометей : хранит наши метрические данные
- Grafana : визуализирует наши данные в виде графиков
Это может показаться большим, особенно по сравнению с простым использованием проекта Spring Boot Actuator , но реализовать их все с помощью всего лишь нескольких конфигураций очень легко.
Чтобы упростить задачу, мы будем использовать Docker для запуска Prometheus и Grafana, поскольку у них обоих есть официальные образы Docker. Если вы не знакомы с Docker, вы можете прочитать нашу статью Docker: A High-Level Introduction .
Обратите внимание, что эти показатели предоставят вам агрегированную информацию за определенный период времени. Если вы хотите проверить информацию об отдельном запросе в определенное время и о том, что с ним произошло, это может быть не решением для вас.
В этом случае вам, вероятно, понадобится распределенная система трассировки, о которой мы подробно рассказали в разделе «Распределенная трассировка с помощью Sleuth» .
Привод пружинного ботинка
Мы начнем с простой службы REST с использованием Spring
Initializr, которая содержит единственную
конечную точку /hello
и работает на порте по умолчанию 8080
.
Кроме того, это приложение также имеет spring-boot-starter-actuator
,
которая предоставляет готовые к работе конечные
точки,
которые вы можете использовать для своего приложения. Эти конечные точки
имеют общий префикс /actuator
и по умолчанию защищены.
Раскройте их по отдельности или все сразу, добавив следующие свойства в
application.properties
:
management.endpoints.web.exposure.include=*
Чтобы проверить, давайте перейдем в нашем браузере по
http://localhost:8080/actuator
:
{.ezlazyload}
Вы можете увидеть все конечные точки, которые предоставляет Actuator,
такие как /health
, /metrics
, /mappings
и т. Д. Давайте откроем
/metrics
Actuator, перейдя в нашем браузере по
http://localhost:8080/actuator/metrics
:
{.ezlazyload}
Как видите, здесь есть много информации о нашем приложении, такой как информация о потоках, сеансах Tomcat, классах, буфере и т. Д. Давайте углубимся и получим информацию об используемой памяти JVM:
{.ezlazyload}
Теперь использование Spring Boot Actuator, подобного этому, дает много информации о вашем приложении, но это не очень удобно для пользователя. Его можно интегрировать с Spring Boot Admin для визуализации, но он имеет свои ограничения и менее популярен.
Такие инструменты, как Prometheus, Netflix Atlas и Grafana, чаще используются для мониторинга и визуализации и не зависят от языка и фреймворка.
Каждый из этих инструментов имеет свой собственный набор форматов
данных, и преобразование /metrics
для каждого из них было бы
проблемой. Чтобы избежать их преобразования, нам нужен независимый от
производителя поставщик данных, например Micrometer .
Микрометр
Чтобы решить эту проблему, будучи независимым поставщиком данных, возникла компания Micrometer. Он предоставляет метрики Actuator внешним системам мониторинга, таким как Prometheus, Netflix Atlas, AWS Cloudwatch и многим другим.
Они совершенно правильно называют себя:
Подумайте о SLF4J, но для метрик.
Напоминаем, что SLF4J - это фасад журналирования для других фреймворков ведения журналов Java. Сам SLF4J не имеет реализации протоколирования. Идея состоит в том, что вы пишете код, используя API SLF4J, и его реальная реализация исходит из выбранной вами структуры. Это может быть любой из популярных фреймворков, например log4j , logback и т. Д.
Точно так же Micrometer автоматически предоставляет данные
/actuator/metrics
в то, что ваша система мониторинга может понять.
Все, что вам нужно сделать, это включить эту зависимость микрометра от
производителя в ваше приложение.
Micrometer - это отдельный проект с открытым исходным кодом, которого
нет в экосистеме Spring, поэтому мы должны явно добавить его в качестве
зависимости. Поскольку мы будем использовать Prometheus , давайте
добавим его конкретную зависимость в наш pom.xml
:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Перестройте, запустите приложение и перейдите в браузере по
http://localhost:8080/actuator
:
{.ezlazyload}
Это сгенерирует новую конечную точку - /actuator/prometheus
. Открыв
его, вы увидите данные, отформатированные специально для Prometheus :
{.ezlazyload}
Прометей
Prometheus - это база данных временных рядов, которая хранит наши метрические данные, периодически извлекая их (с помощью встроенного сборщика данных) через HTTP. Конечно, можно настроить интервалы между запросами, и мы должны предоставить URL-адрес для получения. Он также имеет простой пользовательский интерфейс, в котором мы можем визуализировать / запрашивать все собранные метрики.
Давайте настроим Prometheus, а точнее интервал очистки, цели и т. Д. Для
этого мы будем использовать файл prometheus.yml
global:
scrape_interval: 10s
scrape_configs:
- job_name: 'spring_micrometer'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.2.8:8080']
Как видите, у нас есть scrape_configs
котором мы можем определить
список заданий и указать URL-адрес, путь метрики и интервал. Если вы
хотите узнать больше о конфигурациях Prometheus, посетите официальную
документацию
.
Примечание. Поскольку мы используем Docker для запуска Prometheus,
он будет работать в сети Docker, которая не будет понимать
localhost/120.0.01
, как вы могли ожидать. Поскольку наше приложение
работает на localhost
, а для контейнера Docker localhost
означает
его собственную сеть, мы должны указать IP-адрес нашей системы вместо
него.
Таким образом , вместо того , чтобы использовать locahost:8080
,
192.168.2.8:8080
используется там , где 192.168.2.8
мой PC IP в
данный момент.
Чтобы проверить IP-адрес вашей системы, вы можете запустить ipconfig
или ifconfig
в своем терминале, в зависимости от вашей ОС.
Теперь мы можем запустить Prometheus с помощью команды Docker:
$ docker run -d -p 9090:9090 -v <path-to-prometheus.yml>:/etc/prometheus/prometheus.yml prom/prometheus
<path-to-prometheus.yml>
- это место, где ваш собственный
prometheus.yml
начинается с корня. Например, это работает на моем
локальном ПК с Windows:
$ docker run -d -p 9090:9090 -v $PWD/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
Чтобы увидеть панель управления Prometheus, перейдите в браузере по адресу http: // localhost: 9090 :
{.ezlazyload}
Чтобы проверить, действительно ли Prometheus слушает приложение Spring,
вы можете перейти к конечной точке /targets
{.ezlazyload}
Вернемся на домашнюю страницу, выберем метрику из списка и нажмем « Выполнить» :
{.ezlazyload}
Язык запросов Prometheus - PromQL
Еще одно замечание: у Prometheus есть собственный язык запросов под названием PromQL. Это позволяет пользователю выбирать и агрегировать данные временных рядов в реальном времени, сохраняя их в графическом или табличном формате. Кроме того, вы можете передать его внешнему API через HTTP.
Если вы хотите узнать больше о PromQL, официальная документация подробно описывает это.
Графана
В то время как Prometheus действительно обеспечивает некоторую грубую визуализацию, Grafana предлагает богатый пользовательский интерфейс, в котором вы можете быстро создавать собственные графики и мгновенно создавать информационную панель из множества графиков. Вы также можете бесплатно импортировать множество информационных панелей, созданных сообществом, и приступить к работе.
Графана может извлекать данные из различных источников данных , таких как Прометей, Elasticsearch , InfluxDB и т.д. Она также позволяет вам установить правила на основе предупреждений, которые затем могут извещать вас над отними, электронная почту, Hipchat, и подобной.
Начнем с запуска Grafana с помощью Docker:
$ docker run -d -p 3000:3000 grafana/grafana
Если вы посетите http://localhost:3000
, вы будете перенаправлены на
страницу входа:
{.ezlazyload}
Имя пользователя по умолчанию admin
и пароль по умолчанию admin
. Вы
можете изменить их на следующем шаге, который настоятельно
рекомендуется:
{.ezlazyload}
Поскольку Grafana работает со многими источниками данных, нам нужно определить, на какой из них мы полагаемся. Выберите Prometheus в качестве источника данных:
{.ezlazyload}
Теперь добавьте URL-адрес, на котором работает Prometheus, в нашем
случае http://localhost:9090
и выберите Доступ через браузер.
На этом этапе мы можем сохранить и проверить, правильно ли работает источник данных:
{.ezlazyload}
Как уже говорилось ранее, у Grafana есть множество готовых панелей мониторинга . Для проектов Spring Boot популярна панель управления JVM:
{.ezlazyload}
Введите URL-адрес панели управления, выберите «Уже созданный источник данных Prometheus» и нажмите « Импорт» :
{.ezlazyload}
Заключение
Мониторинг состояния и показателей приложения помогает нам лучше управлять им, замечать неоптимизированное поведение и лучше понимать его производительность. Это особенно верно, когда мы разрабатываем систему с множеством микросервисов, где мониторинг каждой службы может оказаться решающим, когда дело доходит до обслуживания нашей системы.
Основываясь на этой информации, мы можем сделать выводы и решить, какой микросервис необходимо масштабировать, если дальнейшее улучшение производительности не может быть достигнуто при текущей настройке.
В этой статье мы использовали Micrometer для переформатирования данных метрик, предоставляемых Spring Boot Actuator, и предоставления их в новой конечной точке. Эти данные затем регулярно извлекались и сохранялись Prometheus, который представляет собой базу данных временных рядов. В конечном итоге мы использовали Grafana для визуализации этой информации с помощью удобной панели управления.
Как всегда, код примеров, использованных в этой статье, можно найти на GitHub .