扩展注释io.micrometer.core.annotation.Timed

问题描述 投票:0回答:1

我在 Spring Boot 应用程序中使用

@Timed
从方法中收集指标,并且它有效:

@Timed(percentiles = {0.95, 0.99}, histogram = true, extraTags = {"slice", "client"})

由于我在不同的地方使用此注释,所以我决定创建自定义注释

TimedExtended

import io.micrometer.core.annotation.Timed;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Timed(percentiles = {0.95, 0.99}, histogram = true, extraTags = {"slice", "client"})
public @interface TimedExtended {
}

但是这个新的不起作用,指标没有发送到 Influx。您知道应该采取什么措施来修复它吗?

spring-micrometer timed
1个回答
0
投票

如果您使用的是包装

@Timed
(元注释)的自定义注释,例如
@TimedExtended
,则来自
io.micrometer.core.aop.TimedAspect
的切入点“执行 (@io.micrometer.core.annotation.Timed * . (..))" 不会直接匹配它。这是因为执行表达式仅查找显式用
@Timed
注释的方法,并且不会识别用
@TimedExtended
注释的方法。

为了解决这个问题,我创建了自己的方面,作为基础

io.micrometer.core.aop.TimedAspect

@Aspect
public class TimedExtendedAspect {
...
  @Around("execution (@com.test.metrics.TimedExtended * *.*(..))")
  @Nullable
  public Object timedMethod(ProceedingJoinPoint pjp) throws Throwable {
    if (shouldSkip.test(pjp)) {
      return pjp.proceed();
    }

    Method method = ((MethodSignature) pjp.getSignature()).getMethod();
    TimedExtended timed = method.getAnnotation(TimedExtended.class);
    if (timed == null) {
      method = pjp.getTarget().getClass().getMethod(method.getName(), method.getParameterTypes());
      timed = method.getAnnotation(TimedExtended.class);
    }

    return perform(pjp, timed, method);
  }
...
}

我还用以下方式修改了我的注释:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TimedExtended {

  String value() default "";

  boolean longTask() default false;

  String description() default "";

  String[] extraTags() default {"slice", "client"};

  boolean histogram() default true;

  double[] percentiles() default {0.95, 0.99};
}

最后一步 - 为新方面创建 bean:

@Bean
    TimedExtendedAspect timedExtendedAspect(InfluxMeterRegistry influxMeterRegistry) {
        return new TimedExtendedAspect(influxMeterRegistry);
    }
© www.soinside.com 2019 - 2024. All rights reserved.