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:在达到实际处理之前,已经看到过滤器链中的异常已按预期处理。实际处理成功后如何处理异常?有参考吗?
要触发这种情况:
curl -i localhost:8080/hi/foo/there
curl -i localhost:8080/hi/blah/there
答案 0 :(得分:0)
问题1:否,WebMvcTagsProvider处理HTTP异常。 问题2:尝试使用ControllerAdvice并在那里捕获IllegalArgumentException。