如何监测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
相关产品推荐
相关产品推荐

