Env: Springboot-2.0.7.RELEASE (embedded 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
-子句中捕获异常。顺便说一句,ControllerAdvice
没有帮助),但被 tomcat 的StandardHostValve
捕获,这也将他自己的错误消息(它不知道此异常来自哪里)呈现为响应。这会导致非法的 JSON 作为呈现的结果。
问题 1:WebMvcMetricsFilter
是否应该捕获并处理PrometheusMeterRegistry
抛出的异常,而不是进一步抛出它?
问题 2:在遇到实际处理之前,过滤器链中的异常已按预期处理。实际处理成功后出现异常怎么办?有什么参考资料吗?
要触发此情况,请执行以下操作:
curl -i localhost:8080/hi/foo/there
curl -i localhost:8080/hi/blah/there
问题 1:不,WebMvcTagsProvider 处理 HTTP 异常。 问题 2:尝试使用 ControllerAdvice 并在那里捕获 IllegalArgumentException。