基于Grafana+Prometheus实现k8s上的SpringBoot工程JVM监控
一文教你部署在k8s上面的springboot应用如何实时监控硬件状态、JVM状态。
前言
对于一个SpringBoot工程应用来说,失去JVM监控的SpringBoot应用就好像脱缰的野马,他今天可能跑得好好的,但是明天他可能发飙,而作为主人的我们无法控制他,这对于应用来说也是致命的。
当SpringBoot工程迁移到k8s上面之后,在如何监控工程运行的资源状况比如CPU、内存、磁盘以及JVM相关信息比如队内存、线程、类加载等的方面,比起服务器本地直接部署,在k8s的环境按照原来的监控的体系已经是不适用了,因为应用不再是指定服务器,也可能是集群。
那怎么办? 一个个pod监控吗?
这时候回想起,当初搭建k8s整套体系中,其中就有使用Grafana+Prometheus实现k8s所有对象的监控。
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能
Prometheus是由SoundCloud开发的开源监控系统的开源版本。2016年,由Google发起的Linux基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目(背景强大)。
下图就是基于Grafana+Prometheus实现的k8s节点、pod、service的资源监控,通过这个就可以实现我们Springboot工程的硬件资源监控。
实现JSON文件如下:
回到我们的主题,如何实现SpringBoot工程在k8s上面的JVM监控,对于一般的Java的Java工程,我们一般使用jdk自带监控工具:jconsole
和jvisualvm
,或者使用命令行jstat
等。
通过这个就可以说明运行中的SpringBoot工程的JVM状态是有可读取的入口的
,那是否可以将这些JVM状态数据通过接口方式输出,以Grafana+Prometheus作为承载体,将k8s中的SpingBoot的JVM状态可视化呢?
那肯定是可以的。That’s why i write .
原理
Spring-Boot-Actuator
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息、健康检查、审计、统计和HTTP追踪等.
Actuator同时还可以与外部应用监控系统整合,比如Prometheus。可以选择使用HTTP端点或JMX来管理和监视应用程序。
Actuator使用Micrometer来整合上面提到的外部应用监控系统Prometheus。这使得只要通过非常小的配置就可以集成任何应用监控系统。
实现原理说明
在SpringBoot工程中使用spring-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>
application配置
# 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
prometheus配置
添加actuator读取源
- job_name: 'center-actuator'
metrics_path: /actuator/prometheus
static_configs:
- targets: ['192.168.1.240:8080']
job_name
: 定义唯一prometheus任务名称,自定义
metrics_path
: 访问路径,actuator一般固定这个
targets
: 服务访问入口集合
访问prometheus
Grafana配置
效果:
总结
通过上面的一顿操作,要监控k8s上面的springboot应用JVM什么的已经不成问题,甚至通过这种方式还可以持久化监控数据以及实现自动化告警,我认为只要应用上了k8s,最好都做持久化的监控,目前来说最优的方案还是Grafana+Prometheus
。其次,有的朋友可能问那怎么查看具体线程堆栈情况、堆内存内部情况,这种的话目前是使用arthas,基于arthas 实现线上应用的具体调优
。
更多推荐
所有评论(0)