#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: видели, что исключение в цепочке фильтров до начала фактической обработки обрабатывается, как ожидалось. Как насчет исключения после успешной фактической обработки? Есть ссылки?
Для запуска этого случая:
curl -i localhost:8080/hi/foo/there
curl -i localhost:8080/hi/blah/there
Ответ №1:
Вопрос 1: Нет, WebMvcTagsProvider обрабатывает исключения HTTP. Вопрос 2. Попробуйте использовать ControllerAdvice и перехватите там исключение IllegalArgumentException.
Комментарии:
1.
WebMvcTagsProvider
может обрабатывать HTTP-исключение, только когда ему выдается исключение. В этом случае на тот момент такого исключения еще не произошло.ControllerAdvice
добавлен сейчас, но не решает проблему. Не проводил особых исследований, предполагаюControllerAdvice
, что исключения обрабатываются только на этапе обработки, а не после.