From 4cc45d73fb828fa29da54baabf309f3eff6b2947 Mon Sep 17 00:00:00 2001 From: dark <189192663@qq.com> Date: Sat, 6 Mar 2021 22:29:11 +0800 Subject: [PATCH] 将 bizType 和 bizId 进行封装,实现 SkyWalking Tag 检索 --- src/main/java/cn/iocoder/dashboard/common/annotation/BizTracing.java | 22 ++++++++++++++++++++++ src/main/java/cn/iocoder/dashboard/common/annotation/BizTracingAop.java | 27 +++++++++++++++++++++++++++ src/main/java/cn/iocoder/dashboard/framework/tracer/core/util/TracerUtils.java | 4 ++-- src/main/java/cn/iocoder/dashboard/util/bean/SpringUtil.java | 83 ----------------------------------------------------------------------------------- src/main/java/cn/iocoder/dashboard/util/sping/SpElUtil.java | 40 ++++++++++++++++++++++++++++++++++++++++ src/main/java/cn/iocoder/dashboard/util/sping/SpringBeanUtil.java | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 174 insertions(+), 85 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/common/annotation/BizTracing.java create mode 100644 src/main/java/cn/iocoder/dashboard/common/annotation/BizTracingAop.java delete mode 100644 src/main/java/cn/iocoder/dashboard/util/bean/SpringUtil.java create mode 100644 src/main/java/cn/iocoder/dashboard/util/sping/SpElUtil.java create mode 100644 src/main/java/cn/iocoder/dashboard/util/sping/SpringBeanUtil.java diff --git a/src/main/java/cn/iocoder/dashboard/common/annotation/BizTracing.java b/src/main/java/cn/iocoder/dashboard/common/annotation/BizTracing.java new file mode 100644 index 0000000..0ca4b4d --- /dev/null +++ b/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"; + +} diff --git a/src/main/java/cn/iocoder/dashboard/common/annotation/BizTracingAop.java b/src/main/java/cn/iocoder/dashboard/common/annotation/BizTracingAop.java new file mode 100644 index 0000000..dd90939 --- /dev/null +++ b/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); + } +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/tracer/core/util/TracerUtils.java b/src/main/java/cn/iocoder/dashboard/framework/tracer/core/util/TracerUtils.java index a9f85be..dfcb349 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/tracer/core/util/TracerUtils.java +++ b/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); } /** diff --git a/src/main/java/cn/iocoder/dashboard/util/bean/SpringUtil.java b/src/main/java/cn/iocoder/dashboard/util/bean/SpringUtil.java deleted file mode 100644 index 4cbfb4e..0000000 --- a/src/main/java/cn/iocoder/dashboard/util/bean/SpringUtil.java +++ /dev/null @@ -1,83 +0,0 @@ -package cn.iocoder.dashboard.util.bean; - -import org.springframework.beans.BeansException; - -import org.springframework.beans.factory.NoSuchBeanDefinitionException; - -import org.springframework.context.ApplicationContext; - -import org.springframework.context.ApplicationContextAware; - -import org.springframework.stereotype.Component; - - -@Component -public class SpringUtil implements ApplicationContextAware { - - /** - * Spring context - */ - private static ApplicationContext applicationContext = null; - - public void setApplicationContext(ApplicationContext context) throws BeansException { - if (applicationContext == null) { - applicationContext = context; - } - } - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - public static void setAppCtx(ApplicationContext webAppCtx) { - if (webAppCtx != null) { - applicationContext = webAppCtx; - } - } - - - /** - * 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象 - */ - public static T getBean(Class clazz) { - return getApplicationContext() == null ? null : getApplicationContext().getBean(clazz); - } - - - public static T getBean(String name, Class clazz) throws ClassNotFoundException { - return getApplicationContext() == null ? null : getApplicationContext() .getBean(name, clazz); - } - - - public static final Object getBean(String beanName) { - return getApplicationContext() == null ? null : getApplicationContext() .getBean(beanName); - } - - - public static final Object getBean(String beanName, String className) throws ClassNotFoundException { - Class clz = Class.forName(className); - return getApplicationContext() == null ? null : getApplicationContext() .getBean(beanName, clz.getClass()); - - } - - - public static boolean containsBean(String name) { - return getApplicationContext() == null ? null : getApplicationContext() .containsBean(name); - } - - - public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { - return getApplicationContext() == null ? null : getApplicationContext() .isSingleton(name); - } - - - public static Class getType(String name) throws NoSuchBeanDefinitionException { - return getApplicationContext() == null ? null : getApplicationContext() .getType(name); - } - - - public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { - return getApplicationContext() == null ? null : getApplicationContext() .getAliases(name); - } - -} \ No newline at end of file diff --git a/src/main/java/cn/iocoder/dashboard/util/sping/SpElUtil.java b/src/main/java/cn/iocoder/dashboard/util/sping/SpElUtil.java new file mode 100644 index 0000000..1291d32 --- /dev/null +++ b/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(); + + } +} diff --git a/src/main/java/cn/iocoder/dashboard/util/sping/SpringBeanUtil.java b/src/main/java/cn/iocoder/dashboard/util/sping/SpringBeanUtil.java new file mode 100644 index 0000000..c2fd5c4 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/util/sping/SpringBeanUtil.java @@ -0,0 +1,83 @@ +package cn.iocoder.dashboard.util.sping; + +import org.springframework.beans.BeansException; + +import org.springframework.beans.factory.NoSuchBeanDefinitionException; + +import org.springframework.context.ApplicationContext; + +import org.springframework.context.ApplicationContextAware; + +import org.springframework.stereotype.Component; + + +@Component +public class SpringBeanUtil implements ApplicationContextAware { + + /** + * Spring context + */ + private static ApplicationContext applicationContext = null; + + public void setApplicationContext(ApplicationContext context) throws BeansException { + if (applicationContext == null) { + applicationContext = context; + } + } + + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + public static void setAppCtx(ApplicationContext webAppCtx) { + if (webAppCtx != null) { + applicationContext = webAppCtx; + } + } + + + /** + * 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象 + */ + public static T getBean(Class clazz) { + return getApplicationContext() == null ? null : getApplicationContext().getBean(clazz); + } + + + public static T getBean(String name, Class clazz) throws ClassNotFoundException { + return getApplicationContext() == null ? null : getApplicationContext() .getBean(name, clazz); + } + + + public static final Object getBean(String beanName) { + return getApplicationContext() == null ? null : getApplicationContext() .getBean(beanName); + } + + + public static final Object getBean(String beanName, String className) throws ClassNotFoundException { + Class clz = Class.forName(className); + return getApplicationContext() == null ? null : getApplicationContext() .getBean(beanName, clz.getClass()); + + } + + + public static boolean containsBean(String name) { + return getApplicationContext() == null ? null : getApplicationContext() .containsBean(name); + } + + + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return getApplicationContext() == null ? null : getApplicationContext() .isSingleton(name); + } + + + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return getApplicationContext() == null ? null : getApplicationContext() .getType(name); + } + + + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return getApplicationContext() == null ? null : getApplicationContext() .getAliases(name); + } + +} \ No newline at end of file -- libgit2 0.21.4