package org.stagemonitor.core.metrics.annotations; import net.bytebuddy.description.annotation.AnnotationDescription; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.ParameterDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.bytecode.assign.Assigner; import org.stagemonitor.core.instrument.StagemonitorByteBuddyTransformer; import org.stagemonitor.core.metrics.aspects.SignatureUtils; import java.lang.annotation.Annotation; public abstract class MetricAnnotationSignatureDynamicValue<T extends Annotation> extends StagemonitorByteBuddyTransformer.StagemonitorDynamicValue<T> { @Override protected Object doResolve(TypeDescription instrumentedType, MethodDescription instrumentedMethod, ParameterDescription.InDefinedShape target, AnnotationDescription.Loadable<T> annotation, Assigner assigner, boolean initialized) { return getRequestName(instrumentedMethod); } public String getRequestName(MethodDescription instrumentedMethod) { final NamingParameters namingParameters = getNamingParameters(instrumentedMethod); return SignatureUtils.getSignature(instrumentedMethod.getDeclaringType().getTypeName(), instrumentedMethod.getName(), namingParameters.getNameFromAnnotation(), namingParameters.isAbsolute()); } protected abstract NamingParameters getNamingParameters(MethodDescription instrumentedMethod); protected static class NamingParameters { private String nameFromAnnotation; private boolean absolute; public NamingParameters(String nameFromAnnotation, boolean absolute) { this.nameFromAnnotation = nameFromAnnotation; this.absolute = absolute; } public String getNameFromAnnotation() { return nameFromAnnotation; } public boolean isAbsolute() { return absolute; } } }