Spring RestController响应与PrometheusMeterRegistry错误消息混合

时间:2019-03-13 13:05:56

标签: servlet-filters spring-boot-actuator spring-micrometer

Env: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中捕获的,而是被tomcat的StandardHostValve捕获的,它也将自己的错误消息(它不知道该异常的来源)转化为响应。这会导致非法的JSON作为渲染结果。

问题1:WebMvcMetricsFilter应该捕获并处理PrometheusMeterRegistry抛出的此异常,而不是进一步抛出该异常吗?

问题2:在达到实际处理之前,已经看到过滤器链中的异常已按预期处理。实际处理成功后如何处理异常?有参考吗?

要触发这种情况:

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

1 个答案:

答案 0 :(得分:0)

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