浏览代码

将 bizType 和 bizId 进行封装,实现 SkyWalking Tag 检索

dark 4 年之前
父节点
当前提交
4cc45d73fb

+ 22 - 0
src/main/java/cn/iocoder/dashboard/common/annotation/BizTracing.java

@@ -0,0 +1,22 @@
+package cn.iocoder.dashboard.common.annotation;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+
+/**
+ * 打印业务流水号/业务类型注解
+ *
+ * @author 麻薯
+ */
+public @interface BizTracing {
+    String BIZ_ID = "bizId";
+    String BIZ_TYPE = "bizType";
+
+    String bizId() default "NULL_ID";
+
+    String bizType() default "NULL_TYPE";
+
+}

+ 27 - 0
src/main/java/cn/iocoder/dashboard/common/annotation/BizTracingAop.java

@@ -0,0 +1,27 @@
+package cn.iocoder.dashboard.common.annotation;
+
+import cn.iocoder.dashboard.util.sping.SpElUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Aspect
+@Slf4j
+@Configuration
+public class BizTracingAop {
+
+    @Around(value = "@annotation(bizTracing)")
+    public void tagBizInfo( ProceedingJoinPoint joinPoint, BizTracing bizTracing) {
+        String bizId = SpElUtil.analysisSpEl(bizTracing.bizId(), joinPoint);
+        String bizType = SpElUtil.analysisSpEl(bizTracing.bizType(), joinPoint);
+        log.info("accept biz: bizId[{}], bizType[{}].", bizId, bizType);
+        ActiveSpan.tag(BizTracing.BIZ_ID, bizId);
+        ActiveSpan.tag(BizTracing.BIZ_TYPE, bizType);
+    }
+}

+ 2 - 2
src/main/java/cn/iocoder/dashboard/framework/tracer/core/util/TracerUtils.java

@@ -2,7 +2,7 @@ package cn.iocoder.dashboard.framework.tracer.core.util;
 
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.dashboard.framework.tracer.core.ITrace;
-import cn.iocoder.dashboard.util.bean.SpringUtil;
+import cn.iocoder.dashboard.util.sping.SpringBeanUtil;
 import org.apache.skywalking.apm.toolkit.trace.TraceContext;
 
 import java.util.UUID;
@@ -61,7 +61,7 @@ public class TracerUtils {
      * @return ITrace
      */
     private static ITrace getTracer() {
-        return SpringUtil.getBean(ITrace.class);
+        return SpringBeanUtil.getBean(ITrace.class);
     }
 
     /**

+ 40 - 0
src/main/java/cn/iocoder/dashboard/util/sping/SpElUtil.java

@@ -0,0 +1,40 @@
+package cn.iocoder.dashboard.util.sping;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.Expression;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+
+import java.lang.reflect.Method;
+
+public class SpElUtil {
+
+    private SpElUtil() {
+    }
+
+    public static String analysisSpEl(String spElString, ProceedingJoinPoint joinPoint) {
+        SpelExpressionParser parser = new SpelExpressionParser();
+        DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
+        // 通过joinPoint获取被注解方法
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        Method method = methodSignature.getMethod();
+        // 使用spring的DefaultParameterNameDiscoverer获取方法形参名数组
+        String[] paramNames = nameDiscoverer.getParameterNames(method);
+        // 解析过后的Spring表达式对象
+        Expression expression = parser.parseExpression(spElString);
+        // spring的表达式上下文对象
+        EvaluationContext context = new StandardEvaluationContext();
+        // 通过joinPoint获取被注解方法的形参
+        Object[] args = joinPoint.getArgs();
+        // 给上下文赋值
+        for (int i = 0; i < args.length; i++) {
+            context.setVariable(paramNames[i], args[i]);
+        }
+        Object value = expression.getValue(context);
+        return value == null ? "null" : value.toString();
+
+    }
+}

+ 2 - 2
src/main/java/cn/iocoder/dashboard/util/bean/SpringUtil.java → src/main/java/cn/iocoder/dashboard/util/sping/SpringBeanUtil.java

@@ -1,4 +1,4 @@
-package cn.iocoder.dashboard.util.bean;
+package cn.iocoder.dashboard.util.sping;
 
 import org.springframework.beans.BeansException;
 
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Component;
 
 
 @Component
-public class SpringUtil implements ApplicationContextAware {
+public class SpringBeanUtil implements ApplicationContextAware {
 
     /**
      * Spring context