Мониторинг JVM проекта SpringBoot на k8s на базе Grafana+Prometheus

Kubernetes

предисловие

Для инженерного приложения SpringBoot приложение SpringBoot без JVM-мониторинга похоже на дикую лошадь: сегодня он может хорошо работать, а завтра может сойти с ума, и мы, как мастер, не можем его контролировать, что справедливо и для приложения, смертельно опасно.

Когда проект SpringBoot переносится на k8s выше, с точки зрения того, как отслеживать состояние инженерных ресурсов для запуска, таких как ЦП, память, диск и информация, связанная с JVM, такая как командная память, потоки, такие как загрузка классов, по сравнению с прямой локальной сервер развернут в среде k8s По исходной системе мониторинга уже не применяется, т.к. приложение больше не является назначенным сервером, либо это может быть кластер.

Что делать тогда? Вы отслеживаете стручки один за другим?

image-20200818232537090

В это время я вспомнил, что когда я собирал всю систему k8s, Grafana+Prometheus использовался для мониторинга всех объектов в k8s.

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

Prometheus — это версия системы мониторинга с открытым исходным кодом, разработанная SoundCloud. В 2016 году Linux Foundation (Cloud Native Computing Foundation, CNCF), инициированная Google, включила Prometheus в качестве второго по величине проекта с открытым исходным кодом (с большим опытом).

На следующем рисунке показан мониторинг ресурсов узлов, модулей и сервисов k8s на основе Grafana + Prometheus Благодаря этому мы можем реализовать мониторинг аппаратных ресурсов нашего проекта Springboot.

image-20200818232722649

Файл реализации JSON выглядит следующим образом:

Реализовать мониторинг ресурсов k8s на базе Grafana+Prometheus

Вернемся к нашей теме, как реализовать JVM-мониторинг проекта SpringBoot на k8s. Для общих Java-проектов мы обычно используем собственные инструменты мониторинга jdk:jconsoleа такжеjvisualvmили используйте командную строкуjstatЖдать.

image-20200818235246951

Благодаря этому мы можем проиллюстрировать работающий проект SpringBoot.JVM状态是有可读取的入口的, можно ли вывести эти данные состояния JVM через интерфейс и использовать Grafana+Prometheus в качестве носителя для визуализации состояния JVM SpingBoot в k8s?

Это, безусловно, возможно. Вот почему я пишу.

image-20200819000415018

принцип

Spring-Boot-Actuator

SpringBoot имеет собственную функцию мониторинга Actuator, которая может помочь контролировать внутреннюю работу программы, такую ​​как состояние мониторинга, загрузка bean-компонентов, переменные среды, информация журнала, информация о потоках, проверка работоспособности, аудит, статистика и отслеживание HTTP и т. д. Actuator также может интегрироваться с внешними системами мониторинга приложений, такими как Prometheus. Вы можете использовать конечные точки HTTP или JMX для управления и мониторинга приложений. Actuator использует Micrometer для интеграции с Prometheus, упомянутой выше внешней системой мониторинга приложений. Это позволяет интегрировать любую систему мониторинга приложений с минимальной конфигурацией.

Подробнее см. в официальной документации Spring-Boot-Actuator.

Описание принципа реализации

Использование в проекте SpringBootspring-boot-actorhttpСпособ вывода данных состояния, таких как jvm, Prometheus сохраняет данные состояния, такие как jvm, путем настройки способа чтения данных интерфейса и, наконец, вGrafanaСредняя конфигурацияPrometheusИсточник данных, диаграммы, связанные с дизайном, чтение сохраненных данных о состоянии через Prometheus SQL и возврат к значкам рендеринга страницы,实现运行在k8s中的springboot应用jvm可视化监控. 在这里插入图片描述

выполнить

Описание окружающей среды

soft version
java 1.8
springboot 2.1.0.RELEASE
Spring-Boot-Actuator 2.1.0.RELEASE
grafana-amd64 v5.0.4
prometheus v2.0.0
k8s 1.16.0

Springboot вводит зависимости

        <!-- monitor -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.1.0</version>
        </dependency>

конфигурация приложения

#  Actuator config
management.endpoints.web.exposure.include=*
management.metrics.tags.application=${spring.application.name}
management.metrics.export.prometheus.enabled=true
management.endpoint.health.show-details=always
management.endpoints.web.exposure.exclude=env,beans

Просмотр метрических данных

доступhttp://localhost:8080/actuator/prometheus localhost:8080: 项目访问地址

Вы можете увидеть следующий вывод:

# HELP rabbitmq_published_total  
# TYPE rabbitmq_published_total counter
rabbitmq_published_total{application="center",name="rabbit",} 0.0
# HELP tomcat_global_sent_bytes_total  
# TYPE tomcat_global_sent_bytes_total counter
tomcat_global_sent_bytes_total{application="center",name="http-nio-8080",} 31.0
# HELP jvm_gc_max_data_size_bytes Max size of old generation memory pool
# TYPE jvm_gc_max_data_size_bytes gauge
jvm_gc_max_data_size_bytes{application="center",} 2.803367936E9
# HELP tomcat_threads_current_threads  
# TYPE tomcat_threads_current_threads gauge
tomcat_threads_current_threads{application="center",name="http-nio-8084",} 10.0
# HELP tomcat_sessions_active_current_sessions  
# TYPE tomcat_sessions_active_current_sessions gauge
tomcat_sessions_active_current_sessions{application="center",} 0.0
# HELP rabbitmq_channels  
# TYPE rabbitmq_channels gauge
rabbitmq_channels{application="center",name="rabbit",} 1.0
# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time
# TYPE system_load_average_1m gauge
system_load_average_1m{application="center",} 1.53
# HELP tomcat_sessions_rejected_sessions_total  
# TYPE tomcat_sessions_rejected_sessions_total counter
tomcat_sessions_rejected_sessions_total{application="center",} 0.0
# HELP tomcat_threads_busy_threads  
# TYPE tomcat_threads_busy_threads gauge
tomcat_threads_busy_threads{application="center",name="http-nio-8084",} 1.0
# HELP tomcat_sessions_created_sessions_total  
# TYPE tomcat_sessions_created_sessions_total counter
tomcat_sessions_created_sessions_total{application="center",} 0.0
# HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC
# TYPE jvm_gc_memory_promoted_bytes_total counter
jvm_gc_memory_promoted_bytes_total{application="center",} 1.37307128E8
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{application="center",id="direct",} 7.0
jvm_buffer_count_buffers{application="center",id="mapped",} 0.0

конфигурация прометея

Добавить привод для чтения источника

  - job_name: 'center-actuator'
      metrics_path: /actuator/prometheus
      static_configs:
      - targets: ['192.168.1.240:8080']

job_name: определить уникальное имя задачи prometheus, пользовательскоеmetrics_path: путь доступа, актуатор обычно исправил этоtargets: Коллекция записей доступа к службе

посетить Прометея

在这里插入图片描述

Конфигурация Графана

панель мониторинга springboot JSON

Эффект:在这里插入图片描述

Суммировать

С помощью вышеуказанной операции больше не проблема контролировать JVM приложения springboot на k8s.Даже таким образом данные мониторинга могут сохраняться и могут быть реализованы автоматические аварийные сигналы.Я думаю, что пока применяется k8s, лучше всего делать настойчивость В настоящее время оптимальное решение по-прежнемуGrafana+Prometheus. Во-вторых, некоторые друзья могут спросить, как проверить конкретную ситуацию стека потока и внутреннюю ситуацию кучи памяти, В этом случае в настоящее время используетсяarthas,基于arthas 实现线上应用的具体调优.