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

如何使用Micrometer的@Timed注解采集Future异步方法的执行指标

问题根因

@Timed 默认的切面逻辑仅测量方法本身的执行耗时,对于返回 Future 类型的异步方法,方法在拿到 Future 实例时就已经执行结束,切面会直接判定为执行成功并结束计时,不会等待 Future 内部的异步任务真正执行完成,所以才会出现 SQS 不可用但指标仍判定为成功的问题。

推荐实现方案

方案一:使用 Micrometer 原生 API 手动包装(侵入性低,首选)

Micrometer 提供了Timer.recordFuture方法,原生支持监听 Future 执行结果,自动统计完整执行耗时、区分成功/失败状态,异常场景会自动附加exception标签记录异常类型。
示例代码:

// 先注入 MeterRegistry
@Autowired
private MeterRegistry meterRegistry;

public Future<SendMessageResult> sendAsync(String queueUrl, String message) {
    // 构造Timer实例,参数和原@Timed注解保持一致
    Timer sqsPublishTimer = Timer.builder(PrometheusConstants.SQS_ASYNC_PUBLISH_TIMER)
            .publishPercentiles(0.5, 0.95, 0.99)
            .publishPercentileHistogram(true)
            .register(meterRegistry);
    // 传入异步任务,返回的Future和原方法返回的完全一致,不影响业务逻辑
    return sqsPublishTimer.recordFuture(() -> amazonSQSAsync.sendMessageAsync(queueUrl, message));
}

方案二:自定义切面实现注解式异步统计(无业务侵入,适合批量场景)

如果项目中大量存在类似返回 Future 的异步方法需要统计,可以自定义 AOP 切面,拦截所有带@Timed注解且返回值为Future/CompletableFuture类型的方法,在切面中手动启动计时器,监听 Future 完成事件后再结束计时,异常场景记录失败指标。这种方式不需要修改业务代码,保留原注解的使用习惯。

补充说明

如果你使用的是 Spring 自带的@Async注解实现的异步方法,Spring Boot 原生已经支持@Timed自动统计异步执行全链路耗时,不需要额外处理;但如果是第三方 SDK 返回的独立 Future 实例,默认的@Timed切面无法识别,需要用上述两种方案处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:06:02