目录
分享一下springboot监控,Spring Boot Actuator 的相关使用及知识点
最近楼主正在为程序写监控,考虑了一下Spring Boot Actuator,但是还是放弃了,决定自己实现监控,更加贴合公司业务,但,还是用了一下研究了一下springboot的这个监控,分享给各位开发者
当然,本人也是用的不多,只是用了大概,所以可能不会很全面,请各位见谅
让我们开始
首先,想要使用,必须先引包
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
Spring Boot Actuator 提供了所谓的端点来给外部访问和交互,主要分为三大类
在默认情况下,只能访问health和info,其他端点需要手动配置

如果需要允许所有端点对外开启,可以直接配置

我们可以启动访问一下

当然,这个时候信息很少,那是因为缺了一项配置
health端点默认只展示当前应用的健康信息,如果需要详细的信息,可以通过配置打开

再次启动访问

访问 /actuator/loggers 可以获取到日志级别

这儿有一个很重要的操作,那就是可以临时改变日志级别
以post请求,在路径后边跟上root,可以将级别修改为别的级别


info端点可以展示程序的信息,默认情况下,只会返回一个空的json
可以在配置文件进行配置,比如我配置下面这些

然后进行访问

可以看到,这就是我定义的信息
如同字面意思,这个端点会返回我们有哪些bean

这个端点,会生成一个JVM堆文件,可以使用JDK的JVM监控工具VisualVM打开查看文件的内存快照
这个就不要用工具请求了,不大好下载,直接放到浏览器请求就好

这个端点可以返回线程相关信息

包括了线程名、线程ID、线程状态、是否等待锁资源等
这个是一个关闭应用等端点,需要用post访问,且默认关闭,需要在配置文件开启


这个端点用来返回当前程序的指标,比如内存信息、堆栈信息、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 去限制