SpringBoot Actuator
SpringBoot Actuator
- 一、简介
- 二、入门
- 1、依赖
- 2、默认监控指标
- 3、查询监控指标
- 4、全量监控指标
- 三、Spring Boot Admin
- 1、主要功能
- 2、Admin
- 3、Client
- 4、应用墙
- 5、其他
- 四、定制化
- 1、定制Health端点
- 2、定制Info端点
- 3、定制Metrics端点
- 4、定制Endpoint端点
一、简介
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变 量、日志信息、线程信息等
二、入门
1、依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2、默认监控指标
需要启动应用项目
访问方式一:HTTP形式

访问方式二:jconsole形式

在默认配置情况下,使用jconsole访问会显示暴露出来的其他接口
3、查询监控指标
直接访问对应的href地址即可

jconsole直接点击可视化界面即可
4、全量监控指标
修改配置文件
management.endpoints.web.exposure.include=*

常用指标说明:
- beans:Spring容器中的Bean信息
- caches:应用中的缓存
- health:现实健康检查信息
- info:显示设置好的应用信息
- conditions:Spring Boot的条件逐渐
- configprops:Spring的配置类
- env:返回当前环境属性(Environment Properties)
- loggers:能够查询和修改应用的日志级别。
- heapdump:会构建并返回应用所用 JVM 的 Heap Dump。
- threaddump:会 Dump 底层 JVM 的线程信息
- metrics:详细介绍了应用的指标。这可能包括通用指标和自定义指标。
- scheduledtasks:提供了应用中每个计划(定时)任务的详细信息。
- prometheus:返回可供Prometheus抓取的信息
三、Spring Boot Admin
Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源项目。它提供了一个简单易用的 Web 界面,让开发者可以方便地查看和管理多个 Spring Boot 应用实例的运行状态、健康状况、配置信息等。
1、主要功能
- 应用程序发现与注册:Spring Boot Admin 支持通过 Spring Cloud Discovery(如 Eureka、Consul 等)自动发现注册的 Spring Boot 应用程序,也可以通过 HTTP 进行手动注册。
- 健康监控:实时显示应用程序的健康状态,包括磁盘空间、数据库连接、缓存状态等。可以通过
/actuator/health
端点获取详细的健康信息。 - 指标监控:收集和展示应用程序的各种指标,如内存使用情况、线程池状态、HTTP 请求统计等。这些指标通过
/actuator/metrics
端点暴露。 - 日志管理:允许查看和管理应用程序的日志文件,支持实时日志查看和日志级别调整。可以通过
/actuator/logfile
和/actuator/loggers
端点进行操作。 - 环境与配置信息:显示应用程序的环境变量、系统属性和配置信息,方便开发者查看和调试。
- 事件与通知:当应用程序的状态发生变化(如上线、下线、健康状态改变等)时,Spring Boot Admin 可以发送通知,支持多种通知方式,如邮件、Slack、HipChat 等。
2、Admin
注意版本需要和项目的Spring Boot版本对齐,否则无法正常访问
1)添加依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.6.6</version>
</dependency>
2)启动类添加@EnableAdminServer
3)访问

3、Client
1)引入依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>3.3.4</version>
</dependency>
2)配置注册地址
## 地址是admin的访问地址
spring.boot.admin.client.url=http://localhost:8088
management.endpoints.web.exposure.include=*
3)启动项目
admin端会出现注册者,这个注册者就是我们的client端

4、应用墙
此时就可以查看到我们client端的数据指标了

当client端下线后,对应的应用块会有颜色警示

5、其他
我们每个Client端都需要去这么配置会十分繁琐,我们的admin端可以直接监控注册中心,遍历注册中心所有的项目,获取对应的监控数据。
而对应的client端只需要暴露对应的端点即可,即引入依赖&配置暴露端点
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
management.endpoints.web.exposure.include=*
四、定制化
1、定制Health端点
- CustomHealthIndicator 类实现了 HealthIndicator 接口。
- health() 方法根据 isHealthy 变量的值返回不同的健康状态。如果 isHealthy 为 true,则返回 Health.up() 表示健康;否则返回 Health.down() 表示不健康。
- withDetail() 方法用于添加自定义的详细信息到健康检查结果中。
package pers.mobian.springbootactuatordemo.indicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class CustomHealthIndicator implements HealthIndicator {
private static final String CUSTOM_STATUS_KEY = "customStatus";
private boolean isHealthy = false;
// 模拟切换健康状态的方法
public void setHealthy(boolean healthy) {
isHealthy = healthy;
}
@Override
public Health health() {
if (isHealthy) {
return Health.up()
.withDetail(CUSTOM_STATUS_KEY, "Everything is running smoothly.")
.build();
} else {
return Health.down()
.withDetail(CUSTOM_STATUS_KEY, "There is an issue with the custom service.")
.build();
}
}
}
此时访问health接口,就会因为CustomHealthIndicator这个端点校验不通过,而返回DOWN

2、定制Info端点
- CustomInfoContributor 类实现了 InfoContributor 接口。
- contribute 方法用于向 Info.Builder 中添加自定义信息,这里添加了当前时间和一个随机事实。
package pers.mobian.springbootactuatordemo.indicator;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
public class CustomInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
String currentTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
builder.withDetail("currentTime", currentTime)
.withDetail("randomFact", "Spring Boot is awesome!");
}
}
访问info接口,就会出现我们添加的信息

3、定制Metrics端点
1)引入依赖
<!-- Micrometer 是 Spring Boot Actuator 底层的指标收集库 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
2)自定义端点
- CustomMetricsService 类借助 MeterRegistry 创建了一个名为 custom.operation.count 的计数器。
- incrementCustomCounter 方法用于增加计数器的值。
package pers.mobian.springbootactuatordemo.indicator;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;
@Service
public class CustomMetricsService {
private final MeterRegistry meterRegistry;
private Counter customCounter;
public CustomMetricsService(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
customCounter = meterRegistry.counter("custom.operation.count");
}
public void incrementCustomCounter() {
// 每次调用该方法时,计数器加 1
customCounter.increment();
}
}
3)计数器累加接口
创建一个控制器来触发自定义指标的更新
package pers.mobian.springbootactuatordemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import pers.mobian.springbootactuatordemo.indicator.CustomMetricsService;
@RestController
public class CustomMetricsController {
@Autowired
private CustomMetricsService customMetricsService;
@GetMapping("/perform-operation")
public String performOperation() {
// 执行操作时,调用计数器增加方法
customMetricsService.incrementCustomCounter();
return "Operation performed and counter incremented.";
}
}
4)浏览器访问
增加计数器:http://127.0.0.1:8080/perform-operation

查询计数指标::http://127.0.0.1:8080/actuator/metrics/custom.operation.count

5)定制指标过滤器
可以通过配置 MeterFilter`来过滤不需要的指标或者对指标进行重命名等操作。它会拒绝所有以 jvm. 开头的指标,这样这些指标就不会出现在 metrics 端点的响应中。
import io.micrometer.core.instrument.config.MeterFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MetricsConfig {
@Bean
public MeterFilter ignoreMetricsFilter() {
return MeterFilter.denyNameStartsWith("jvm.");
}
}
4、定制Endpoint端点
1)只读customEndpoint
- @Component:将该类注册为 Spring Bean。
- @Endpoint(id = “customEndpoint”):标记该类为一个 Actuator 端点,id 是端点的唯一标识符。
- @ReadOperation:表示该方法是一个只读操作,用于返回端点的数据
package pers.mobian.springbootactuatordemo.indicator;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
@Endpoint(id = "customEndpoint")
public class CustomEndpoint {
@ReadOperation
public Map<String, String> customInfo() {
Map<String, String> info = new HashMap<>();
info.put("message", "This is a custom endpoint in Spring Boot 3.x.");
info.put("version", "1.0");
return info;
}
}

2)读写端点advancedCustomEndpoint
package pers.mobian.springbootactuatordemo.indicator;
import org.springframework.boot.actuate.endpoint.annotation.DeleteOperation;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.HashMap;
import java.util.Map;
@Component
@Endpoint(id = "advancedCustomEndpoint")
public class AdvancedCustomEndpoint {
private final Map<String, String> data = new HashMap<>();
@ReadOperation
public Map<String, String> getData() {
return data;
}
@WriteOperation
@RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public void addData(String key, String value) {
data.put(key, value);
}
@DeleteOperation
public void deleteData(String key) {
data.remove(key);
}
}
使用jconsole发送写请求

浏览器访问,查询写入的数据
