Ответ Spring RestController, смешанный с сообщением об ошибке PrometheusMeterRegistry

#servlet-filters #spring-boot-actuator #spring-micrometer

#фильтры сервлета #spring-boot-actuator #spring-микрометр

Вопрос:

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 (т. Е. перехватить исключение в его 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

Ответ №1:

Вопрос 1: Нет, WebMvcTagsProvider обрабатывает исключения HTTP. Вопрос 2. Попробуйте использовать ControllerAdvice и перехватите там исключение IllegalArgumentException.

Комментарии:

1. WebMvcTagsProvider может обрабатывать HTTP-исключение, только когда ему выдается исключение. В этом случае на тот момент такого исключения еще не произошло. ControllerAdvice добавлен сейчас, но не решает проблему. Не проводил особых исследований, предполагаю ControllerAdvice , что исключения обрабатываются только на этапе обработки, а не после.