This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d21ffc  rrefactor agent tracing plugin test (#9039)
3d21ffc is described below

commit 3d21ffcaa4b7aeb854496c403f46c0aa4ee6d611
Author: Daming <[email protected]>
AuthorDate: Fri Jan 15 10:40:24 2021 +0800

    rrefactor agent tracing plugin test (#9039)
    
    * refactor agent tracing plugin test
    
    * Update CommandExecutorTaskAdviceTest.java
    
    rename method
    
    * add license header
---
 .../shardingsphere-agent-plugin-tracing/pom.xml    |  16 +++
 .../shardingsphere-agent-tracing-jaeger/pom.xml    |   7 +-
 .../jaeger/advice/CommandExecutorTaskAdvice.java   |  24 ++--
 .../jaeger/advice/JDBCExecutorCallbackAdvice.java  |  28 +++--
 .../jaeger/advice/SQLParserEngineAdvice.java       |   6 +-
 ...hardingSphereTags.java => JaegerConstants.java} |  40 +++++--
 .../tracing/jaeger/span/JaegerErrorSpan.java       |   8 +-
 .../advice/CommandExecutorTaskAdviceTest.java      |  60 ++++------
 .../advice/JDBCExecutorCallbackAdviceTest.java     |  75 ++++--------
 .../jaeger/advice/SQLParserEngineAdviceTest.java   |  56 +++------
 .../advice/CommandExecutorTaskAdvice.java          |   2 +-
 .../advice/JDBCExecutorCallbackAdvice.java         |   2 +-
 .../pom.xml                                        |  51 +++++----
 .../agent/plugin/tracing/AgentRunner.java          | 126 +++++++++++++++++++++
 .../plugin/tracing}/MockDataSourceMetaData.java    |   2 +-
 .../AbstractCommandExecutorTaskAdviceTest.java}    |  25 ++--
 .../AbstractJDBCExecutorCallbackAdviceTest.java    |  84 ++++++++++++++
 .../advice/AbstractSQLParserEngineAdviceTest.java  |  52 +++++++++
 .../plugin/tracing/advice/AdviceTestBase.java}     |  20 +---
 .../agent/plugin/tracing/rule/CollectorRule.java}  |  21 +---
 .../agent/plugin/tracing/rule/JaegerCollector.java |  60 ++++++++++
 .../agent/plugin/tracing/rule/ZipkinCollector.java |  60 ++++++++++
 .../shardingsphere-agent-tracing-zipkin/pom.xml    |   9 +-
 .../zipkin/advice/CommandExecutorTaskAdvice.java   |   2 +-
 .../zipkin/advice/SQLParserEngineAdvice.java       |   1 +
 .../tracing/zipkin/constant/ZipkinConstants.java   |   2 +-
 .../tracing/zipkin/advice/AdviceBaseTest.java      |  62 ----------
 .../advice/CommandExecutorTaskAdviceTest.java      |  50 +++-----
 .../advice/JDBCExecutorCallbackAdviceTest.java     |  87 +++-----------
 .../zipkin/advice/SQLParserEngineAdviceTest.java   |  60 +++-------
 30 files changed, 647 insertions(+), 451 deletions(-)

diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/pom.xml
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/pom.xml
index df2b844..4aa4da9 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/pom.xml
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/pom.xml
@@ -30,6 +30,7 @@
     <name>${project.artifactId}</name>
     
     <modules>
+        <module>shardingsphere-agent-tracing-test</module>
         <module>shardingsphere-agent-tracing-jaeger</module>
         <module>shardingsphere-agent-tracing-zipkin</module>
         <module>shardingsphere-agent-tracing-opentracing</module>
@@ -37,6 +38,10 @@
     
     <properties>
         
<tracing.target.directory>${project.basedir}/../target/plugins</tracing.target.directory>
+        <opentracing.version>0.31.0</opentracing.version>
+        <jaeger-client.version>0.31.0</jaeger-client.version>
+        <zipkin-brave.version>5.13.2</zipkin-brave.version>
+        <zipkin-reporter.version>2.16.2</zipkin-reporter.version>
     </properties>
     
     <dependencies>
@@ -49,6 +54,17 @@
             <artifactId>shardingsphere-proxy-common</artifactId>
         </dependency>
     </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.shardingsphere</groupId>
+                <artifactId>shardingsphere-agent-tracing-test</artifactId>
+                <version>${project.version}</version>
+                <scope>test</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
     
     <build>
         <plugins>
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
index 0fab780..9eee90e 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
@@ -29,8 +29,8 @@
     <name>${project.artifactId}</name>
     
     <properties>
-        <jaeger-client.version>0.31.0</jaeger-client.version>
         <opentracing.version>0.31.0</opentracing.version>
+        <jaeger-client.version>0.31.0</jaeger-client.version>
     </properties>
     
     <dependencies>
@@ -49,7 +49,6 @@
             <artifactId>opentracing-util</artifactId>
             <version>${opentracing.version}</version>
         </dependency>
-        
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-proxy-frontend-core</artifactId>
@@ -62,5 +61,9 @@
             <version>${opentracing.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-agent-tracing-test</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdvice.java
index 872c89c..8206ba1 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdvice.java
@@ -20,13 +20,17 @@ package 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
 import io.opentracing.Scope;
 import io.opentracing.tag.Tags;
 import io.opentracing.util.GlobalTracer;
-import org.apache.shardingsphere.agent.api.advice.InstanceMethodAroundAdvice;
+import lombok.SneakyThrows;
 import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.api.advice.InstanceMethodAroundAdvice;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
-import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.ShardingSphereTags;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
 import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.span.JaegerErrorSpan;
 import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 
 /**
@@ -36,20 +40,24 @@ public final class CommandExecutorTaskAdvice implements 
InstanceMethodAroundAdvi
     
     private static final String OPERATION_NAME = "/ShardingSphere/rootInvoke/";
     
-    private static final String ROOT_SPAN = "_root_span_";
-    
     @Override
     public void beforeMethod(final AdviceTargetObject target, final Method 
method, final Object[] args, final MethodInvocationResult result) {
         Scope scope = GlobalTracer.get().buildSpan(OPERATION_NAME)
-                .withTag(Tags.COMPONENT.getKey(), 
ShardingSphereTags.COMPONENT_NAME)
+                .withTag(Tags.COMPONENT.getKey(), 
JaegerConstants.COMPONENT_NAME)
                 .startActive(true);
-        ExecutorDataMap.getValue().put(ROOT_SPAN, scope.span());
+        ExecutorDataMap.getValue().put(JaegerConstants.ROOT_SPAN, 
scope.span());
     }
     
     @Override
+    @SneakyThrows
     public void afterMethod(final AdviceTargetObject target, final Method 
method, final Object[] args, final MethodInvocationResult result) {
-        GlobalTracer.get().scopeManager().active().close();
-        ExecutorDataMap.getValue().remove(ROOT_SPAN);
+        ExecutorDataMap.getValue().remove(JaegerConstants.ROOT_SPAN);
+        Field field = 
CommandExecutorTask.class.getDeclaredField("backendConnection");
+        field.setAccessible(true);
+        BackendConnection connection = (BackendConnection) field.get(target);
+        Scope scope = GlobalTracer.get().scopeManager().active();
+        
scope.span().setTag(JaegerConstants.ShardingSphereTags.CONNECTION_COUNT.getKey(),
 connection.getConnectionSize());
+        scope.close();
     }
     
     @Override
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdvice.java
index 03035ba..a752c64 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdvice.java
@@ -22,15 +22,19 @@ import io.opentracing.Span;
 import io.opentracing.Tracer;
 import io.opentracing.tag.Tags;
 import io.opentracing.util.GlobalTracer;
+import lombok.SneakyThrows;
+import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
 import org.apache.shardingsphere.agent.api.advice.InstanceMethodAroundAdvice;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
 import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.span.JaegerErrorSpan;
-import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.ShardingSphereTags;
+import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
+import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
 
 import java.lang.reflect.Method;
+import java.sql.DatabaseMetaData;
 import java.util.Map;
 
 /**
@@ -41,20 +45,26 @@ public final class JDBCExecutorCallbackAdvice implements 
InstanceMethodAroundAdv
     private static final String OPERATION_NAME = "/ShardingSphere/executeSQL/";
     
     @Override
+    @SneakyThrows
     public void beforeMethod(final AdviceTargetObject target, final Method 
method, final Object[] args, final MethodInvocationResult result) {
-        Span root = (Span) ((Map<String, Object>) args[2]).get("_root_span_");
+        Span root = (Span) ((Map<String, Object>) 
args[2]).get(JaegerConstants.ROOT_SPAN);
         Tracer.SpanBuilder builder = 
GlobalTracer.get().buildSpan(OPERATION_NAME);
         if ((boolean) args[1]) {
             builder.asChildOf(root);
         } else {
-            JDBCExecutionUnit executionUnit = (JDBCExecutionUnit) args[0];
-            ExecutionUnit unit = executionUnit.getExecutionUnit();
-            builder.withTag(Tags.COMPONENT.getKey(), 
ShardingSphereTags.COMPONENT_NAME)
-                    .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
-                    .withTag(Tags.DB_TYPE.getKey(), "sql")
+            final JDBCExecutionUnit executionUnit = (JDBCExecutionUnit) 
args[0];
+            final ExecutionUnit unit = executionUnit.getExecutionUnit();
+            Method getMetadataMethod = 
JDBCExecutorCallback.class.getDeclaredMethod("getDataSourceMetaData", 
DatabaseMetaData.class);
+            getMetadataMethod.setAccessible(true);
+            DataSourceMetaData metaData = (DataSourceMetaData) 
getMetadataMethod.invoke(target, new 
Object[]{executionUnit.getStorageResource().getConnection().getMetaData()});
+            builder.withTag(Tags.COMPONENT.getKey(), 
JaegerConstants.COMPONENT_NAME)
+                    .withTag(Tags.DB_TYPE.getKey(), 
JaegerConstants.DB_TYPE_VALUE)
                     .withTag(Tags.DB_INSTANCE.getKey(), 
unit.getDataSourceName())
+                    .withTag(Tags.PEER_HOSTNAME.getKey(), 
metaData.getHostName())
+                    .withTag(Tags.PEER_PORT.getKey(), metaData.getPort())
+                    .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
                     .withTag(Tags.DB_STATEMENT.getKey(), 
unit.getSqlUnit().getSql())
-                    .withTag(ShardingSphereTags.DB_BIND_VARIABLES.getKey(), 
unit.getSqlUnit().getParameters().toString());
+                    
.withTag(JaegerConstants.ShardingSphereTags.DB_BIND_VARIABLES.getKey(), 
unit.getSqlUnit().getParameters().toString());
         }
         target.setAttachment(builder.startActive(true));
     }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdvice.java
index 9aed790..185aefb 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdvice.java
@@ -20,11 +20,11 @@ package 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
 import io.opentracing.Scope;
 import io.opentracing.tag.Tags;
 import io.opentracing.util.GlobalTracer;
+import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
 import org.apache.shardingsphere.agent.api.advice.InstanceMethodAroundAdvice;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
 import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.span.JaegerErrorSpan;
-import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.ShardingSphereTags;
 
 import java.lang.reflect.Method;
 
@@ -38,7 +38,7 @@ public final class SQLParserEngineAdvice implements 
InstanceMethodAroundAdvice {
     @Override
     public void beforeMethod(final AdviceTargetObject target, final Method 
method, final Object[] args, final MethodInvocationResult result) {
         Scope scope = GlobalTracer.get().buildSpan(OPERATION_NAME)
-                .withTag(Tags.COMPONENT.getKey(), 
ShardingSphereTags.COMPONENT_NAME)
+                .withTag(Tags.COMPONENT.getKey(), 
JaegerConstants.COMPONENT_NAME)
                 .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
                 .withTag(Tags.DB_STATEMENT.getKey(), String.valueOf(args[0]))
                 .startActive(true);
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/ShardingSphereTags.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/JaegerConstants.java
similarity index 53%
rename from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/ShardingSphereTags.java
rename to 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/JaegerConstants.java
index adf19c2..99cfc1e 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/ShardingSphereTags.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/JaegerConstants.java
@@ -18,27 +18,45 @@
 package org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant;
 
 import io.opentracing.tag.StringTag;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
 
-/**
- * ShardingSphere tags.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ShardingSphereTags {
+public class JaegerConstants {
+    
+    public static final String ROOT_SPAN = "jaeger_root_span";
     
     /**
      * Component name of ShardingSphere's open tracing tag.
      */
     public static final String COMPONENT_NAME = "ShardingSphere";
     
+    public static final String DB_TYPE_VALUE = "shardingsphere-proxy";
+    
     /**
-     * The tag to record the bind variables of SQL.
+     * Error log tag keys.
      */
-    public static final StringTag DB_BIND_VARIABLES = new 
StringTag("db.bind_vars");
+    public static final class ErrorLogTagKeys {
+    
+        public static final String EVENT = "event";
+    
+        public static final String EVENT_ERROR_TYPE = "error";
+    
+        public static final String ERROR_KIND = "error.kind";
+    
+        public static final String MESSAGE = "message";
+    }
     
     /**
-     * The tag to record the connection count.
+     * ShardingSphere tags.
      */
-    public static final StringTag CONNECTION_COUNT = new 
StringTag("connection.count");
+    public static final class ShardingSphereTags {
+        
+        /**
+         * The tag to record the bind variables of SQL.
+         */
+        public static final StringTag DB_BIND_VARIABLES = new 
StringTag("db.bind_vars");
+        
+        /**
+         * The tag to record the connection count.
+         */
+        public static final StringTag CONNECTION_COUNT = new 
StringTag("connection.count");
+    }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/span/JaegerErrorSpan.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/span/JaegerErrorSpan.java
index 6dd2279..41da1c3 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/span/JaegerErrorSpan.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/span/JaegerErrorSpan.java
@@ -21,7 +21,7 @@ import io.opentracing.Span;
 import io.opentracing.tag.Tags;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.ErrorLogTagKeys;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -44,9 +44,9 @@ public final class JaegerErrorSpan {
     
     private static Map<String, ?> getReason(final Throwable cause) {
         Map<String, String> result = new HashMap<>(3, 1);
-        result.put(ErrorLogTagKeys.EVENT, ErrorLogTagKeys.EVENT_ERROR_TYPE);
-        result.put(ErrorLogTagKeys.ERROR_KIND, cause.getClass().getName());
-        result.put(ErrorLogTagKeys.MESSAGE, cause.getMessage());
+        result.put(JaegerConstants.ErrorLogTagKeys.EVENT, 
JaegerConstants.ErrorLogTagKeys.EVENT_ERROR_TYPE);
+        result.put(JaegerConstants.ErrorLogTagKeys.ERROR_KIND, 
cause.getClass().getName());
+        result.put(JaegerConstants.ErrorLogTagKeys.MESSAGE, 
cause.getMessage());
         return result;
     }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdviceTest.java
index d02f670..3e57e52 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdviceTest.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/CommandExecutorTaskAdviceTest.java
@@ -17,23 +17,19 @@
 
 package org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
 
-import io.netty.channel.ChannelHandlerContext;
+import com.google.common.collect.Maps;
 import io.opentracing.mock.MockSpan;
-import io.opentracing.mock.MockTracer;
-import io.opentracing.util.GlobalTracer;
-import lombok.SneakyThrows;
+import io.opentracing.tag.Tags;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
-import org.apache.shardingsphere.db.protocol.payload.PacketPayload;
-import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask;
+import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractCommandExecutorTaskAdviceTest;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.JaegerCollector;
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
-import org.mockito.internal.util.reflection.FieldReader;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
 
@@ -41,48 +37,38 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 
-public final class CommandExecutorTaskAdviceTest {
+public final class CommandExecutorTaskAdviceTest extends 
AbstractCommandExecutorTaskAdviceTest {
     
-    private static final CommandExecutorTaskAdvice ADVICE = new 
CommandExecutorTaskAdvice();
+    @ClassRule
+    public static JaegerCollector collector = new JaegerCollector();
     
-    private static MockTracer tracer;
+    private static final CommandExecutorTaskAdvice ADVICE = new 
CommandExecutorTaskAdvice();
     
-    private static Method executeCommandMethod;
+    private static final Map<String, Object> EXPECTED = Maps.newHashMap();
     
     @BeforeClass
-    @SneakyThrows
     public static void setup() {
-        if (!GlobalTracer.isRegistered()) {
-            GlobalTracer.register(new MockTracer());
-        }
-        FieldReader fieldReader = new FieldReader(GlobalTracer.get(), 
GlobalTracer.class.getDeclaredField("tracer"));
-        tracer = (MockTracer) fieldReader.read();
-        executeCommandMethod = 
CommandExecutorTask.class.getDeclaredMethod("executeCommand", 
ChannelHandlerContext.class, PacketPayload.class, BackendConnection.class);
-    }
-    
-    @Before
-    public void reset() {
-        tracer.reset();
+        EXPECTED.put(Tags.COMPONENT.getKey(), JaegerConstants.COMPONENT_NAME);
+        
EXPECTED.put(JaegerConstants.ShardingSphereTags.CONNECTION_COUNT.getKey(), 0);
     }
     
     @Test
     public void assertMethod() {
-        MockAdviceTargetObject targetObject = new MockAdviceTargetObject();
-        ADVICE.beforeMethod(targetObject, executeCommandMethod, new 
Object[]{}, new MethodInvocationResult());
-        ADVICE.afterMethod(targetObject, executeCommandMethod, new Object[]{}, 
new MethodInvocationResult());
-        List<MockSpan> spans = tracer.finishedSpans();
+        ADVICE.beforeMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        ADVICE.afterMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        List<MockSpan> spans = collector.finishedSpans();
         assertThat(spans.size(), is(1));
         assertThat(spans.get(0).logEntries().size(), is(0));
         assertThat(spans.get(0).operationName(), 
is("/ShardingSphere/rootInvoke/"));
+        assertThat(spans.get(0).tags(), is(EXPECTED));
     }
     
     @Test
     public void assertExceptionHandle() {
-        MockAdviceTargetObject targetObject = new MockAdviceTargetObject();
-        ADVICE.beforeMethod(targetObject, executeCommandMethod, new 
Object[]{}, new MethodInvocationResult());
-        ADVICE.onThrowing(targetObject, executeCommandMethod, new Object[]{}, 
new IOException());
-        ADVICE.afterMethod(targetObject, executeCommandMethod, new Object[]{}, 
new MethodInvocationResult());
-        List<MockSpan> spans = tracer.finishedSpans();
+        ADVICE.beforeMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        ADVICE.onThrowing(getTargetObject(), null, new Object[]{}, new 
IOException());
+        ADVICE.afterMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        List<MockSpan> spans = collector.finishedSpans();
         Assert.assertEquals(1, spans.size());
         MockSpan span = spans.get(0);
         assertThat(span.tags().get("error"), is(true));
@@ -93,5 +79,9 @@ public final class CommandExecutorTaskAdviceTest {
         assertNull(fields.get("message"));
         assertThat(fields.get("error.kind"), is("java.io.IOException"));
         assertThat(span.operationName(), is("/ShardingSphere/rootInvoke/"));
+        Map<Object, Object> map = Maps.newHashMap(EXPECTED);
+        map.put(JaegerConstants.ErrorLogTagKeys.EVENT_ERROR_TYPE, true);
+        assertThat(spans.get(0).tags(), is(map));
     }
+    
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdviceTest.java
index 9680d59..6388687 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdviceTest.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/JDBCExecutorCallbackAdviceTest.java
@@ -17,99 +17,66 @@
 
 package org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import io.opentracing.mock.MockSpan;
-import io.opentracing.mock.MockTracer;
-import io.opentracing.util.GlobalTracer;
-import lombok.SneakyThrows;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
-import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.ErrorLogTagKeys;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
-import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
+import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractJDBCExecutorCallbackAdviceTest;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.JaegerCollector;
 import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
-import org.mockito.internal.util.reflection.FieldReader;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
-public final class JDBCExecutorCallbackAdviceTest {
+public final class JDBCExecutorCallbackAdviceTest extends 
AbstractJDBCExecutorCallbackAdviceTest {
     
-    private static final JDBCExecutorCallbackAdvice ADVICE = new 
JDBCExecutorCallbackAdvice();
-    
-    private static MockTracer tracer;
-    
-    private static Method executeMethod;
+    @ClassRule
+    public static JaegerCollector collector = new JaegerCollector();
     
-    @BeforeClass
-    @SneakyThrows
-    public static void setup() {
-        if (!GlobalTracer.isRegistered()) {
-            GlobalTracer.register(new MockTracer());
-        }
-        FieldReader fieldReader = new FieldReader(GlobalTracer.get(), 
GlobalTracer.class.getDeclaredField("tracer"));
-        tracer = (MockTracer) fieldReader.read();
-        executeMethod = 
JDBCExecutorCallback.class.getDeclaredMethod("execute", 
JDBCExecutionUnit.class, boolean.class, Map.class);
-    }
+    private static final JDBCExecutorCallbackAdvice ADVICE = new 
JDBCExecutorCallbackAdvice();
     
     @Before
-    public void reset() {
-        tracer.reset();
+    public void setup() {
+        getExtraMap().put(JaegerConstants.ROOT_SPAN, null);
     }
     
     @Test
     public void assertMethod() {
-        MockAdviceTargetObject targetObject = new MockAdviceTargetObject();
-        Map<String, Object> extraMap = Maps.newHashMap();
-        extraMap.put("_root_span_", null);
-        JDBCExecutionUnit executionUnit = mock(JDBCExecutionUnit.class);
-        when(executionUnit.getExecutionUnit()).thenReturn(new 
ExecutionUnit("mock.db", new SQLUnit("select 1", Lists.newArrayList())));
-        ADVICE.beforeMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        ADVICE.afterMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        List<MockSpan> spans = tracer.finishedSpans();
+        ADVICE.beforeMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        ADVICE.afterMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        List<MockSpan> spans = collector.finishedSpans();
         assertThat(spans.size(), is(1));
         MockSpan span = spans.get(0);
         Map<String, Object> tags = span.tags();
         assertThat(spans.get(0).logEntries().size(), is(0));
         assertThat(span.operationName(), is("/ShardingSphere/executeSQL/"));
         assertThat(tags.get("db.instance"), is("mock.db"));
-        assertThat(tags.get("db.type"), is("sql"));
+        assertThat(tags.get("db.type"), is(JaegerConstants.DB_TYPE_VALUE));
         assertThat(tags.get("span.kind"), is("client"));
         assertThat(tags.get("db.statement"), is("select 1"));
     }
     
     @Test
     public void assertExceptionHandle() {
-        MockAdviceTargetObject targetObject = new MockAdviceTargetObject();
-        Map<String, Object> extraMap = Maps.newHashMap();
-        extraMap.put("_root_span_", null);
-        JDBCExecutionUnit executionUnit = mock(JDBCExecutionUnit.class);
-        when(executionUnit.getExecutionUnit()).thenReturn(new 
ExecutionUnit("mock.db", new SQLUnit("select 1", Lists.newArrayList())));
-        ADVICE.beforeMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        ADVICE.onThrowing(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new IOException());
-        ADVICE.afterMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        List<MockSpan> spans = tracer.finishedSpans();
+        ADVICE.beforeMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        ADVICE.onThrowing(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new IOException());
+        ADVICE.afterMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        List<MockSpan> spans = collector.finishedSpans();
         assertThat(spans.size(), is(1));
         MockSpan span = spans.get(0);
         List<MockSpan.LogEntry> entries = span.logEntries();
         Map<String, ?> fields = entries.get(0).fields();
-        assertThat(fields.get(ErrorLogTagKeys.EVENT), is("error"));
-        assertThat(fields.get(ErrorLogTagKeys.ERROR_KIND), 
is("java.io.IOException"));
+        assertThat(fields.get(JaegerConstants.ErrorLogTagKeys.EVENT), 
is("error"));
+        assertThat(fields.get(JaegerConstants.ErrorLogTagKeys.ERROR_KIND), 
is("java.io.IOException"));
         Map<String, Object> tags = span.tags();
         assertThat(span.operationName(), is("/ShardingSphere/executeSQL/"));
         assertThat(tags.get("db.instance"), is("mock.db"));
-        assertThat(tags.get("db.type"), is("sql"));
+        assertThat(tags.get("db.type"), is(JaegerConstants.DB_TYPE_VALUE));
         assertThat(tags.get("span.kind"), is("client"));
         assertThat(tags.get("db.statement"), is("select 1"));
     }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdviceTest.java
index 7472e5b..885f209 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdviceTest.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/SQLParserEngineAdviceTest.java
@@ -18,53 +18,32 @@
 package org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
 
 import io.opentracing.mock.MockSpan;
-import io.opentracing.mock.MockTracer;
-import io.opentracing.util.GlobalTracer;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
-import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.ErrorLogTagKeys;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
-import org.junit.Before;
-import org.junit.BeforeClass;
+import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractSQLParserEngineAdviceTest;
+import 
org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant.JaegerConstants;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.JaegerCollector;
+import org.junit.ClassRule;
 import org.junit.Test;
-import org.mockito.internal.util.reflection.FieldReader;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-public final class SQLParserEngineAdviceTest {
+public final class SQLParserEngineAdviceTest extends 
AbstractSQLParserEngineAdviceTest {
     
-    private static final SQLParserEngineAdvice ADVICE = new 
SQLParserEngineAdvice();
-    
-    private static MockTracer tracer;
+    @ClassRule
+    public static JaegerCollector collector = new JaegerCollector();
     
-    private static Method parserMethod;
-    
-    @BeforeClass
-    public static void setup() throws NoSuchMethodException, 
NoSuchFieldException {
-        if (!GlobalTracer.isRegistered()) {
-            GlobalTracer.register(new MockTracer());
-        }
-        FieldReader fieldReader = new FieldReader(GlobalTracer.get(), 
GlobalTracer.class.getDeclaredField("tracer"));
-        tracer = (MockTracer) fieldReader.read();
-        parserMethod = 
ShardingSphereSQLParserEngine.class.getDeclaredMethod("parse", String.class, 
boolean.class);
-    }
-    
-    @Before
-    public void reset() {
-        tracer.reset();
-    }
+    private static final SQLParserEngineAdvice ADVICE = new 
SQLParserEngineAdvice();
     
     @Test
     public void assertMethod() {
-        MockAdviceTargetObject targetObject = new MockAdviceTargetObject();
-        ADVICE.beforeMethod(targetObject, parserMethod, new Object[]{"select 
1"}, new MethodInvocationResult());
-        ADVICE.afterMethod(targetObject, parserMethod, new Object[]{}, new 
MethodInvocationResult());
-        List<MockSpan> spans = tracer.finishedSpans();
+        ADVICE.beforeMethod(getTargetObject(), null, new Object[]{"select 1"}, 
new MethodInvocationResult());
+        ADVICE.afterMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        List<MockSpan> spans = collector.finishedSpans();
         assertThat(spans.size(), is(1));
         assertThat(spans.get(0).logEntries().size(), is(0));
         assertThat(spans.get(0).operationName(), 
is("/ShardingSphere/parseSQL/"));
@@ -72,19 +51,18 @@ public final class SQLParserEngineAdviceTest {
     
     @Test
     public void assertExceptionHandle() {
-        MockAdviceTargetObject targetObject = new MockAdviceTargetObject();
-        ADVICE.beforeMethod(targetObject, parserMethod, new Object[]{"select 
1"}, new MethodInvocationResult());
-        ADVICE.onThrowing(targetObject, parserMethod, new Object[]{}, new 
IOException());
-        ADVICE.afterMethod(targetObject, parserMethod, new Object[]{}, new 
MethodInvocationResult());
-        List<MockSpan> spans = tracer.finishedSpans();
+        ADVICE.beforeMethod(getTargetObject(), null, new Object[]{"select 1"}, 
new MethodInvocationResult());
+        ADVICE.onThrowing(getTargetObject(), null, new Object[]{}, new 
IOException());
+        ADVICE.afterMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        List<MockSpan> spans = collector.finishedSpans();
         assertThat(spans.size(), is(1));
         MockSpan span = spans.get(0);
         assertThat(span.tags().get("error"), is(true));
         List<MockSpan.LogEntry> entries = span.logEntries();
         assertThat(entries.size(), is(1));
         Map<String, ?> fields = entries.get(0).fields();
-        assertThat(fields.get(ErrorLogTagKeys.EVENT), is("error"));
-        assertThat(fields.get(ErrorLogTagKeys.ERROR_KIND), 
is("java.io.IOException"));
+        assertThat(fields.get(JaegerConstants.ErrorLogTagKeys.EVENT), 
is("error"));
+        assertThat(fields.get(JaegerConstants.ErrorLogTagKeys.ERROR_KIND), 
is("java.io.IOException"));
         assertThat(span.operationName(), is("/ShardingSphere/parseSQL/"));
     }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/CommandExecutorTaskAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/CommandExecutorTaskAdvice.java
index 6fc0f41..0397d75 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/CommandExecutorTaskAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/CommandExecutorTaskAdvice.java
@@ -36,7 +36,7 @@ public final class CommandExecutorTaskAdvice implements 
InstanceMethodAroundAdvi
     
     private static final String OPERATION_NAME = "/ShardingSphere/rootInvoke/";
     
-    private static final String ROOT_SPAN = "_root_span_";
+    private static final String ROOT_SPAN = "ot_root_span_";
     
     @Override
     public void beforeMethod(final AdviceTargetObject target, final Method 
method, final Object[] args, final MethodInvocationResult result) {
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/JDBCExecutorCallbackAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/JDBCExecutorCallbackAdvice.java
index 1592ec8..492a8a0 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/JDBCExecutorCallbackAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/JDBCExecutorCallbackAdvice.java
@@ -41,7 +41,7 @@ public final class JDBCExecutorCallbackAdvice implements 
InstanceMethodAroundAdv
     
     @Override
     public void beforeMethod(final AdviceTargetObject target, final Method 
method, final Object[] args, final MethodInvocationResult result) {
-        Span root = (Span) ((Map<String, Object>) args[2]).get("_root_span_");
+        Span root = (Span) ((Map<String, Object>) 
args[2]).get("ot_root_span_");
         Tracer.SpanBuilder builder = 
GlobalTracer.get().buildSpan(OPERATION_NAME);
         if ((boolean) args[1]) {
             builder.asChildOf(root);
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/pom.xml
similarity index 70%
copy from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
copy to 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/pom.xml
index 0fab780..628d4bc 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/pom.xml
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/pom.xml
@@ -25,42 +25,49 @@
         <artifactId>shardingsphere-agent-plugin-tracing</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    <artifactId>shardingsphere-agent-tracing-jaeger</artifactId>
+    <artifactId>shardingsphere-agent-tracing-test</artifactId>
     <name>${project.artifactId}</name>
-    
-    <properties>
-        <jaeger-client.version>0.31.0</jaeger-client.version>
-        <opentracing.version>0.31.0</opentracing.version>
-    </properties>
-    
+
     <dependencies>
         <dependency>
-            <groupId>io.jaegertracing</groupId>
-            <artifactId>jaeger-client</artifactId>
-            <version>${jaeger-client.version}</version>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-proxy-frontend-core</artifactId>
         </dependency>
         <dependency>
-            <groupId>io.opentracing</groupId>
-            <artifactId>opentracing-api</artifactId>
-            <version>${opentracing.version}</version>
+            <groupId>io.zipkin.brave</groupId>
+            <artifactId>brave</artifactId>
+            <version>${zipkin-brave.version}</version>
+            <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>io.opentracing</groupId>
-            <artifactId>opentracing-util</artifactId>
-            <version>${opentracing.version}</version>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy-agent</artifactId>
+            <version>${bytebuddy.version}</version>
+            <scope>compile</scope>
         </dependency>
-        
         <dependency>
-            <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>shardingsphere-proxy-frontend-core</artifactId>
-            <version>${project.version}</version>
-            <scope>provided</scope>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito.version}</version>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>io.opentracing</groupId>
             <artifactId>opentracing-mock</artifactId>
             <version>${opentracing.version}</version>
-            <scope>test</scope>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.opentracing</groupId>
+            <artifactId>opentracing-util</artifactId>
+            <version>${opentracing.version}</version>
+            <scope>provided</scope>
         </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/AgentRunner.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/AgentRunner.java
new file mode 100644
index 0000000..405fa5c
--- /dev/null
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/AgentRunner.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.tracing;
+
+import com.google.common.collect.Sets;
+import lombok.extern.slf4j.Slf4j;
+import net.bytebuddy.ByteBuddy;
+import net.bytebuddy.agent.ByteBuddyAgent;
+import net.bytebuddy.agent.builder.AgentBuilder;
+import net.bytebuddy.agent.builder.ResettableClassFileTransformer;
+import net.bytebuddy.dynamic.scaffold.TypeValidation;
+import net.bytebuddy.implementation.FieldAccessor;
+import net.bytebuddy.jar.asm.Opcodes;
+import net.bytebuddy.matcher.ElementMatchers;
+import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.plugin.tracing.advice.AdviceTestBase;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.CollectorRule;
+import org.junit.rules.TestRule;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+import java.util.List;
+import java.util.Set;
+
+@Slf4j
+public final class AgentRunner extends BlockJUnit4ClassRunner {
+    
+    private static final String EXTRA_DATA = "_$EXTRA_DATA$_";
+    
+    private static ResettableClassFileTransformer byteBuddyAgent;
+    
+    private static final String[] ENHANCEMENT_CLASSES = new String[]{
+        "org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask",
+        
"org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback",
+        "org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine",
+    };
+    
+    private CollectorRule collectorRule;
+    
+    public AgentRunner(final Class<?> testClass) throws InitializationError {
+        super(testClass);
+    }
+    
+    @Override
+    protected Statement withBeforeClasses(final Statement statement) {
+        ByteBuddyAgent.install();
+        final Set<String> classes = Sets.newHashSet(ENHANCEMENT_CLASSES);
+        byteBuddyAgent = new AgentBuilder.Default()
+                .with(new ByteBuddy().with(TypeValidation.ENABLED))
+                .type(ElementMatchers.namedOneOf(ENHANCEMENT_CLASSES))
+                .transform((builder, typeDescription, classLoader, module) -> {
+                    if (classes.contains(typeDescription.getTypeName())) {
+                        return builder.defineField(EXTRA_DATA, Object.class, 
Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE)
+                                .implement(AdviceTargetObject.class)
+                                .intercept(FieldAccessor.ofField(EXTRA_DATA));
+                    }
+                    return builder;
+                }).installOnByteBuddyAgent();
+        // load them into current classloader
+        classes.forEach(className -> {
+            try {
+                Class<?> klass = Class.forName(className);
+                log.info("It is successful to enhance the {}", klass);
+            } catch (ClassNotFoundException ignore) {
+            }
+        });
+        return super.withBeforeClasses(statement);
+    }
+    
+    @Override
+    protected List<TestRule> classRules() {
+        List<TestRule> testRules = super.classRules();
+        collectorRule = testRules.stream()
+                .filter(rule -> rule instanceof CollectorRule)
+                .findFirst()
+                .map(rule -> (CollectorRule) rule)
+                .orElse(() -> {
+                });
+        return testRules;
+    }
+    
+    @Override
+    protected Statement withBefores(final FrameworkMethod method, final Object 
target, final Statement statement) {
+        if (target instanceof AdviceTestBase) {
+            ((AdviceTestBase) target).prepare();
+        }
+        return super.withBefores(method, target, statement);
+    }
+    
+    @Override
+    protected Statement withAfters(final FrameworkMethod method, final Object 
target, final Statement statement) {
+        return super.withAfters(method, target, new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                try {
+                    statement.evaluate();
+                } finally {
+                    collectorRule.cleanup();
+                }
+            }
+        });
+    }
+    
+    @Override
+    protected Statement withAfterClasses(final Statement statement) {
+        byteBuddyAgent.reset(ByteBuddyAgent.getInstrumentation(), 
AgentBuilder.RedefinitionStrategy.RETRANSFORMATION);
+        return super.withAfterClasses(statement);
+    }
+}
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/MockDataSourceMetaData.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/MockDataSourceMetaData.java
similarity index 94%
rename from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/MockDataSourceMetaData.java
rename to 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/MockDataSourceMetaData.java
index 976ee40..eecb7b3 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/MockDataSourceMetaData.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/MockDataSourceMetaData.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
+package org.apache.shardingsphere.agent.plugin.tracing;
 
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/MockAdviceTargetObject.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractCommandExecutorTaskAdviceTest.java
similarity index 52%
copy from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/MockAdviceTargetObject.java
copy to 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractCommandExecutorTaskAdviceTest.java
index cd0e559..a2c32e6 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/MockAdviceTargetObject.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractCommandExecutorTaskAdviceTest.java
@@ -15,21 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
+package org.apache.shardingsphere.agent.plugin.tracing.advice;
 
+import lombok.Getter;
 import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.plugin.tracing.AgentRunner;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask;
+import org.apache.shardingsphere.transaction.core.TransactionType;
+import org.junit.runner.RunWith;
 
-public final class MockAdviceTargetObject implements AdviceTargetObject {
+@RunWith(AgentRunner.class)
+public abstract class AbstractCommandExecutorTaskAdviceTest implements 
AdviceTestBase {
     
-    private Object object;
+    @Getter
+    private AdviceTargetObject targetObject;
     
     @Override
-    public Object getAttachment() {
-        return object;
-    }
-    
-    @Override
-    public void setAttachment(final Object attachment) {
-        this.object = attachment;
+    @SuppressWarnings("all")
+    public void prepare() {
+        Object executorTask = new CommandExecutorTask(null, new 
BackendConnection(TransactionType.BASE), null, null);
+        targetObject = (AdviceTargetObject) executorTask;
     }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractJDBCExecutorCallbackAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractJDBCExecutorCallbackAdviceTest.java
new file mode 100644
index 0000000..595db4b
--- /dev/null
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractJDBCExecutorCallbackAdviceTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.tracing.advice;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import lombok.Getter;
+import lombok.SneakyThrows;
+import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.plugin.tracing.AgentRunner;
+import org.apache.shardingsphere.agent.plugin.tracing.MockDataSourceMetaData;
+import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
+import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
+import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
+import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
+import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
+import org.junit.runner.RunWith;
+import org.mockito.internal.util.reflection.FieldReader;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.Statement;
+import java.util.Map;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(AgentRunner.class)
+public abstract class AbstractJDBCExecutorCallbackAdviceTest implements 
AdviceTestBase {
+    
+    @Getter
+    private AdviceTargetObject targetObject;
+    
+    private Object attachment;
+    
+    @Getter
+    private JDBCExecutionUnit executionUnit;
+    
+    @Getter
+    private Map<String, Object> extraMap;
+    
+    @SneakyThrows
+    @SuppressWarnings("all")
+    @Override
+    public void prepare() {
+        extraMap = Maps.newHashMap();
+        Statement statement = mock(Statement.class);
+        Connection connection = mock(Connection.class);
+        DatabaseMetaData metaData = mock(DatabaseMetaData.class);
+        when(metaData.getURL()).thenReturn("mock_url");
+        when(connection.getMetaData()).thenReturn(metaData);
+        when(statement.getConnection()).thenReturn(connection);
+        executionUnit = new JDBCExecutionUnit(new ExecutionUnit("mock.db", new 
SQLUnit("select 1", Lists.newArrayList())), null, statement);
+        JDBCExecutorCallback mock = mock(JDBCExecutorCallback.class, 
invocation -> {
+            switch (invocation.getMethod().getName()) {
+                case "getAttachment":
+                    return attachment;
+                case "setAttachment":
+                    attachment = invocation.getArguments()[0];
+                    return null;
+                default:
+                    return invocation.callRealMethod();
+            }
+        });
+        Map<String, DataSourceMetaData> map = (Map<String, 
DataSourceMetaData>) new FieldReader(mock, 
JDBCExecutorCallback.class.getDeclaredField("CACHED_DATASOURCE_METADATA")).read();
+        map.put("mock_url", new MockDataSourceMetaData());
+        targetObject = (AdviceTargetObject) mock;
+    }
+}
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractSQLParserEngineAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractSQLParserEngineAdviceTest.java
new file mode 100644
index 0000000..b42c93c
--- /dev/null
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AbstractSQLParserEngineAdviceTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.tracing.advice;
+
+import lombok.Getter;
+import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.plugin.tracing.AgentRunner;
+import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
+import org.junit.runner.RunWith;
+
+import static org.mockito.Mockito.mock;
+
+@RunWith(AgentRunner.class)
+public abstract class AbstractSQLParserEngineAdviceTest implements 
AdviceTestBase {
+    
+    @Getter
+    private AdviceTargetObject targetObject;
+    
+    private Object attachment;
+    
+    @SuppressWarnings("all")
+    @Override
+    public void prepare() {
+        Object parserEngine = mock(ShardingSphereSQLParserEngine.class, 
invocation -> {
+            switch (invocation.getMethod().getName()) {
+                case "getAttachment":
+                    return attachment;
+                case "setAttachment":
+                    attachment = invocation.getArguments()[0];
+                    return null;
+                default:
+                    return invocation.callRealMethod();
+            }
+        });
+        targetObject = (AdviceTargetObject) parserEngine;
+    }
+}
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/MockAdviceTargetObject.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AdviceTestBase.java
similarity index 65%
rename from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/MockAdviceTargetObject.java
rename to 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AdviceTestBase.java
index cd0e559..c1fd50e 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/advice/MockAdviceTargetObject.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/advice/AdviceTestBase.java
@@ -15,21 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.plugin.tracing.jaeger.advice;
+package org.apache.shardingsphere.agent.plugin.tracing.advice;
 
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
-
-public final class MockAdviceTargetObject implements AdviceTargetObject {
-    
-    private Object object;
+public interface AdviceTestBase {
     
-    @Override
-    public Object getAttachment() {
-        return object;
-    }
+    /**
+     * Prepare env for testing.
+     */
+    void prepare();
     
-    @Override
-    public void setAttachment(final Object attachment) {
-        this.object = attachment;
-    }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/ErrorLogTagKeys.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/CollectorRule.java
similarity index 63%
rename from 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/ErrorLogTagKeys.java
rename to 
shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/CollectorRule.java
index 78da346..3fda4b3 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-jaeger/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/jaeger/constant/ErrorLogTagKeys.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/CollectorRule.java
@@ -15,22 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.plugin.tracing.jaeger.constant;
+package org.apache.shardingsphere.agent.plugin.tracing.rule;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-/**
- * Error log tag keys.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ErrorLogTagKeys {
-    
-    public static final String EVENT = "event";
-    
-    public static final String EVENT_ERROR_TYPE = "error";
+public interface CollectorRule {
     
-    public static final String ERROR_KIND = "error.kind";
+    /**
+     * Clean up the collector.
+     */
+    void cleanup();
     
-    public static final String MESSAGE = "message";
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/JaegerCollector.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/JaegerCollector.java
new file mode 100644
index 0000000..962d20b
--- /dev/null
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/JaegerCollector.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.tracing.rule;
+
+import io.opentracing.mock.MockSpan;
+import io.opentracing.mock.MockTracer;
+import io.opentracing.util.GlobalTracer;
+import lombok.SneakyThrows;
+import org.junit.rules.ExternalResource;
+import org.mockito.internal.util.reflection.FieldReader;
+
+import java.util.List;
+
+public class JaegerCollector extends ExternalResource implements CollectorRule 
{
+    private MockTracer tracer;
+    
+    @Override
+    @SneakyThrows
+    protected void before() {
+        if (!GlobalTracer.isRegistered()) {
+            GlobalTracer.register(new MockTracer());
+        }
+        FieldReader fieldReader = new FieldReader(GlobalTracer.get(), 
GlobalTracer.class.getDeclaredField("tracer"));
+        tracer = (MockTracer) fieldReader.read();
+    }
+    
+    /**
+     * Get all spans.
+     * @return all spans.
+     */
+    public List<MockSpan> finishedSpans() {
+        return tracer.finishedSpans();
+    }
+    
+    @Override
+    public void cleanup() {
+        tracer.reset();
+    }
+    
+    @Override
+    @SneakyThrows
+    protected void after() {
+        super.after();
+    }
+}
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/ZipkinCollector.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/ZipkinCollector.java
new file mode 100644
index 0000000..e060308
--- /dev/null
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-test/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/rule/ZipkinCollector.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.agent.plugin.tracing.rule;
+
+import brave.Tracing;
+import brave.propagation.StrictCurrentTraceContext;
+import lombok.SneakyThrows;
+import org.junit.rules.ExternalResource;
+import zipkin2.Span;
+
+import java.util.concurrent.ConcurrentLinkedDeque;
+
+public class ZipkinCollector extends ExternalResource implements CollectorRule 
{
+    
+    private static final ConcurrentLinkedDeque<Span> SPANS = new 
ConcurrentLinkedDeque<>();
+    
+    @Override
+    @SneakyThrows
+    protected void before() {
+        Tracing.newBuilder()
+                .currentTraceContext(StrictCurrentTraceContext.create())
+                .spanReporter(SPANS::add)
+                .build();
+    }
+    
+    @Override
+    @SneakyThrows
+    protected void after() {
+        Tracing.current().close();
+    }
+    
+    /**
+     * Get the first Span.
+     *
+     * @return span
+     */
+    public Span pop() {
+        return SPANS.pollFirst();
+    }
+    
+    @Override
+    public void cleanup() {
+        SPANS.clear();
+    }
+}
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/pom.xml
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/pom.xml
index 7c47eef..f6bd42b 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/pom.xml
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/pom.xml
@@ -28,11 +28,6 @@
     <artifactId>shardingsphere-agent-tracing-zipkin</artifactId>
     <name>${project.artifactId}</name>
 
-    <properties>
-        <zipkin-reporter.version>2.16.2</zipkin-reporter.version>
-        <zipkin-brave.version>5.13.2</zipkin-brave.version>
-    </properties>
-
     <dependencies>
         <dependency>
             <groupId>io.zipkin.brave</groupId>
@@ -59,5 +54,9 @@
             <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-proxy-frontend-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-agent-tracing-test</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdvice.java
index c6e393d..940432c 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdvice.java
@@ -54,7 +54,7 @@ public final class CommandExecutorTaskAdvice implements 
InstanceMethodAroundAdvi
         BackendConnection connection = (BackendConnection) field.get(target);
         Span span = (Span) 
ExecutorDataMap.getValue().remove(ZipkinConstants.ROOT_SPAN);
         span.tag(ZipkinConstants.Tags.CONNECTION_COUNT, 
String.valueOf(connection.getConnectionSize()));
-        span.flush();
+        span.finish();
     }
     
     @Override
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdvice.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdvice.java
index 2e96a71..9079e6d 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdvice.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdvice.java
@@ -41,6 +41,7 @@ public final class SQLParserEngineAdvice implements 
InstanceMethodAroundAdvice {
         Span span = 
Tracing.currentTracer().newChild(parentContext).name(OPERATION_NAME);
         span.tag(ZipkinConstants.Tags.COMPONENT, 
ZipkinConstants.COMPONENT_NAME);
         span.tag(ZipkinConstants.Tags.DB_TYPE, ZipkinConstants.DB_TYPE_VALUE);
+        span.tag(ZipkinConstants.Tags.DB_STATEMENT, String.valueOf(args[0]));
         span.start();
         target.setAttachment(span);
     }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
index 02563ec..81443d7 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/constant/ZipkinConstants.java
@@ -28,7 +28,7 @@ public final class ZipkinConstants {
     
     public static final String COMPONENT_NAME = "shardingsphere";
     
-    public static final String ROOT_SPAN = "_root_span_";
+    public static final String ROOT_SPAN = "zipkin_root_span";
     
     public static final String DB_TYPE_VALUE = "shardingsphere-proxy";
     
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/AdviceBaseTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/AdviceBaseTest.java
deleted file mode 100644
index 03ef4d6..0000000
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/AdviceBaseTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
-
-import brave.Tracing;
-import brave.propagation.StrictCurrentTraceContext;
-import net.bytebuddy.ByteBuddy;
-import net.bytebuddy.agent.ByteBuddyAgent;
-import net.bytebuddy.agent.builder.AgentBuilder;
-import net.bytebuddy.dynamic.scaffold.TypeValidation;
-import net.bytebuddy.implementation.FieldAccessor;
-import net.bytebuddy.jar.asm.Opcodes;
-import net.bytebuddy.matcher.ElementMatchers;
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
-import zipkin2.Span;
-
-import java.util.concurrent.ConcurrentLinkedDeque;
-
-public abstract class AdviceBaseTest {
-    
-    public static final ConcurrentLinkedDeque<Span> SPANS = new 
ConcurrentLinkedDeque<>();
-    
-    private static final String EXTRA_DATA = "_$EXTRA_DATA$_";
-    
-    /**
-     * Prepare env for testing.
-     * @param klass class
-     */
-    public static void prepare(final String klass) {
-        ByteBuddyAgent.install();
-        new AgentBuilder.Default().with(new 
ByteBuddy().with(TypeValidation.ENABLED))
-                .with(new ByteBuddy())
-                .type(ElementMatchers.named(klass))
-                .transform((builder, typeDescription, classLoader, module) -> {
-                    if (klass.equals(typeDescription.getTypeName())) {
-                        return builder.defineField(EXTRA_DATA, Object.class, 
Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE)
-                                .implement(AdviceTargetObject.class)
-                                .intercept(FieldAccessor.ofField(EXTRA_DATA));
-                    }
-                    return builder;
-                }).installOnByteBuddyAgent();
-        Tracing.newBuilder()
-                .currentTraceContext(StrictCurrentTraceContext.create())
-                .spanReporter(SPANS::add)
-                .build();
-    }
-}
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdviceTest.java
index 18acf87..920a081 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdviceTest.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/CommandExecutorTaskAdviceTest.java
@@ -17,57 +17,39 @@
 
 package org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
 
-import io.netty.channel.ChannelHandlerContext;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
+import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractCommandExecutorTaskAdviceTest;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.ZipkinCollector;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.db.protocol.payload.PacketPayload;
-import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask;
-import org.apache.shardingsphere.transaction.core.TransactionType;
-import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
 import zipkin2.Span;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
-public final class CommandExecutorTaskAdviceTest extends AdviceBaseTest {
+public final class CommandExecutorTaskAdviceTest extends 
AbstractCommandExecutorTaskAdviceTest {
     
-    private static Method executeCommandMethod;
+    @ClassRule
+    public static ZipkinCollector collector = new ZipkinCollector();
     
     private CommandExecutorTaskAdvice advice;
     
-    private AdviceTargetObject targetObject;
-    
-    @BeforeClass
-    public static void setup() throws NoSuchMethodException {
-        
prepare("org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask");
-        executeCommandMethod = 
CommandExecutorTask.class.getDeclaredMethod("executeCommand", 
ChannelHandlerContext.class, PacketPayload.class, BackendConnection.class);
-    }
-    
     @Before
-    @SneakyThrows
-    @SuppressWarnings("all")
-    public void before() {
+    public void setup() {
         advice = new CommandExecutorTaskAdvice();
-        Object executorTask = new CommandExecutorTask(null, new 
BackendConnection(TransactionType.BASE), null, null);
-        targetObject = (AdviceTargetObject) executorTask;
     }
     
     @Test
     public void testMethod() {
-        advice.beforeMethod(targetObject, executeCommandMethod, new 
Object[]{}, new MethodInvocationResult());
-        advice.afterMethod(targetObject, executeCommandMethod, new Object[]{}, 
new MethodInvocationResult());
-        Span span = SPANS.poll();
+        advice.beforeMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        advice.afterMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        Span span = collector.pop();
         assertNotNull(span);
         Map<String, String> tags = span.tags();
         assertThat(tags.get(ZipkinConstants.Tags.DB_TYPE), 
is(ZipkinConstants.DB_TYPE_VALUE));
@@ -78,10 +60,10 @@ public final class CommandExecutorTaskAdviceTest extends 
AdviceBaseTest {
     
     @Test
     public void testExceptionHandle() {
-        advice.beforeMethod(targetObject, executeCommandMethod, new 
Object[]{}, new MethodInvocationResult());
-        advice.onThrowing(targetObject, executeCommandMethod, new Object[]{}, 
new IOException());
-        advice.afterMethod(targetObject, executeCommandMethod, new Object[]{}, 
new MethodInvocationResult());
-        Span span = SPANS.poll();
+        advice.beforeMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        advice.onThrowing(getTargetObject(), null, new Object[]{}, new 
IOException());
+        advice.afterMethod(getTargetObject(), null, new Object[]{}, new 
MethodInvocationResult());
+        Span span = collector.pop();
         assertNotNull(span);
         Map<String, String> tags = span.tags();
         assertThat(tags.get("error"), is("IOException"));
@@ -91,8 +73,4 @@ public final class CommandExecutorTaskAdviceTest extends 
AdviceBaseTest {
         assertThat(span.name(), 
is("/ShardingSphere/rootInvoke/".toLowerCase()));
     }
     
-    @After
-    public void cleanup() {
-        SPANS.clear();
-    }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/JDBCExecutorCallbackAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/JDBCExecutorCallbackAdviceTest.java
index 591ec3f..fe11221 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/JDBCExecutorCallbackAdviceTest.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/JDBCExecutorCallbackAdviceTest.java
@@ -17,94 +17,41 @@
 
 package org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
+import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractJDBCExecutorCallbackAdviceTest;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.ZipkinCollector;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
-import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
-import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
-import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
-import org.mockito.internal.util.reflection.FieldReader;
 import zipkin2.Span;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.Statement;
 import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
-public final class JDBCExecutorCallbackAdviceTest extends AdviceBaseTest {
+public final class JDBCExecutorCallbackAdviceTest extends 
AbstractJDBCExecutorCallbackAdviceTest {
     
-    private static Method executeMethod;
+    @ClassRule
+    public static ZipkinCollector collector = new ZipkinCollector();
     
     private JDBCExecutorCallbackAdvice advice;
     
-    private AdviceTargetObject targetObject;
-    
-    private Object attachment;
-    
-    private JDBCExecutionUnit executionUnit;
-    
-    private Map<String, Object> extraMap;
-    
-    @BeforeClass
-    @SneakyThrows
-    public static void setup() {
-        
prepare("org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback");
-        executeMethod = 
JDBCExecutorCallback.class.getDeclaredMethod("execute", 
JDBCExecutionUnit.class, boolean.class, Map.class);
-    }
-    
     @Before
-    @SneakyThrows
-    @SuppressWarnings("all")
-    public void before() {
-        extraMap = Maps.newHashMap();
-        extraMap.put(ZipkinConstants.ROOT_SPAN, null);
-        Statement statement = mock(Statement.class);
-        Connection connection = mock(Connection.class);
-        DatabaseMetaData metaData = mock(DatabaseMetaData.class);
-        when(metaData.getURL()).thenReturn("mock_url");
-        when(connection.getMetaData()).thenReturn(metaData);
-        when(statement.getConnection()).thenReturn(connection);
-        executionUnit = new JDBCExecutionUnit(new ExecutionUnit("mock.db", new 
SQLUnit("select 1", Lists.newArrayList())), null, statement);
-        JDBCExecutorCallback mock = mock(JDBCExecutorCallback.class, 
invocation -> {
-            switch (invocation.getMethod().getName()) {
-                case "getAttachment":
-                    return attachment;
-                case "setAttachment":
-                    attachment = invocation.getArguments()[0];
-                    return null;
-                default:
-                    return invocation.callRealMethod();
-            }
-        });
-        Map<String, DataSourceMetaData> map = (Map<String, 
DataSourceMetaData>) new FieldReader(mock, 
JDBCExecutorCallback.class.getDeclaredField("CACHED_DATASOURCE_METADATA")).read();
-        map.put("mock_url", new MockDataSourceMetaData());
-        targetObject = (AdviceTargetObject) mock;
+    public void setup() {
+        getExtraMap().put(ZipkinConstants.ROOT_SPAN, null);
         advice = new JDBCExecutorCallbackAdvice();
     }
     
     @Test
     public void testMethod() {
-        advice.beforeMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        advice.afterMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        Span span = SPANS.pollFirst();
+        advice.beforeMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        advice.afterMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        Span span = collector.pop();
         assertNotNull(span);
         assertThat(span.name(), 
is("/ShardingSphere/executeSQL/".toLowerCase()));
         Map<String, String> tags = span.tags();
@@ -119,10 +66,10 @@ public final class JDBCExecutorCallbackAdviceTest extends 
AdviceBaseTest {
     
     @Test
     public void testExceptionHandle() {
-        advice.beforeMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        advice.onThrowing(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new IOException());
-        advice.afterMethod(targetObject, executeMethod, new 
Object[]{executionUnit, false, extraMap}, new MethodInvocationResult());
-        Span span = SPANS.pollFirst();
+        advice.beforeMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        advice.onThrowing(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new IOException());
+        advice.afterMethod(getTargetObject(), null, new 
Object[]{getExecutionUnit(), false, getExtraMap()}, new 
MethodInvocationResult());
+        Span span = collector.pop();
         assertNotNull(span);
         assertThat(span.name(), 
is("/ShardingSphere/executeSQL/".toLowerCase()));
         Map<String, String> tags = span.tags();
@@ -136,8 +83,4 @@ public final class JDBCExecutorCallbackAdviceTest extends 
AdviceBaseTest {
         assertThat(tags.get("error"), is("IOException"));
     }
     
-    @After
-    public void cleanup() {
-        SPANS.clear();
-    }
 }
diff --git 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdviceTest.java
 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdviceTest.java
index 3f81c8fe..ae5e84c 100644
--- 
a/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdviceTest.java
+++ 
b/shardingsphere-agent/shardingsphere-agent-plugins/shardingsphere-agent-plugin-tracing/shardingsphere-agent-tracing-zipkin/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/zipkin/advice/SQLParserEngineAdviceTest.java
@@ -20,73 +20,47 @@ package 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.advice;
 import brave.Span;
 import brave.Tracing;
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
 import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
+import 
org.apache.shardingsphere.agent.plugin.tracing.advice.AbstractSQLParserEngineAdviceTest;
+import org.apache.shardingsphere.agent.plugin.tracing.rule.ZipkinCollector;
 import 
org.apache.shardingsphere.agent.plugin.tracing.zipkin.constant.ZipkinConstants;
 import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
-import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.ClassRule;
 import org.junit.Test;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
 
-public final class SQLParserEngineAdviceTest extends AdviceBaseTest {
+public final class SQLParserEngineAdviceTest extends 
AbstractSQLParserEngineAdviceTest {
     
-    private static final String SQL_STMT = "select 1";
+    @ClassRule
+    public static ZipkinCollector collector = new ZipkinCollector();
     
-    private static Method parseMethod;
+    private static final String SQL_STMT = "select 1";
     
     private SQLParserEngineAdvice advice;
     
-    private AdviceTargetObject targetObject;
-    
-    private Object attachment;
-    
     private Span parentSpan;
     
-    @BeforeClass
-    @SneakyThrows
-    public static void setup() {
-        
prepare("org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine");
-        parseMethod = 
ShardingSphereSQLParserEngine.class.getDeclaredMethod("parse", String.class, 
boolean.class);
-    }
-    
     @Before
     @SneakyThrows
-    @SuppressWarnings("all")
-    public void before() {
+    public void setup() {
         parentSpan = Tracing.currentTracer().newTrace().name("parent").start();
         ExecutorDataMap.getValue().put(ZipkinConstants.ROOT_SPAN, parentSpan);
-        Object parserEngine = mock(ShardingSphereSQLParserEngine.class, 
invocation -> {
-            switch (invocation.getMethod().getName()) {
-                case "getAttachment":
-                    return attachment;
-                case "setAttachment":
-                    attachment = invocation.getArguments()[0];
-                    return null;
-                default:
-                    return invocation.callRealMethod();
-            }
-        });
-        targetObject = (AdviceTargetObject) parserEngine;
         advice = new SQLParserEngineAdvice();
     }
     
     @Test
     public void testMethod() {
-        advice.beforeMethod(targetObject, parseMethod, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
-        advice.afterMethod(targetObject, parseMethod, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
+        advice.beforeMethod(getTargetObject(), null, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
+        advice.afterMethod(getTargetObject(), null, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
         parentSpan.finish();
-        zipkin2.Span span = SPANS.pollFirst();
+        zipkin2.Span span = collector.pop();
         assertNotNull(span);
         assertNotNull(span.parentId());
         Map<String, String> tags = span.tags();
@@ -97,12 +71,12 @@ public final class SQLParserEngineAdviceTest extends 
AdviceBaseTest {
     
     @Test
     public void testExceptionHandle() {
-        advice.beforeMethod(targetObject, parseMethod, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
-        advice.onThrowing(targetObject, parseMethod, new Object[]{SQL_STMT, 
true}, new IOException());
-        advice.afterMethod(targetObject, parseMethod, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
+        advice.beforeMethod(getTargetObject(), null, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
+        advice.onThrowing(getTargetObject(), null, new Object[]{SQL_STMT, 
true}, new IOException());
+        advice.afterMethod(getTargetObject(), null, new Object[]{SQL_STMT, 
true}, new MethodInvocationResult());
         // ensure the parent span(mock) finished
         parentSpan.finish();
-        zipkin2.Span span = SPANS.pollFirst();
+        zipkin2.Span span = collector.pop();
         assertNotNull(span);
         assertNotNull(span.parentId());
         Map<String, String> tags = span.tags();
@@ -112,8 +86,4 @@ public final class SQLParserEngineAdviceTest extends 
AdviceBaseTest {
         assertThat(tags.get(ZipkinConstants.Tags.COMPONENT), 
is(ZipkinConstants.COMPONENT_NAME));
     }
     
-    @After
-    public void cleanup() {
-        SPANS.clear();
-    }
 }

Reply via email to