背景
在 SpringBoot 应用中输出 metrics(指标)是监控应用性能和健康状况的重要方式。以下是几种在 SpringBoot 中实现 metrics 输出的方法:
1. 使用 Spring Boot Actuator
Spring Boot Actuator 是最简单的方式,它提供了许多开箱即用的端点来监控应用。
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
基本配置
在 application.properties 或 application.yml 中配置:
# 暴露所有端点
management.endpoints.web.exposure.include=*
# 或者只暴露特定端点
# management.endpoints.web.exposure.include=health,info,metrics
访问 metrics
启动应用后,可以通过以下 URL 访问 metrics:
- http://localhost:8080/actuator/metrics - 查看所有可用的 metrics
- http://localhost:8080/actuator/metrics/ {metric_name} - 查看特定 metric 的详细信息
2. 集成 Micrometer
Micrometer 是一个应用 metrics 门面,支持多种监控系统如 Prometheus、Datadog、New Relic 等。
添加 Micrometer 依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
自定义 metrics
@RestController
public class ExampleController {
private final MeterRegistry meterRegistry;
// 计数器
private final Counter requestCounter;
// 计时器
private final Timer requestTimer;
public ExampleController(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
// 初始化计数器
this.requestCounter = Counter.builder("app.request.count")
.description("请求计数器")
.tag("controller", "example")
.register(meterRegistry);
// 初始化计时器
this.requestTimer = Timer.builder("app.request.time")
.description("请求处理时间")
.tag("controller", "example")
.register(meterRegistry);
}
@GetMapping("/example")
public String example() {
// 增加计数
requestCounter.increment();
// 记录执行时间
return requestTimer.record(() -> {
// 业务逻辑
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Hello World";
});
}
// 使用 Gauge 监控值
@PostConstruct
public void init() {
Gauge.builder("app.queue.size", this, ExampleController::getQueueSize)
.description("队列大小")
.register(meterRegistry);
}
private int getQueueSize() {
// 返回要监控的值
return 10;
}
}
3. 集成 Prometheus
Prometheus 是一个流行的开源监控系统,可以与 Spring Boot 集成。
添加依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置
启动应用后,可以通过 http://localhost:8080/actuator/prometheus 访问 Prometheus 格式的 metrics。
4. 自定义 Metrics 示例
@Component
public class CustomMetricsService {
private final MeterRegistry meterRegistry;
public CustomMetricsService(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
// 注册一个简单的计数器
Gauge.builder("app.users.count", this, CustomMetricsService::getUserCount)
.description("当前用户数")
.register(meterRegistry);
}
private int getUserCount() {
// 实际应用中,这里可能是从数据库或缓存获取用户数
return 42;
}
// 记录业务操作
public void recordBusinessOperation(String operationType, long startTime) {
long timeElapsed = System.currentTimeMillis() - startTime;
Timer.builder("app.business.operation")
.description("业务操作执行时间")
.tag("type", operationType)
.register(meterRegistry)
.record(timeElapsed, TimeUnit.MILLISECONDS);
}
// 记录异常
public void recordException(String exceptionType) {
Counter.builder("app.exceptions")
.description("应用异常计数")
.tag("type", exceptionType)
.register(meterRegistry)
.increment();
}
}
5. 与 Grafana 集成
将 Prometheus 与 Grafana 集成可以创建漂亮的仪表盘。在 Grafana 中,你可以添加 Prometheus 数据源,然后创建仪表盘来可视化你的 metrics。
总结
- Spring Boot Actuator 提供了基本的 metrics 功能
- Micrometer 提供了更丰富的 metrics 类型和更多的集成选项
- Prometheus 是一个流行的监控系统,可以与 Spring Boot 集成
- 自定义 metrics 可以帮助你监控特定的业务指标
- Grafana 可以帮助你可视化 metrics 根据你的具体需求,你可以选择适合的方案来实现 metrics 输出