SpringBoot 输出 Metrics 指南

160 阅读2分钟

背景

在 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:

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。

总结

  1. Spring Boot Actuator 提供了基本的 metrics 功能
  2. Micrometer 提供了更丰富的 metrics 类型和更多的集成选项
  3. Prometheus 是一个流行的监控系统,可以与 Spring Boot 集成
  4. 自定义 metrics 可以帮助你监控特定的业务指标
  5. Grafana 可以帮助你可视化 metrics 根据你的具体需求,你可以选择适合的方案来实现 metrics 输出