携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
一、简介
干嘛的:
主要运用在微服务架构,所以我建议你先学微服务,否则可能get不到它的用处,只有大型的分布式系统才会用到指标监控... Why? 对于一个大型的几十个、几百个微服务构成的微服务架构系统,在线上时通常会遇到下面一些问题,比如:
-
如何知道哪些服务除了问题,如何快速定位? (健康状况)
-
如何统一监控各个微服务的性能指标(内存、jvm、并发数、线程池、Http 请求统计)
-
如何统一管理各个微服务的日志?(切换线上日志等级,快速搜索日志...)
-
如何优雅管理服务下线(正在运行的线程不发生中断)
So: 在这种大型分布式应用的环境下,我们如何能够快速发现问题、快速解决问题, 必须要有监控平台、(链路追踪、日志)
二、SpringBoot Actuator
2-1、介绍:
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等
2-2、Actuator的搭建
2-2-1、项目的创建
首先还创建一个父项目,然后再父项目下创建一个Module,设置好相关项目名称和包名,最后需要引入spring web
以及Ops下的spring boot actuator
然后在module项目的pom.xml中的parent改为父项目的信息,如下
然后再修改父项目的打包方式改为pom,因为父项目不需要进行打包
在父项目中将模块添加进去
2-2-2、子模块的pom
2-3、官方的介绍
具体可以看下官网对于Actuator的介绍 docs.spring.io/spring-boot…
2-4、启动服务并访问
访问 http://localhost:8080/actuator/
可以看到页面列出了四个url,这就是Actuator的Endpoints,通过断点可以监控服务的一些相关情况。(其中health和info为端点)
比如访问health端点,就是查看服务的情况,Up代表上线正常状态,Down就是宕机了
三、Actuator的端点
常用的端点
也可以看下官网的所有Endpoints
通过上图可以看到在http端只暴露了health和info两个端点,这就需要通过配置来进行处理,使http端可以暴露所有端点,
3-1、http端暴露所有端点
暴露所有监控信息为HTTP,需要注意的是 "*" 必须放入引号中
management:
endpoints:
web:
exposure:
include: "*" #设置http访问暴露所有端点
测试
3-2、设置enpoint是否开启
management:
endpoints:
web:
exposure:
include: "*" #设置http访问暴露所有端点
enabled-by-default: false #设置是否启用端点
测试访问
3-3、设置Actuator访问路径
management:
endpoints:
web:
exposure:
include: "*" #设置http访问暴露所有端点
base-path: /jony # 设置访问路径
enabled-by-default: false #设置是否启用端点
访问测试:
3-4、Actuator的相关Endpoints
通过上面的配置,就可以暴露出关于http访问的所有端点,如下:
{
"_links": {
"self": {
"href": "http://localhost:8080/jony",
"templated": false
},
"beans": {
"href": "http://localhost:8080/jony/beans",
"templated": false
},
"caches-cache": {
"href": "http://localhost:8080/jony/caches/{cache}",
"templated": true
},
"caches": {
"href": "http://localhost:8080/jony/caches",
"templated": false
},
"health-path": {
"href": "http://localhost:8080/jony/health/{*path}",
"templated": true
},
"health": {
"href": "http://localhost:8080/jony/health",
"templated": false
},
"info": {
"href": "http://localhost:8080/jony/info",
"templated": false
},
"conditions": {
"href": "http://localhost:8080/jony/conditions",
"templated": false
},
"shutdown": {
"href": "http://localhost:8080/jony/shutdown",
"templated": false
},
"configprops": {
"href": "http://localhost:8080/jony/configprops",
"templated": false
},
"env": {
"href": "http://localhost:8080/jony/env",
"templated": false
},
"env-toMatch": {
"href": "http://localhost:8080/jony/env/{toMatch}",
"templated": true
},
"loggers": {
"href": "http://localhost:8080/jony/loggers",
"templated": false
},
"loggers-name": {
"href": "http://localhost:8080/jony/loggers/{name}",
"templated": true
},
"heapdump": {
"href": "http://localhost:8080/jony/heapdump",
"templated": false
},
"threaddump": {
"href": "http://localhost:8080/jony/threaddump",
"templated": false
},
"metrics-requiredMetricName": {
"href": "http://localhost:8080/jony/metrics/{requiredMetricName}",
"templated": true
},
"metrics": {
"href": "http://localhost:8080/jony/metrics",
"templated": false
},
"scheduledtasks": {
"href": "http://localhost:8080/jony/scheduledtasks",
"templated": false
},
"mappings": {
"href": "http://localhost:8080/jony/mappings",
"templated": false
}
}
}
那这些端点都是干嘛的呢?下面来看一下。
3-4-1、beans 加载的所有beans
beans是spring相关程序以及我们自己的写的bean都会在这个端点里面,可以看到包括springboot的启动类,也在其中(其中包含了bean的别名,作用域等信息)
3-4-2、caches 使用的缓存
caches可以看到程序中加载的相关缓存,因为目前程序没有使用任何缓存,所以看不到数据,可以看下官网说明。
3-4-3、health 服务的监控状态
这个可以看到服务的上下线状态,up或者down,如下:
那么UP或者DOWN仅仅是服务的启动和关闭才会导致状态变化么,实际上不是的,下面可以通过配置来看一下
management:
endpoints:
web:
exposure:
include: "*" #设置http访问暴露所有端点
base-path: /jony # 设置访问路径
enabled-by-default: true #设置是否启用端点
endpoint:
health:
show-details: always #显示health详细信息
通过show-details: always来设置显示health的详细信息
通过上图可以看到,配置了show-details之后,health显示的信息就多了。
diskSapce:指硬盘空间,分别是总空间、空闲、线程数,这些事足够使用的,因此状态为true
ping:指服务的和客户端的连接状态,因为现在都在一起所以肯定能ping通,状态即为UP.
3-4-3-1、配置jdbc的health状态
health还可以定制其他一些相关健康信息,如果配置了jdbc,也会显示jdbc的监控状态,如下:
1、首先添加依赖,jdbc驱动和jdbc的场景启动器,只有配置了jdbc的场景启动器,才可以实现健康状态的指标。
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--配置jdbc场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2、配置application.yml中的数据库连接
spring:
#数据库连接
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/mybatis
driver-class-name: com.mysql.cj.jdbc.Driver
3、重启服务,就可以看到数据库的监控指标了
需要注意的一点,当health里面的所有指标都为UP,总指标才为UP。这样就可以看出UP/DOWN不仅仅是服务的状态,而是多个指标的维度
3-4-4、info
显示配置的相关信息,后面文章进行配置
3-4-5、conditions
显示配置了@Conditionalxxx注解的Bean
3-4-6、configprogs
显示配置了@ConfigurationProperties注解的bean
3-4-7、env
限制相关配置信息,如环境变量、java运行时的一些系统环境变量等,都会加载进去。
3-4-8、logs
查看每个类对应的级别,并且每个类的级别可以进行设置的(后面进行介绍),如果想远程查看日志,需要将日志存储到文件中,可以进行如下配置
重启之后就可以看到断点下有个logfile的断点,可以方便的查看日志了
3-4-9、heapdump
用于分析运行时jvm的相关信息数据,点击heapdump将文件下载到本地,然后打开jvisualvm,导入heapdump即可查看jvm的相关信息了
3-4-10、threaddump
可以查看线程相关信息
3-4-11、metrics
可以显示相关指标信息数据,比如数据库连接数、jvm相关参数指标、运行cpu相关使用率等。 process.cpu.usage
比如想看cpu数量,将指标key复制到地址栏metrics后面即可
访问地址,如下
3-4-12、mappings
所有相关映射,比如在Controller中设置的映射信息。
3-4-13、shutdown
优雅的关闭引用服务,当有正在请求的线程,可以正常运行。准备运行的线程阻止其运行。当正在运行的线程全部运行完成之后,应用系统进行关闭。
需要注意的是优雅关闭,不能通过get请求来进行关闭,需要使用post请求来进行关闭
同时需要设置服务的关闭方式(默认是立即关闭-immediate),需要改成优雅关闭方式
server.shutdown=graceful