【问题标题】:Spring RestController response mixed with PrometheusMeterRegistry error messageSpring RestController 响应与 PrometheusMeterRegistry 错误消息混合
【发布时间】:2019-08-04 04:08:24
【问题描述】:

环境:Springboot-2.0.7.RELEASE(嵌入式 tomcat-8.5.35)、JDK-1.8.0_181、micrometer-registry-prometheus-1.0.8

描述:在控制器方法上使用 @Timed,在自定义 WebMvcTagsProvider 上使用 WebMvcMetricsFilter

演示项目:https://github.com/kenix/resp-mix

如果PrometheusMeterRegistry 已经创建了一个带有一组标签的仪表,它不会创建另一个具有相同名称和一组不同标签的仪表。由于上述原因,它会抛出IllegalArgumentException。这发生在请求的正常处理成功之后(响应现在具有转换后的 JSON)。异常没有在spring的WebMvcMetricsFilter中捕获(即在其catch子句中捕获异常。顺便说一句,ControllerAdvice没有帮助),但被tomcat的StandardHostValve捕获,它呈现了他自己的错误消息(它不知道这个异常来自哪里)也响应。这会导致呈现的结果是非法的 JSON。

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

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

触发这种情况:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • WebMvcTagsProvider 可以处理 HTTP 异常,只有在给他异常的时候。在这种情况下,当时还没有发生这种异常。 ControllerAdvice 现已添加,但没有解决问题。没怎么研究,猜想ControllerAdvice只处理处理阶段的异常,不是处理之后的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2022-01-09
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多