Как настроить Spring Boot, чтобы сделать компонент измеряемым, не добавляя @Timed к каждому классу, а скорее указывая уже используемые аннотации, такие как @Service

#java #spring #spring-boot #spring-boot-actuator #spring-micrometer

#java #spring #spring-boot #spring-boot-actuator #spring-микрометр

Вопрос:

У меня есть приложение Spring Boot, полное конечных точек (т. Е. @Controller ‘s) и @Service ‘s с @Repository ‘s за ними. Я бы хотел, чтобы все они экспортировали временные показатели в Micrometer. В какой-то момент я бы тоже хотел отключить их все. В какой-то момент мне нужно будет измерить, например, все методы @Service помеченных классов или измерить время @Repository ‘s. Поэтому мне не нравятся все классы, которые уже содержат @Service аннотации для @Timed вставки и удаления, и я должен понять, как это сделать с интерфейсами Spring Data для репозиториев.

Какие компоненты я должен настроить, чтобы MeterRegistry учесть, что весь @RestController помеченный код уже имеет @Timed аннотации, чтобы сделать эту конфигурацию легко включаемой и отключаемой? свойство? Я знаю, что для входящего http-запроса management.metrics.web.server.request.autotime.enabled=true этот трюк для получения времени входящего http-запроса сработает для меня.

Тем не менее, то же самое, вероятно, я хотел бы применить к уровню сервиса и хранилища, если это возможно. Но нет способа определить, что на самом деле является сервисом, а не @Service аннотацией. Так как я не люблю добавлять @Timed их явно, какую настройку можно выполнить, чтобы заставить MeterRegistry учитывать любой метод в @Service помеченном классе и в любом хранилище данных Spring в приложении?

Ответ №1:

Для этого нет готового решения, но вы можете реализовать его самостоятельно, например, с помощью Spring AOP.

Вы можете просмотреть исходный код TimedAspect, особенно в @Around aspect для @Timed аннотации, и воссоздать его для @Service или @Repository .