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

如何修改@Timed生成的Meter为Distribution Summary支持Datadog多分位查询

问题解答

注:@Timed注解原生设计目的就是生成Timer类型的耗时指标,无法直接通过注解参数将其转换为Distribution Summary类型,可通过以下两种方案实现Datadog侧多百分位查询需求:

方案1:调整Datadog导出配置(零代码侵入,优先推荐)

不需要修改现有@Timed注解的使用逻辑,仅调整配置即可让原生Timer指标导出到Datadog时自动转为distribution类型,支持多百分位查询:

  • Spring Boot项目配置参考(application.yml):
management:
  datadog:
    metrics:
      export:
        enabled: true
        # 全局开启distribution类型导出支持
        distributions:
          enabled: true
  metrics:
    distribution:
      # 配置所有Timer默认输出的百分位,可按需调整
      percentiles:
        "[timer.*]": 0.5,0.75,0.9,0.95,0.99
      # 开启百分位直方图上报,Datadog侧会自动聚合为distribution类型
      percentiles-histogram:
        "[timer.*]": true
  • 配置生效后,原有@Timed生成的指标在Datadog中就可以直接查询p50、p75、p90等配置的分位值。

方案2:自定义切面生成Distribution Summary类型指标

如果确实需要严格使用Distribution Summary类型的指标,可自定义注解和切面替换原生@Timed的逻辑:

  • 第一步:自定义耗时统计注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributionTimed {
    // 指标名称
    String name() default "method.distribution.duration";
    // 自定义标签
    String[] tags() default {};
    // 要上报的百分位
    double[] percentiles() default {0.5, 0.75, 0.9, 0.95};
}
  • 第二步:编写AOP切面完成指标上报
@Aspect
@Component
public class DistributionTimedAspect {
    private final MeterRegistry meterRegistry;

    // 注入MeterRegistry,Spring Boot会自动装配
    public DistributionTimedAspect(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }

    @Around("@annotation(timed)")
    public Object recordDuration(ProceedingJoinPoint joinPoint, DistributionTimed timed) throws Throwable {
        long startTime = System.nanoTime();
        try {
            return joinPoint.proceed();
        } finally {
            long durationNano = System.nanoTime() - startTime;
            // 构建DistributionSummary并上报耗时
            DistributionSummary.builder(timed.name())
                    .tags(timed.tags())
                    .publishPercentiles(timed.percentiles())
                    .register(meterRegistry)
                    .record(durationNano, TimeUnit.NANOSECONDS);
        }
    }
}
  • 第三步:将业务代码中原有的@Timed替换为自定义的@DistributionTimed即可。

选型建议

  • 仅需要Datadog侧查看多分位指标选方案1,不需要修改任何业务代码,运维成本最低
  • 需要对耗时指标做Distribution Summary专属的自定义拓展时选方案2,灵活度更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 13:45:00