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

如何用Micrometer/Prometheus记录方法耗时及对应时间戳?

用Micrometer/Prometheus记录方法执行时长与时间戳的方案

完全可以实现,针对你的场景(每日约50次调用、偶发耗时异常),以下是具体方案:

一、Micrometer 实现方式

Micrometer作为指标门面,可以直接记录方法执行时长,同时通过自定义标签存储执行时间戳,步骤如下:

1. 手动记录时长与时间戳

适合需要精确控制指标维度的场景,示例代码(Spring Boot环境):

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Service;

import java.time.Instant;

@Service
public class BusinessService {
    private final Timer methodTimer;
    private final MeterRegistry meterRegistry;

    public BusinessService(MeterRegistry registry) {
        this.meterRegistry = registry;
        // 初始化Timer,定义指标名称与描述
        this.methodTimer = Timer.builder("biz.method.execution.duration")
                .description("Duration of business method execution")
                .register(registry);
    }

    public void coreBusinessMethod() {
        long startTime = System.currentTimeMillis();
        try {
            // 业务逻辑代码
        } finally {
            long durationMs = System.currentTimeMillis() - startTime;
            // 记录方法执行时长
            methodTimer.record(durationMs, java.util.concurrent.TimeUnit.MILLISECONDS);
            // 记录执行时间戳(秒级,避免标签基数过高)
            meterRegistry.gauge("biz.method.execution.timestamp", null, Instant.now().getEpochSecond());
        }
    }
}

2. 结合@Timed注解与自定义标签

如果习惯用注解方式,可通过MeterFilter自动为指标添加时间戳标签:

import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.MeterFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Instant;

@Configuration
public class MetricsConfig {
    @Bean
    public MeterFilter timestampTagFilter() {
        return new MeterFilter() {
            @Override
            public Meter.Id map(Meter.Id id) {
                // 为指定指标添加时间戳标签
                if (id.getName().equals("biz.method.execution.duration")) {
                    return id.withTag("execution_timestamp", String.valueOf(Instant.now().getEpochSecond()));
                }
                return id;
            }
        };
    }
}

二、Prometheus 侧查询与排查

  1. 关联时间戳与耗时:通过Prometheus查询语句,可匹配特定时间戳的方法执行耗时,例如:
    biz_method_execution_duration_seconds_sum{execution_timestamp="1700000000"}
    
  2. 排查偶发耗时异常:更高效的方式是利用Micrometer Timer的分位数/直方图特性:
    • 开启直方图:在application.yml中配置:
      management:
        metrics:
          distribution:
            percentiles-histogram:
              biz.method.execution.duration: true
      
    • 在Prometheus中查询99分位耗时,定位异常时间段:
      histogram_quantile(0.99, sum(rate(biz_method_execution_duration_seconds_bucket[5m])) by (le))
      
    • 结合biz_method_execution_duration_seconds_max指标,快速找到耗时峰值对应的时间点,再配合业务日志排查根因。

注意事项

  • 由于你的方法每日仅50次调用,将时间戳作为标签的基数极低,不会给Prometheus带来存储压力;若调用量巨大,建议改为日志记录单请求的时间戳与耗时,通过ELK/Loki等日志系统检索。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:04:53