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

如何监测Prometheus拉取Spring Boot指标时机并拦截actuator请求?

如何感知Prometheus对Spring Boot指标的拉取并修改指标值

核心需求

想要知道Prometheus何时从Spring Boot拉取指标,同时需要在拉取请求触发时动态修改指标值。之前尝试的普通Filter无法拦截Actuator请求,需要调整配置逻辑。

问题根源

Spring Boot的Actuator端点默认运行在管理上下文中,普通的@WebFilter和@Component只会注册到主应用上下文,无法触及管理上下文的请求,这就是之前Filter失效的原因。

正确实现方案

1. 编写拦截Filter逻辑

注意要先执行指标修改逻辑,再放行请求,这样才能保证Prometheus拉取到的是更新后的值:

public class PrometheusPullFilter implements Filter {

    private final MyCustomMetrics customMetrics;

    // 注入自定义指标组件
    public PrometheusPullFilter(MyCustomMetrics customMetrics) {
        this.customMetrics = customMetrics;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 在Prometheus拉取前更新指标值
        customMetrics.refreshMetrics();
        
        // 放行请求,让Prometheus获取更新后的指标
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {}
}

2. 在管理上下文注册Filter

使用@ManagementContextConfiguration将Filter注册到Actuator所在的管理上下文,精确指定拦截路径:

@ManagementContextConfiguration
public class ActuatorFilterConfig {

    @Bean
    public FilterRegistrationBean<PrometheusPullFilter> prometheusFilterRegistration(MyCustomMetrics customMetrics) {
        FilterRegistrationBean<PrometheusPullFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new PrometheusPullFilter(customMetrics));
        // 精确匹配Prometheus端点
        registrationBean.addUrlPatterns("/actuator/prometheus");
        // 设置最高优先级,确保在指标生成前执行
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

3. 自定义动态指标示例

以Gauge为例,实现可动态更新的指标:

@Component
public class MyCustomMetrics {
    private final Gauge dynamicValueGauge;

    public MyCustomMetrics(MeterRegistry meterRegistry) {
        this.dynamicValueGauge = Gauge.builder("app.dynamic.value", () -> 0.0)
                .description("随拉取请求动态更新的指标")
                .register(meterRegistry);
    }

    public void refreshMetrics() {
        // 这里可以替换为任意业务逻辑,比如查询数据库、计算实时值
        dynamicValueGauge.set(Math.random() * 100);
    }
}

验证方法

  • 手动访问/actuator/prometheus端点,查看控制台或日志确认Filter逻辑已执行,指标值是否动态变化;
  • 查看Prometheus的采集数据,确认拉取到的是更新后的指标值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:50:46