You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot Actuator指标结果中添加自定义批处理统计字段?

嘿,刚好做过类似的批处理任务指标统计,给你分享下具体的实现步骤,主要围绕你提到的CounterService和GaugeService来做,分两种场景处理不同类型的指标:

一、用CounterService统计累计类指标

CounterService适合统计累计发生次数,比如批处理任务的启动数、完成数、失败数这类需要累加的数值。

实现步骤:

  1. 注入CounterService:在你的批处理任务类、监听器或者组件里注入该服务:
    @Autowired
    private CounterService counterService;
    
  2. 在关键节点调用计数方法:
    • 每次批处理任务启动时,累计启动数:
      counterService.increment("batch.task.started");
      
    • 任务成功完成时,累计完成数:
      counterService.increment("batch.task.completed");
      
    • 任务失败时,累计失败数:
      counterService.increment("batch.task.failed");
      
    • 如果需要重置某个计数器(比如每日清零),可以调用:
      counterService.reset("batch.task.failed");
      
二、用GaugeService统计瞬时类指标

GaugeService适合统计瞬时状态值,比如当前正在运行的批处理任务数、单次任务处理的记录数、任务耗时这类动态变化的数值。

实现步骤:

  1. 注入GaugeService:同样在相关组件里注入:
    @Autowired
    private GaugeService gaugeService;
    
  2. 在状态变化时提交数值:
    • 统计当前运行的任务数:可以用原子类维护计数,任务启动时加1、结束时减1,然后提交:
      private AtomicInteger runningTaskCount = new AtomicInteger(0);
      
      // 任务启动时
      int currentCount = runningTaskCount.incrementAndGet();
      gaugeService.submit("batch.task.running", currentCount);
      
      // 任务结束时
      currentCount = runningTaskCount.decrementAndGet();
      gaugeService.submit("batch.task.running", currentCount);
      
    • 统计单次任务处理的记录数:任务完成后提交本次处理的数量:
      gaugeService.submit("batch.task.processed.records", processedRecordNum);
      
三、完整示例:批处理任务指标监听器

可以把指标统计逻辑封装成一个监听器类,在批处理任务的各个生命周期节点调用:

@Component
public class BatchMetricsTracker {

    private final CounterService counterService;
    private final GaugeService gaugeService;
    private final AtomicInteger runningTasks = new AtomicInteger(0);

    // 构造注入(推荐)
    @Autowired
    public BatchMetricsTracker(CounterService counterService, GaugeService gaugeService) {
        this.counterService = counterService;
        this.gaugeService = gaugeService;
    }

    // 任务开始触发
    public void onTaskInitiated() {
        counterService.increment("batch.task.initiated");
        int current = runningTasks.incrementAndGet();
        gaugeService.submit("batch.task.running", current);
    }

    // 任务成功完成触发
    public void onTaskCompleted(long processedRecords) {
        counterService.increment("batch.task.succeeded");
        int current = runningTasks.decrementAndGet();
        gaugeService.submit("batch.task.running", current);
        // 提交本次任务处理的记录数
        gaugeService.submit("batch.task.processed.records", processedRecords);
    }

    // 任务失败触发
    public void onTaskFailed() {
        counterService.increment("batch.task.failed");
        int current = runningTasks.decrementAndGet();
        gaugeService.submit("batch.task.running", current);
    }
}
四、配置与查看指标

配置Actuator端点:

  • 如果是Spring Boot 1.x:默认/metrics端点是开放的,直接访问即可看到所有指标
  • 如果是Spring Boot 2.x+:需要在application.properties里配置端点暴露:
    # 暴露metrics端点
    management.endpoints.web.exposure.include=metrics
    # 可选:给指标添加全局标签,方便区分不同应用
    management.metrics.tags.application=your-batch-app
    

查看指标:

  1. 访问http://localhost:8080/actuator/metrics(替换成你的应用地址和端口),可以看到所有已注册的指标列表,包括你自定义的batch.task.*系列指标
  2. 要查看某个指标的详细数据,直接访问对应的URL,比如http://localhost:8080/actuator/metrics/batch.task.completed
五、小提示
  • 指标命名尽量规范,用业务域.模块.指标名的格式(比如batch.task.started),方便后续过滤和分析
  • CounterService的递增操作是线程安全的,不用额外加锁
  • GaugeService提交的是瞬时值,所以每次状态变化都需要重新提交,否则指标不会更新

内容的提问来源于stack exchange,提问作者Bhushan Uniyal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:55