前言

对于一个SpringBoot工程应用来说,失去JVM监控的SpringBoot应用就好像脱缰的野马,他今天可能跑得好好的,但是明天他可能发飙,而作为主人的我们无法控制他,这对于应用来说也是致命的。

当SpringBoot工程迁移到k8s上面之后,在如何监控工程运行的资源状况比如CPU、内存、磁盘以及JVM相关信息比如队内存、线程、类加载等的方面,比起服务器本地直接部署,在k8s的环境按照原来的监控的体系已经是不适用了,因为应用不再是指定服务器,也可能是集群。

那怎么办? 一个个pod监控吗?

image-20200818232537090

这时候回想起,当初搭建k8s整套体系中,其中就有使用Grafana+Prometheus实现k8s所有对象的监控。

Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能

Prometheus是由SoundCloud开发的开源监控系统的开源版本。2016年,由Google发起的Linux基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目(背景强大)。

下图就是基于Grafana+Prometheus实现的k8s节点、pod、service的资源监控,通过这个就可以实现我们Springboot工程的硬件资源监控。

image-20200818232722649

实现JSON文件如下:

基于Grafana+Prometheus实现k8s资源监控

回到我们的主题,如何实现SpringBoot工程在k8s上面的JVM监控,对于一般的Java的Java工程,我们一般使用jdk自带监控工具:jconsolejvisualvm,或者使用命令行jstat等。

image-20200818235246951

通过这个就可以说明运行中的SpringBoot工程的JVM状态是有可读取的入口的,那是否可以将这些JVM状态数据通过接口方式输出,以Grafana+Prometheus作为承载体,将k8s中的SpingBoot的JVM状态可视化呢?

那肯定是可以的。That’s why i write .

image-20200819000415018

原理

Spring-Boot-Actuator

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息、健康检查、审计、统计和HTTP追踪等.
Actuator同时还可以与外部应用监控系统整合,比如Prometheus。可以选择使用HTTP端点或JMX来管理和监视应用程序。
Actuator使用Micrometer来整合上面提到的外部应用监控系统Prometheus。这使得只要通过非常小的配置就可以集成任何应用监控系统。

详细查看Spring-Boot-Actuator官方文档

实现原理说明

在SpringBoot工程中使用spring-boot-actor,以http的方式将jvm等状态数据输出,Prometheus通过配置读取接口数据方式,将jvm等状态数据进行存储,最后在Grafana中配置Prometheus数据源,设计相关图表,通过Prometheus SQL读取存储的状态数据返回到页面渲染图标,实现运行在k8s中的springboot应用jvm可视化监控.
在这里插入图片描述

实现

环境说明

softversion
java1.8
springboot2.1.0.RELEASE
Spring-Boot-Actuator2.1.0.RELEASE
grafana-amd64v5.0.4
prometheusv2.0.0
k8s1.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配置

springboot监控面板JSON

效果:
在这里插入图片描述

总结

通过上面的一顿操作,要监控k8s上面的springboot应用JVM什么的已经不成问题,甚至通过这种方式还可以持久化监控数据以及实现自动化告警,我认为只要应用上了k8s,最好都做持久化的监控,目前来说最优的方案还是Grafana+Prometheus。其次,有的朋友可能问那怎么查看具体线程堆栈情况、堆内存内部情况,这种的话目前是使用arthas基于arthas 实现线上应用的具体调优

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐