All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fun.fengwk.convention4j.springboot.starter.tracer.ConventionSpanAspect Maven / Gradle / Ivy

package fun.fengwk.convention4j.springboot.starter.tracer;

import fun.fengwk.convention4j.common.lang.StringUtils;
import fun.fengwk.convention4j.tracer.util.SpanAspectUtils;
import fun.fengwk.convention4j.tracer.util.SpanInfo;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.aop.support.AopUtils;
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;

import java.lang.reflect.Method;

/**
 * @author fengwk
 */
@Slf4j
@Aspect
public class ConventionSpanAspect {

    @Around("@annotation(fun.fengwk.convention4j.springboot.starter.tracer.ConventionSpan)")
    public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
        Method annotatedMethod = findMethod(joinPoint);
        if (annotatedMethod == null) {
            log.error("Can not found @ConventionSpan method, signature: {}", joinPoint.getSignature().getName());
            return joinPoint.proceed();
        }

        MergedAnnotation conventionSpanAnnotation = MergedAnnotations
            .from(annotatedMethod, MergedAnnotations.SearchStrategy.TYPE_HIERARCHY).get(ConventionSpan.class);
        if (!conventionSpanAnnotation.isPresent()) {
            log.error("Can not found @ConventionSpan, signature: {}", joinPoint.getSignature().getName());
            return joinPoint.proceed();
        }

        ConventionSpan conventionSpan = conventionSpanAnnotation.synthesize();
        String operationName = conventionSpan.value();
        if (StringUtils.isBlank(operationName)) {
            operationName = buildOperationName(annotatedMethod);
        }

        SpanInfo spanInfo = SpanInfo.builder()
            .operationName(operationName)
            .alias(conventionSpan.alias())
            .kind(conventionSpan.kind())
            .propagation(conventionSpan.propagation())
            .build();
        return SpanAspectUtils.execute(joinPoint::proceed, spanInfo);
    }

    private Method findMethod(ProceedingJoinPoint joinPoint) {
        Object target = joinPoint.getTarget();
        if (target == null) {
            return null;
        }

        Signature signature = joinPoint.getSignature();
        if (!(signature instanceof MethodSignature methodSignature)) {
            return null;
        }

        Class targetClass = AopUtils.getTargetClass(target);
        try {
            return targetClass.getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
        } catch (NoSuchMethodException ex) {
            log.error("Find @ConventionSpan method error", ex);
            return null;
        }
    }

    private static String buildOperationName(Method method) {
        if (method != null) {
            Class[] parameterTypes = method.getParameterTypes();
            StringBuilder sb = new StringBuilder(
                method.getDeclaringClass().getSimpleName());
            sb.append('#').append(method.getName()).append('(');
            for (int i = 0; i < parameterTypes.length; i++) {
                if (i > 0) {
                    sb.append(',');
                }
                sb.append(parameterTypes[i].getSimpleName());
            }
            sb.append(')');
            return sb.toString();

        }

        return "";
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy