предисловие
Для инженерного приложения SpringBoot приложение SpringBoot без JVM-мониторинга похоже на дикую лошадь: сегодня он может хорошо работать, а завтра может сойти с ума, и мы, как мастер, не можем его контролировать, что справедливо и для приложения, смертельно опасно.
Когда проект SpringBoot переносится на k8s выше, с точки зрения того, как отслеживать состояние инженерных ресурсов для запуска, таких как ЦП, память, диск и информация, связанная с JVM, такая как командная память, потоки, такие как загрузка классов, по сравнению с прямой локальной сервер развернут в среде k8s По исходной системе мониторинга уже не применяется, т.к. приложение больше не является назначенным сервером, либо это может быть кластер.
Что делать тогда? Вы отслеживаете стручки один за другим?
В это время я вспомнил, что когда я собирал всю систему k8s, Grafana+Prometheus использовался для мониторинга всех объектов в k8s.
Grafana — это инструмент визуализации данных с открытым исходным кодом, разработанный на языке Go, который может выполнять мониторинг данных и статистику данных с функцией сигнализации.
Prometheus — это версия системы мониторинга с открытым исходным кодом, разработанная SoundCloud. В 2016 году Linux Foundation (Cloud Native Computing Foundation, CNCF), инициированная Google, включила Prometheus в качестве второго по величине проекта с открытым исходным кодом (с большим опытом).
На следующем рисунке показан мониторинг ресурсов узлов, модулей и сервисов k8s на основе Grafana + Prometheus Благодаря этому мы можем реализовать мониторинг аппаратных ресурсов нашего проекта Springboot.
Файл реализации JSON выглядит следующим образом:
Реализовать мониторинг ресурсов k8s на базе Grafana+Prometheus
Вернемся к нашей теме, как реализовать JVM-мониторинг проекта SpringBoot на k8s. Для общих Java-проектов мы обычно используем собственные инструменты мониторинга jdk:jconsoleа такжеjvisualvmили используйте командную строкуjstatЖдать.
Благодаря этому мы можем проиллюстрировать работающий проект SpringBoot.JVM状态是有可读取的入口的, можно ли вывести эти данные состояния JVM через интерфейс и использовать Grafana+Prometheus в качестве носителя для визуализации состояния JVM SpingBoot в k8s?
Это, безусловно, возможно. Вот почему я пишу.
принцип
Spring-Boot-Actuator
SpringBoot имеет собственную функцию мониторинга Actuator, которая может помочь контролировать внутреннюю работу программы, такую как состояние мониторинга, загрузка bean-компонентов, переменные среды, информация журнала, информация о потоках, проверка работоспособности, аудит, статистика и отслеживание HTTP и т. д. Actuator также может интегрироваться с внешними системами мониторинга приложений, такими как Prometheus. Вы можете использовать конечные точки HTTP или JMX для управления и мониторинга приложений. Actuator использует Micrometer для интеграции с Prometheus, упомянутой выше внешней системой мониторинга приложений. Это позволяет интегрировать любую систему мониторинга приложений с минимальной конфигурацией.
Подробнее см. в официальной документации Spring-Boot-Actuator.
Описание принципа реализации
Использование в проекте SpringBootspring-boot-actor,кhttpСпособ вывода данных состояния, таких как 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 实现线上应用的具体调优.