目录
分享一下springboot监控,Spring Boot Actuator 的相关使用及知识点
最近楼主正在为程序写监控,考虑了一下Spring Boot Actuator,但是还是放弃了,决定自己实现监控,更加贴合公司业务,但,还是用了一下研究了一下springboot的这个监控,分享给各位开发者
当然,本人也是用的不多,只是用了大概,所以可能不会很全面,请各位见谅
让我们开始
引包
首先,想要使用,必须先引包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
端点
Spring Boot Actuator 提供了所谓的端点来给外部访问和交互,主要分为三大类
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与springboot应用相关的配置类信息
- 指标类:获取应用程序运行中用于监控的指标信息,比如内存信息、线程池信息、http请求统计等等
- 控制类:提供了本应用的关闭等功能
在默认情况下,只能访问health和info,其他端点需要手动配置
如果需要允许所有端点对外开启,可以直接配置
我们可以启动访问一下
当然,这个时候信息很少,那是因为缺了一项配置
health端点
health端点默认只展示当前应用的健康信息,如果需要详细的信息,可以通过配置打开
再次启动访问
loggers端点
访问 /actuator/loggers 可以获取到日志级别
这儿有一个很重要的操作,那就是可以临时改变日志级别
以post请求,在路径后边跟上root,可以将级别修改为别的级别
info端点
info端点可以展示程序的信息,默认情况下,只会返回一个空的json
可以在配置文件进行配置,比如我配置下面这些
然后进行访问
可以看到,这就是我定义的信息
beans端点
如同字面意思,这个端点会返回我们有哪些bean
heapdump 端点
这个端点,会生成一个JVM堆文件,可以使用JDK的JVM监控工具VisualVM打开查看文件的内存快照
这个就不要用工具请求了,不大好下载,直接放到浏览器请求就好
threaddump 端点
这个端点可以返回线程相关信息
包括了线程名、线程ID、线程状态、是否等待锁资源等
shutdown 端点
这个是一个关闭应用等端点,需要用post访问,且默认关闭,需要在配置文件开启
metrics 端点
这个端点用来返回当前程序的指标,比如内存信息、堆栈信息、GC信息等
并且,我们可以详细看某个指标的具体信息,以 jvm.memory.max 为例子
也可以用参数访问某一块具体空间,比如
127.0.0.1:8080/actuator/metrics/jvm.memory.max?tag=id:MetaSpace
自定义监控端点
从上面来看,springboot提供的这个监控还是可以的,但是各个服务需求不同,就会出现自定义的情况,所以,springboot也支持自定义监控端点
自定义监控端点,会用到如下注解:
@Endpoint: 在类上使用,声明当前类是一个监控端点,支持http和jmx
@WebEndpoint: 在类上使用,声明当前类是一个监控端点,支持http
@JmxEndpoint: 在类上使用,声明当前类是一个监控端点,支持jmx
@ReadOpreation: 在方法上使用,可用来返回端点展示的信息,使用get请求
@WriteOperation: 在方法上使用,用来修改端点展示的信息,使用post请求
@DeleteOperation: 在方法上使用,可以用来删除对应端点信息,使用delete请求
@Selector: 在方法参数上使用,用来定位一个端点的具体指标路由
搞一个试试
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.Selector;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpoint;
import org.springframework.stereotype.Component;
@WebEndpoint(id = "myEndpoint")
@Component
public class MyEndpoint {
private String status = "alive";
private String desc = "version 1";
@ReadOperation
public String testReadOperation() {
return status;
}
@ReadOperation
public String testReadOperation(@Selector String name) {
if (StringUtils.isNoneBlank(name) && name.equals("status")) {
return status;
} else {
return desc;
}
}
@WriteOperation
public void testWriteOperation(@Selector String arg0, @Selector String value) {
if (arg0.equals("status")) {
status = value;
} else {
desc = value;
}
}
}
至于权限设置,因为actuator有的操作是敏感操作,所以可以基于 springbootsecurity 去限制