如何让Prometheus报告实际路径参数(如/v2/account)的监控指标?
解决网关层按实际EndPoint生成Prometheus监控指标的问题
针对你的场景,完全可以通过自定义Micrometer的URI标签解析逻辑来实现按实际路径(如/v2/account、/v2/customer)生成监控指标,以下是两种适配不同网关类型的具体方案:
方案一:自定义Micrometer UriTagProvider(通用Spring Boot网关)
Micrometer默认的DefaultUriTagProvider会保留路径模板(如/v2/{endPoint}),我们可以自定义一个标签解析器,提取实际的endPoint并替换模板路径:
1. 实现自定义UriTagProvider
import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.http.HttpRequest; import io.micrometer.core.instrument.http.UriTagProvider; import org.springframework.stereotype.Component; import java.util.List; @Component public class GatewayUriTagProvider implements UriTagProvider { // 你的有限endPoint集合,可根据实际情况调整 private static final List<String> ALLOWED_ENDPOINTS = List.of("account", "customer", "order"); @Override public List<Tag> httpRequestTags(HttpRequest request) { String path = request.path(); // 匹配/v2/{endPoint}格式的路径 if (path.startsWith("/v2/")) { String[] pathSegments = path.split("/", 3); if (pathSegments.length >= 3) { String endPoint = pathSegments[2]; // 校验endPoint是否在白名单内,避免生成无效指标 if (ALLOWED_ENDPOINTS.contains(endPoint)) { return List.of(Tag.of("uri", "/v2/" + endPoint)); } } } // 不符合规则的路径,沿用默认逻辑 return UriTagProvider.super.httpRequestTags(request); } }
2. 配置Micrometer使用自定义Provider
创建配置类替换默认的URI标签处理逻辑:
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.http.HttpMetrics; import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MetricsConfig { @Bean public MeterRegistryCustomizer<MeterRegistry> meterRegistryCustomizer(GatewayUriTagProvider uriTagProvider) { return registry -> HttpMetrics.builder() .uriTagProvider(uriTagProvider) .register(registry); } }
方案二:Spring Cloud Gateway专属配置
如果你的网关是Spring Cloud Gateway,除了方案一,还可以通过自定义网关过滤器直接添加服务维度的监控标签:
1. 自定义GatewayMetricsFilter
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.stereotype.Component; import io.micrometer.core.instrument.Metrics; @Component public class ServiceMetricsFilter extends AbstractGatewayFilterFactory<ServiceMetricsFilter.Config> { public ServiceMetricsFilter() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { String path = exchange.getRequest().getPath().toString(); if (path.startsWith("/v2/")) { String endPoint = path.split("/")[2]; // 生成自定义的网关请求指标,包含服务名和实际路径标签 Metrics.counter("gateway.service.requests", "service_name", endPoint + "-service", "uri", path) .increment(); } return chain.filter(exchange); }; } // 过滤器配置类(按需添加参数) public static class Config {} }
2. 在路由中绑定过滤器
在application.yml中给对应路由添加该过滤器:
spring: cloud: gateway: routes: - id: account-service-route uri: lb://account-service predicates: - Path=/v2/account/** filters: - ServiceMetricsFilter - id: customer-service-route uri: lb://customer-service predicates: - Path=/v2/customer/** filters: - ServiceMetricsFilter
验证配置
- 确保Actuator的Prometheus端点开启:
management: endpoints: web: exposure: include: prometheus
- 访问网关的
/actuator/prometheus端点,查看http_server_requests_seconds_*(方案一)或gateway_service_requests_total(方案二)指标,确认uri或service_name标签已显示实际的endPoint值。
注意:如果endPoint集合后续有扩展,记得同步更新白名单或路由配置,避免监控指标遗漏。
内容的提问来源于stack exchange,提问作者user3276247
相关产品推荐
相关产品推荐

