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

Spring Boot 3.4+ WebClient替代废弃Metrics Filter后指标uri异常问题

解决Spring Boot 3.4+ WebFlux WebClient Prometheus指标uri显示UNKNOWN的问题

核心原因

Spring Boot 3.x 采用Micrometer Observability API替代了旧版的MetricsFilter,默认的客户端观测配置未正确提取请求URI路径,导致指标中uri标签显示为UNKNOWN。

解决方案步骤

1. 确保依赖齐全

确认pom.xml(或build.gradle)中包含以下依赖(若尚未添加):

<!-- Spring Boot Actuator 用于暴露指标 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus 注册表 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <scope>runtime</scope>
</dependency>

2. 配置WebClient的观测规则

创建自定义的ClientRequestObservationConvention,确保正确提取请求URI路径,并注入到WebClient构建器中:

import io.micrometer.observation.ObservationRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import io.micrometer.observation.web.reactive.client.DefaultClientRequestObservationConvention;
import io.micrometer.observation.web.reactive.client.ClientRequestObservationContext;
import java.net.URI;

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient(ObservationRegistry observationRegistry) {
        return WebClient.builder()
                // 绑定观测注册表
                .observationRegistry(observationRegistry)
                // 设置自定义观测规则
                .observationConvention(new CustomClientRequestObservationConvention())
                .build();
    }

    // 自定义观测规则,确保URI标签正确填充
    static class CustomClientRequestObservationConvention extends DefaultClientRequestObservationConvention {
        @Override
        protected String uri(ClientRequestObservationContext context) {
            URI requestUri = context.getRequest().getUrl();
            if (requestUri != null) {
                // 返回纯路径(可根据需求调整,比如保留部分路径或去掉查询参数)
                return requestUri.getPath();
            }
            // 兜底使用默认逻辑
            return super.uri(context);
        }
    }
}

3. 配置application.yml启用URI标签

在配置文件中开启WebClient请求的URI标签采集:

management:
  endpoints:
    web:
      exposure:
        include: prometheus # 暴露Prometheus端点
  metrics:
    web:
      client:
        request:
          tagging:
            uri:
              enabled: true # 启用URI标签采集

4. 规范WebClient请求写法

使用URI模板方式发送请求,便于观测系统识别统一的路径模板(避免每个带参数的请求都生成唯一URI标签):

// 推荐写法:使用模板占位符
webClient.get()
        .uri("/api/users/{userId}", 1001)
        .retrieve()
        .bodyToMono(User.class);

// 不推荐:直接拼接带参数的URI字符串
// webClient.get().uri("/api/users/1001")...

验证结果

配置完成后,访问/actuator/prometheus端点,即可看到类似以下的正确指标:

http_client_requests_seconds{error="none",status="200",uri="/api/users/{userId}",quantile="0.9"} 0.012

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:25:58