#java #spring-boot #metrics #spring-micrometer
Вопрос:
В Spring Boot 2.4.x, если была включена функция автотаймера, каждый вызов «обработчика» был синхронизирован. Это работало так: MetricsWebFilter
просто вызывал AutoTimer
методы непосредственно для определения времени вызова.
В Spring Boot 2.5.x (по крайней мере, в 2.5.4) поведение теперь изменилось. Это выглядит так:
static void apply(AutoTimer autoTimer, String metricName, Set<Timed> annotations, Consumer<Timer.Builder> action) {
if (!CollectionUtils.isEmpty(annotations)) {
for (Timed annotation : annotations) {
action.accept(Timer.builder(annotation, metricName));
}
}
else {
if (autoTimer != null amp;amp; autoTimer.isEnabled()) {
action.accept(autoTimer.builder(metricName));
}
}
}
Здесь annotations
представлена коллекция аннотаций if `@Timed~ для соответствующего метода обработчика.
Вероятно, идея заключалась в том, чтобы поддерживать @Timed
аннотации, если они существуют, а их нет, а затем вернуться к старому поведению.
У нас есть приложение , в котором методы обработчика @Timed
, пользовательские аспекты обрабатывают эти аннотации. Но также было очень удобно, чтобы все методы обработчика были синхронизированы по одному и тому же таймеру, называемому «http.server.requests». Но теперь, в Spring Boot 2.5.x, который не добавил @Timed
обработку к старому способу вызова времени, но ЗАМЕНИЛ его новым способом, мы потеряли эту http.server.requests
информацию.
Каков рекомендуемый способ действий?
- Мы могли бы клонировать
@Timed
аннотации в нашу кодовую базу и использовать ее вместо стандарта@Timed
, чтобы новый механизм не видел свои аннотации и переключился на старое поведение. Но это кажется немного уродливым. - Другой вариант-изменить фильтр сбора веб-метрик, чтобы применять КАК старые, так и новые способы к методам обработки времени. Но для этого потребуется скопировать все целиком
MetricsWebFilter
(ребята любят сохранять методыprivate
).
У кого-нибудь есть предложения?