Изменение поведения автотаймера для методов обработчика в Spring Boot 2.5.x

#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 ).

У кого-нибудь есть предложения?