我在 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。您知道应该采取什么措施来修复它吗?
如果您使用的是包装
@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);
}