Spring Authorization Server中OAuth端点指标uri为UNKNOWN的解决方案咨询
我在集成Spring Authorization Server、Spring Boot Actuator和Micrometer Prometheus时,发现http_server_requests_seconds_count这类指标里,合法的OAuth端点(包括无租户的/oauth/token、多租户场景的/tenant/{tenant}/oauth/token等路径)的uri字段均显示为UNKNOWN,授权服务器暴露的其他端点也有类似情况。
原因是这些OAuth端点及带租户前缀的端点未使用@RequestMapping注解,默认观测规则会将uri回退为UNKNOWN,导致监控仪表盘被污染,还破坏了基于SLO的告警机制。
我目前通过自定义ServerRequestObservationConvention解决了这个问题,代码示例如下:
@Component public class OAuthAwareObservationConvention extends DefaultServerRequestObservationConvention { ... @Override public KeyValues getLowCardinalityKeyValues(ServerRequestObservationContext context) { String path = context.getCarrier().getServletPath(); if (path.equals("/oauth/token") || path.equals("/tenant/{tenant}/oauth/token")) { context.setPathPattern("/oauth/token"); } return super.getLowCardinalityKeyValues(context); } }
该方案已生效,但我认为Spring Authorization Server应该提供原生支持或明确的扩展点。我的疑问是:是否存在遗漏的配置,或是有更优的解决方案?
是否存在遗漏配置?
目前Spring Authorization Server本身并没有内置针对Micrometer观测的路径匹配配置,默认情况下确实不会为非@RequestMapping标注的端点生成正确的uri标签,所以不存在遗漏的开箱即用配置。
更优解决方案
优化自定义观测约定的路径匹配逻辑
当前代码里的path.equals("/tenant/{tenant}/oauth/token")匹配逻辑存在问题——实际请求的路径是类似/tenant/foo/oauth/token,不可能直接等于带占位符的路径。可以改用Spring的路径匹配器来处理:@Autowired private PathMatcher pathMatcher; @Override public KeyValues getLowCardinalityKeyValues(ServerRequestObservationContext context) { String servletPath = context.getCarrier().getServletPath(); // 匹配无租户的token端点 if ("/oauth/token".equals(servletPath)) { context.setPathPattern("/oauth/token"); } // 匹配多租户的token端点,统一为规范路径 else if (pathMatcher.match("/tenant/*/oauth/token", servletPath)) { context.setPathPattern("/tenant/{tenant}/oauth/token"); } // 可扩展处理其他OAuth端点,比如授权端点、令牌 introspect 等 else if (pathMatcher.match("/oauth/authorize", servletPath)) { context.setPathPattern("/oauth/authorize"); } return super.getLowCardinalityKeyValues(context); }这样能更准确匹配多租户场景下的动态路径,避免硬编码的局限性。
利用Spring Authorization Server的端点注册扩展
Spring Authorization Server允许通过OAuth2AuthorizationServerConfigurer的endpointConfigurer自定义端点注册逻辑,你可以为这些内置OAuth端点显式添加路径元数据,让Micrometer能识别到规范路径。不过这种方式需要深入定制端点注册流程,复杂度较高,适合需要统一管理所有OAuth端点观测规则的场景。关注官方原生支持进展
目前Spring Authorization Server的官方讨论中已有关于Micrometer集成优化的内容,未来版本可能会原生支持为内置OAuth端点生成正确的观测标签,可关注官方仓库的更新动态。
内容的提问来源于stack exchange,提问作者Muhammad Ans

