Мониторинг приложений Spring Boot с помощью Micrometer, Prometheus и Grafana

Введение Мониторинг состояния и показателей приложения помогает нам лучше управлять им, замечать неоптимизированное поведение и приближаться к его производительности. Это особенно верно, когда мы разрабатываем систему с множеством микросервисов, где мониторинг каждой службы может оказаться решающим, когда дело доходит до обслуживания нашей системы. Основываясь на этой информации, мы можем сделать выводы и решить, какой микросервис необходимо масштабировать, если дальнейшее улучшение производительности не может быть достигнуто с помощью текущей настройки.

Вступление

Мониторинг состояния и показателей приложения помогает нам лучше управлять им, замечать неоптимизированное поведение и приближаться к его производительности. Это особенно верно, когда мы разрабатываем систему с множеством микросервисов, где мониторинг каждой службы может оказаться решающим, когда дело доходит до обслуживания нашей системы.

Основываясь на этой информации, мы можем сделать выводы и решить, какой микросервис необходимо масштабировать, если дальнейшее улучшение производительности не может быть достигнуто при текущей настройке.

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

страница входа в системуGrafana{.ezlazyload}

Имя пользователя по умолчанию admin и пароль по умолчанию admin . Вы можете изменить их на следующем шаге, который настоятельно рекомендуется:

графана приборнаяпанель{.ezlazyload}

Поскольку Grafana работает со многими источниками данных, нам нужно определить, на какой из них мы полагаемся. Выберите Prometheus в качестве источника данных:

источник данныхgrafana{.ezlazyload}

Теперь добавьте URL-адрес, на котором работает Prometheus, в нашем случае http://localhost:9090 и выберите Доступ через браузер.

На этом этапе мы можем сохранить и проверить, правильно ли работает источник данных:

обновление источника данныхgrafana{.ezlazyload}

Как уже говорилось ранее, у Grafana есть множество готовых панелей мониторинга . Для проектов Spring Boot популярна панель управления JVM:

импорт источника данныхgrafana{.ezlazyload}

Введите URL-адрес панели управления, выберите «Уже созданный источник данных Prometheus» и нажмите « Импорт» :

jvm источник данныхgrafana{.ezlazyload}

Заключение

Мониторинг состояния и показателей приложения помогает нам лучше управлять им, замечать неоптимизированное поведение и лучше понимать его производительность. Это особенно верно, когда мы разрабатываем систему с множеством микросервисов, где мониторинг каждой службы может оказаться решающим, когда дело доходит до обслуживания нашей системы.

Основываясь на этой информации, мы можем сделать выводы и решить, какой микросервис необходимо масштабировать, если дальнейшее улучшение производительности не может быть достигнуто при текущей настройке.

В этой статье мы использовали Micrometer для переформатирования данных метрик, предоставляемых Spring Boot Actuator, и предоставления их в новой конечной точке. Эти данные затем регулярно извлекались и сохранялись Prometheus, который представляет собой базу данных временных рядов. В конечном итоге мы использовали Grafana для визуализации этой информации с помощью удобной панели управления.

Как всегда, код примеров, использованных в этой статье, можно найти на GitHub .

comments powered by Disqus