环境:Springboot-2.0.7.RELEASE(嵌入式tomcat-8.5.35),JDK-1.8.0_181,micrometer-registry-prometheus-1.0.8
描述:使用@Timed
控制器方法和WebMvcMetricsFilter
自定义WebMvcTagsProvider
。
演示项目:https ://github.com/kenix/resp-mix
如果PrometheusMeterRegistry
已经创建了带有一组标签的仪表,它将不会创建另一个具有相同名称和一组不同标签的仪表。它抛出IllegalArgumentException
上述原因。这发生在请求的正常处理成功之后(响应现在具有转换后的 JSON)。异常没有在 spring 中捕获WebMvcMetricsFilter
(即在它的catch
-clause 中捕获异常。顺便说一句,ControllerAdvice
没有帮助),但被 tomcat 捕获StandardHostValve
,它将自己的错误消息(它不知道这个异常来自哪里)响应也。这会导致一个非法的 JSON 作为渲染结果。
问题1:应该WebMvcMetricsFilter
捕获并处理这个抛出的异常,PrometheusMeterRegistry
而不是进一步抛出?
问题2:已经看到过滤器链中的异常在实际处理之前按预期处理。实际处理成功后的异常呢?有参考吗?
要触发这种情况:
curl -i localhost:8080/hi/foo/there
curl -i localhost:8080/hi/blah/there