1

环境: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:已经看到过滤器链中的异常在实际处理之前按预期处理。实际处理成功后的异常呢?有参考吗?

要触发这种情况:

  1. curl -i localhost:8080/hi/foo/there
  2. curl -i localhost:8080/hi/blah/there
4

1 回答 1

0

问题 1:不,WebMvcTagsProvider 处理 HTTP 异常。问题 2:尝试使用 ControllerAdvice 并在那里捕获 IllegalArgumentException。

于 2019-05-26T21:14:23.973 回答