You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/03/09 07:13:18 UTC

[shardingsphere] branch master updated: Agent add tracing for jdbc (#24515)

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

jianglongtao 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 31f31ad2662 Agent add tracing for jdbc (#24515)
31f31ad2662 is described below

commit 31f31ad2662236a2293d1358fa07ba49c88e7244
Author: jiangML <10...@qq.com>
AuthorDate: Thu Mar 9 15:13:08 2023 +0800

    Agent add tracing for jdbc (#24515)
    
    * optimize tracing and add tracing about JDBC
    
    * optimize code
    
    * update agent tracing doc
    
    * optimize code
    
    * optimize code
    
    * optimize code
    
    * optimize agent file plugin e2e test
---
 .../agent/core/ShardingSphereAgent.java            |  8 ++----
 .../advisor/config/AdvisorConfigurationLoader.java |  6 ++--
 .../agent/core/builder/AgentTransformer.java       | 33 ++++++++++++++++++++--
 ...rTaskAdvice.java => TracingRootSpanAdvice.java} |  4 +--
 ...dvice.java => OpenTelemetryRootSpanAdvice.java} |  6 ++--
 ...y-advisors.yaml => opentelemetry-advisors.yaml} | 23 ++++++++++++++-
 .../META-INF/conf/opentelemetry-jdbc-advisors.yaml | 16 -----------
 ...t.java => OpenTelemetryRootSpanAdviceTest.java} |  6 ++--
 ...kAdvice.java => OpenTracingRootSpanAdvice.java} |  6 ++--
 ...oxy-advisors.yaml => opentracing-advisors.yaml} | 23 ++++++++++++++-
 .../META-INF/conf/opentracing-jdbc-advisors.yaml   | 16 -----------
 ...est.java => OpenTracingRootSpanAdviceTest.java} |  4 +--
 .../shardingsphere-jdbc/observability/_index.cn.md | 14 +++++++++
 .../shardingsphere-jdbc/observability/_index.en.md | 15 ++++++++++
 .../test/e2e/agent/file/FilePluginE2EIT.java       |  2 +-
 .../test/e2e/agent/file/loader/LogLoader.java      |  6 ++--
 16 files changed, 126 insertions(+), 62 deletions(-)

diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereAgent.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereAgent.java
index 012c3de26b8..9b32b64d2a5 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereAgent.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/ShardingSphereAgent.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.agent.core;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import net.bytebuddy.pool.TypePool;
 import org.apache.shardingsphere.agent.api.PluginConfiguration;
 import org.apache.shardingsphere.agent.core.advisor.config.AdvisorConfiguration;
 import org.apache.shardingsphere.agent.core.advisor.config.AdvisorConfigurationLoader;
@@ -57,11 +58,6 @@ public final class ShardingSphereAgent {
     }
     
     private static boolean isEnhancedForProxy() {
-        try {
-            Class.forName("org.apache.shardingsphere.proxy.Bootstrap");
-        } catch (final ClassNotFoundException ignored) {
-            return false;
-        }
-        return true;
+        return TypePool.Default.ofSystemLoader().describe("org.apache.shardingsphere.proxy.Bootstrap").isResolved();
     }
 }
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
index d5f30088ea4..22bff1ae6eb 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
@@ -24,8 +24,8 @@ import org.apache.shardingsphere.agent.core.advisor.config.yaml.swapper.YamlAdvi
 import org.apache.shardingsphere.agent.core.log.AgentLogger;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
 import org.apache.shardingsphere.agent.core.plugin.classloader.AgentPluginClassLoader;
-import org.apache.shardingsphere.agent.core.plugin.jar.PluginJarLoader;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.Collection;
 import java.util.HashMap;
@@ -38,7 +38,7 @@ import java.util.jar.JarFile;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class AdvisorConfigurationLoader {
     
-    private static final AgentLogger LOGGER = AgentLoggerFactory.getAgentLogger(PluginJarLoader.class);
+    private static final AgentLogger LOGGER = AgentLoggerFactory.getAgentLogger(AdvisorConfigurationLoader.class);
     
     /**
      * Load advisor configurations.
@@ -68,7 +68,7 @@ public final class AdvisorConfigurationLoader {
     }
     
     private static InputStream getResourceStream(final ClassLoader pluginClassLoader, final String fileName) {
-        return pluginClassLoader.getResourceAsStream(String.join("/", "META-INF", "conf", fileName));
+        return pluginClassLoader.getResourceAsStream(String.join(File.separator, "META-INF", "conf", fileName));
     }
     
     private static String getFileName(final String pluginType, final boolean isEnhancedForProxy) {
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
index 64167658c44..2b932b45ac3 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
@@ -21,17 +21,25 @@ import lombok.RequiredArgsConstructor;
 import net.bytebuddy.agent.builder.AgentBuilder.Transformer;
 import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.dynamic.DynamicType.Builder;
+import net.bytebuddy.pool.TypePool;
+import net.bytebuddy.pool.TypePool.Default;
 import net.bytebuddy.utility.JavaModule;
 import org.apache.shardingsphere.agent.api.PluginConfiguration;
 import org.apache.shardingsphere.agent.core.advisor.config.AdvisorConfiguration;
+import org.apache.shardingsphere.agent.core.advisor.config.AdvisorConfigurationLoader;
+import org.apache.shardingsphere.agent.core.advisor.config.MethodAdvisorConfiguration;
 import org.apache.shardingsphere.agent.core.builder.interceptor.AgentBuilderInterceptChainEngine;
 import org.apache.shardingsphere.agent.core.builder.interceptor.impl.MethodAdvisorBuilderInterceptor;
 import org.apache.shardingsphere.agent.core.builder.interceptor.impl.TargetAdviceObjectBuilderInterceptor;
+import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
 import org.apache.shardingsphere.agent.core.classloader.ClassLoaderContext;
+import org.apache.shardingsphere.agent.core.log.AgentLogger;
+import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
 import org.apache.shardingsphere.agent.core.plugin.PluginLifecycleServiceManager;
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.jar.JarFile;
 
 /**
@@ -40,6 +48,10 @@ import java.util.jar.JarFile;
 @RequiredArgsConstructor
 public final class AgentTransformer implements Transformer {
     
+    private static final AgentLogger LOGGER = AgentLoggerFactory.getAgentLogger(AdvisorConfigurationLoader.class);
+    
+    private static final Map<AgentExtraClassLoader, TypePool> TYPE_POOL_MAP = new ConcurrentHashMap<>();
+    
     private final Map<String, PluginConfiguration> pluginConfigs;
     
     private final Collection<JarFile> pluginJars;
@@ -56,7 +68,24 @@ public final class AgentTransformer implements Transformer {
         }
         ClassLoaderContext classLoaderContext = new ClassLoaderContext(classLoader, pluginJars);
         PluginLifecycleServiceManager.init(pluginConfigs, pluginJars, classLoaderContext.getPluginClassLoader(), isEnhancedForProxy);
-        return AgentBuilderInterceptChainEngine.intercept(builder,
-                new TargetAdviceObjectBuilderInterceptor(), new MethodAdvisorBuilderInterceptor(typeDescription, classLoaderContext, advisorConfigs.get(typeDescription.getTypeName())));
+        return AgentBuilderInterceptChainEngine.intercept(builder, new TargetAdviceObjectBuilderInterceptor(),
+                new MethodAdvisorBuilderInterceptor(typeDescription, classLoaderContext, filterInvalidAdviceClass(advisorConfigs.get(typeDescription.getTypeName()), classLoaderContext)));
+    }
+    
+    private AdvisorConfiguration filterInvalidAdviceClass(final AdvisorConfiguration advisorConfig, final ClassLoaderContext classLoaderContext) {
+        AdvisorConfiguration result = new AdvisorConfiguration(advisorConfig.getTargetClassName());
+        for (MethodAdvisorConfiguration each : advisorConfig.getAdvisors()) {
+            if (isExist(each.getAdviceClassName(), classLoaderContext.getPluginClassLoader())) {
+                result.getAdvisors().add(each);
+                continue;
+            }
+            LOGGER.error("The advice class `{}` does not exist", each.getAdviceClassName());
+        }
+        return result;
+    }
+    
+    private boolean isExist(final String adviceClassName, final AgentExtraClassLoader pluginClassLoader) {
+        TypePool typePool = TYPE_POOL_MAP.get(pluginClassLoader);
+        return null == typePool ? TYPE_POOL_MAP.computeIfAbsent(pluginClassLoader, Default::of).describe(adviceClassName).isResolved() : typePool.describe(adviceClassName).isResolved();
     }
 }
diff --git a/agent/plugins/tracing/core/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/core/advice/TracingCommandExecutorTaskAdvice.java b/agent/plugins/tracing/core/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/core/advice/TracingRootSpanAdvice.java
similarity index 94%
rename from agent/plugins/tracing/core/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/core/advice/TracingCommandExecutorTaskAdvice.java
rename to agent/plugins/tracing/core/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/core/advice/TracingRootSpanAdvice.java
index 78a60908102..6a1a234f35b 100644
--- a/agent/plugins/tracing/core/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/core/advice/TracingCommandExecutorTaskAdvice.java
+++ b/agent/plugins/tracing/core/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/core/advice/TracingRootSpanAdvice.java
@@ -24,11 +24,11 @@ import org.apache.shardingsphere.agent.plugin.tracing.core.RootSpanContext;
 import java.lang.reflect.Method;
 
 /**
- * Tracing command executor task advice executor.
+ * Tracing root span advice.
  * 
  * @param <T> type of span
  */
-public abstract class TracingCommandExecutorTaskAdvice<T> implements InstanceMethodAdvice {
+public abstract class TracingRootSpanAdvice<T> implements InstanceMethodAdvice {
     
     protected static final String OPERATION_NAME = "/ShardingSphere/rootInvoke/";
     
diff --git a/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryCommandExecutorTaskAdvice.java b/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryRootSpanAdvice.java
similarity index 92%
rename from agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryCommandExecutorTaskAdvice.java
rename to agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryRootSpanAdvice.java
index c714cb6f946..827f8e1c364 100644
--- a/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryCommandExecutorTaskAdvice.java
+++ b/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryRootSpanAdvice.java
@@ -22,16 +22,16 @@ import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.api.trace.SpanBuilder;
 import io.opentelemetry.api.trace.StatusCode;
 import org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
-import org.apache.shardingsphere.agent.plugin.tracing.core.advice.TracingCommandExecutorTaskAdvice;
+import org.apache.shardingsphere.agent.plugin.tracing.core.advice.TracingRootSpanAdvice;
 import org.apache.shardingsphere.agent.plugin.tracing.core.constant.AttributeConstants;
 import org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.constant.OpenTelemetryConstants;
 
 import java.lang.reflect.Method;
 
 /**
- * OpenTelemetry command executor task advice executor.
+ * OpenTelemetry root span advice.
  */
-public final class OpenTelemetryCommandExecutorTaskAdvice extends TracingCommandExecutorTaskAdvice<Span> {
+public final class OpenTelemetryRootSpanAdvice extends TracingRootSpanAdvice<Span> {
     
     @Override
     protected Span createRootSpan(final TargetAdviceObject target, final Method method, final Object[] args) {
diff --git a/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-proxy-advisors.yaml b/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-advisors.yaml
similarity index 66%
rename from agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-proxy-advisors.yaml
rename to agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-advisors.yaml
index 0fbbd7f9329..d61d61f8c44 100644
--- a/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-proxy-advisors.yaml
+++ b/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-advisors.yaml
@@ -17,10 +17,31 @@
 
 advisors:
   - target: org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask
-    advice: org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.advice.OpenTelemetryCommandExecutorTaskAdvice
+    advice: org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.advice.OpenTelemetryRootSpanAdvice
     pointcuts:
       - name: run
         type: method
+  - target: org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement
+    advice: org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.advice.OpenTelemetryRootSpanAdvice
+    pointcuts:
+      - name: executeQuery
+        type: method
+      - name: execute
+        type: method
+      - name: executeUpdate
+        type: method
+        params:
+          - index: 0
+            type: java.lang.String
+  - target: org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement
+    advice: org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.advice.OpenTelemetryRootSpanAdvice
+    pointcuts:
+      - name: executeQuery
+        type: method
+      - name: execute
+        type: method
+      - name: executeUpdate
+        type: method
   - target: org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine
     advice: org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.advice.OpenTelemetrySQLParserEngineAdvice
     pointcuts:
diff --git a/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-jdbc-advisors.yaml b/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-jdbc-advisors.yaml
deleted file mode 100644
index b1312a0905c..00000000000
--- a/agent/plugins/tracing/type/opentelemetry/src/main/resources/META-INF/conf/opentelemetry-jdbc-advisors.yaml
+++ /dev/null
@@ -1,16 +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.
-#
diff --git a/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryCommandExecutorTaskAdviceTest.java b/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryRootSpanAdviceTest.java
similarity index 95%
rename from agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryCommandExecutorTaskAdviceTest.java
rename to agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryRootSpanAdviceTest.java
index 8d936d633ef..f9585fc364c 100644
--- a/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryCommandExecutorTaskAdviceTest.java
+++ b/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryRootSpanAdviceTest.java
@@ -54,7 +54,7 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith({AgentExtension.class, AutoMockExtension.class})
 @StaticMockSettings(ProxyContext.class)
-public final class OpenTelemetryCommandExecutorTaskAdviceTest {
+public final class OpenTelemetryRootSpanAdviceTest {
     
     private final InMemorySpanExporter testExporter = InMemorySpanExporter.create();
     
@@ -78,7 +78,7 @@ public final class OpenTelemetryCommandExecutorTaskAdviceTest {
     
     @Test
     public void assertMethod() {
-        OpenTelemetryCommandExecutorTaskAdvice advice = new OpenTelemetryCommandExecutorTaskAdvice();
+        OpenTelemetryRootSpanAdvice advice = new OpenTelemetryRootSpanAdvice();
         advice.beforeMethod(targetObject, null, new Object[]{}, "OpenTelemetry");
         advice.afterMethod(targetObject, null, new Object[]{}, null, "OpenTelemetry");
         List<SpanData> spanItems = testExporter.getFinishedSpanItems();
@@ -91,7 +91,7 @@ public final class OpenTelemetryCommandExecutorTaskAdviceTest {
     
     @Test
     public void assertExceptionHandle() {
-        OpenTelemetryCommandExecutorTaskAdvice advice = new OpenTelemetryCommandExecutorTaskAdvice();
+        OpenTelemetryRootSpanAdvice advice = new OpenTelemetryRootSpanAdvice();
         advice.beforeMethod(targetObject, null, new Object[]{}, "OpenTelemetry");
         advice.onThrowing(targetObject, null, new Object[]{}, new IOException(), "OpenTelemetry");
         List<SpanData> spanItems = testExporter.getFinishedSpanItems();
diff --git a/agent/plugins/tracing/type/opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingCommandExecutorTaskAdvice.java b/agent/plugins/tracing/type/opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingRootSpanAdvice.java
similarity index 91%
rename from agent/plugins/tracing/type/opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingCommandExecutorTaskAdvice.java
rename to agent/plugins/tracing/type/opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingRootSpanAdvice.java
index ef24baeb155..8adf13b9f37 100644
--- a/agent/plugins/tracing/type/opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingCommandExecutorTaskAdvice.java
+++ b/agent/plugins/tracing/type/opentracing/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingRootSpanAdvice.java
@@ -20,16 +20,16 @@ package org.apache.shardingsphere.agent.plugin.tracing.opentracing.advice;
 import io.opentracing.Span;
 import io.opentracing.util.GlobalTracer;
 import org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
-import org.apache.shardingsphere.agent.plugin.tracing.core.advice.TracingCommandExecutorTaskAdvice;
+import org.apache.shardingsphere.agent.plugin.tracing.core.advice.TracingRootSpanAdvice;
 import org.apache.shardingsphere.agent.plugin.tracing.core.constant.AttributeConstants;
 import org.apache.shardingsphere.agent.plugin.tracing.opentracing.span.OpenTracingErrorSpan;
 
 import java.lang.reflect.Method;
 
 /**
- * OpenTracing command executor task advice executor.
+ * OpenTracing root span advice.
  */
-public final class OpenTracingCommandExecutorTaskAdvice extends TracingCommandExecutorTaskAdvice<Span> {
+public final class OpenTracingRootSpanAdvice extends TracingRootSpanAdvice<Span> {
     
     @Override
     protected Span createRootSpan(final TargetAdviceObject target, final Method method, final Object[] args) {
diff --git a/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-proxy-advisors.yaml b/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-advisors.yaml
similarity index 67%
rename from agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-proxy-advisors.yaml
rename to agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-advisors.yaml
index 7d039fd47b2..d28b70f26cc 100644
--- a/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-proxy-advisors.yaml
+++ b/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-advisors.yaml
@@ -17,10 +17,31 @@
 
 advisors:
   - target: org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask
-    advice: org.apache.shardingsphere.agent.plugin.tracing.opentracing.advice.OpenTracingCommandExecutorTaskAdvice
+    advice: org.apache.shardingsphere.agent.plugin.tracing.opentracing.advice.OpenTracingRootSpanAdvice
     pointcuts:
       - name: run
         type: method
+  - target: org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement
+    advice: org.apache.shardingsphere.agent.plugin.tracing.opentracing.advice.OpenTracingRootSpanAdvice
+    pointcuts:
+      - name: executeQuery
+        type: method
+      - name: execute
+        type: method
+      - name: executeUpdate
+        type: method
+        params:
+          - index: 0
+            type: java.lang.String
+  - target: org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement
+    advice: org.apache.shardingsphere.agent.plugin.tracing.opentracing.advice.OpenTracingRootSpanAdvice
+    pointcuts:
+      - name: executeQuery
+        type: method
+      - name: execute
+        type: method
+      - name: executeUpdate
+        type: method
   - target: org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine
     advice: org.apache.shardingsphere.agent.plugin.tracing.opentracing.advice.OpenTracingSQLParserEngineAdvice
     pointcuts:
diff --git a/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-jdbc-advisors.yaml b/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-jdbc-advisors.yaml
deleted file mode 100644
index b1312a0905c..00000000000
--- a/agent/plugins/tracing/type/opentracing/src/main/resources/META-INF/conf/opentracing-jdbc-advisors.yaml
+++ /dev/null
@@ -1,16 +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.
-#
diff --git a/agent/plugins/tracing/type/opentracing/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingCommandExecutorTaskAdviceTest.java b/agent/plugins/tracing/type/opentracing/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingRootSpanAdviceTest.java
similarity index 96%
rename from agent/plugins/tracing/type/opentracing/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingCommandExecutorTaskAdviceTest.java
rename to agent/plugins/tracing/type/opentracing/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingRootSpanAdviceTest.java
index 279166c7a6d..2bfb6825a7e 100644
--- a/agent/plugins/tracing/type/opentracing/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingCommandExecutorTaskAdviceTest.java
+++ b/agent/plugins/tracing/type/opentracing/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentracing/advice/OpenTracingRootSpanAdviceTest.java
@@ -56,9 +56,9 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith({AgentExtension.class, AutoMockExtension.class})
 @StaticMockSettings(ProxyContext.class)
-public final class OpenTracingCommandExecutorTaskAdviceTest {
+public final class OpenTracingRootSpanAdviceTest {
     
-    private static final OpenTracingCommandExecutorTaskAdvice ADVICE = new OpenTracingCommandExecutorTaskAdvice();
+    private static final OpenTracingRootSpanAdvice ADVICE = new OpenTracingRootSpanAdvice();
     
     private static MockTracer tracer;
     
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.cn.md
index befb856d874..0b415b93a48 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.cn.md
@@ -90,6 +90,20 @@ plugins:
 | port                              | 端口                 |
 | jvm-information-collector-enabled | 是否采集 JVM 指标信息  |
 
+#### OpenTelemetry
+
+OpenTelemetry 可以导出 tracing 数据到 Jaeger,Zipkin。
+
+* 参数说明
+
+| 名称                                 | 说明                |
+|------------------------------------|----------------------|
+| otel.service.name                  | 服务名称              |
+| otel.traces.exporter               | traces exporter      |
+| otel.exporter.otlp.traces.endpoint | traces endpoint      |
+| otel.traces.sampler                | traces sampler       |
+
+参数参考 [OpenTelemetry SDK Autoconfigure](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure)
 
 ## ShardingSphere-JDBC 使用
 
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.en.md
index 21eed5eab7b..f2c096a5a68 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/observability/_index.en.md
@@ -92,6 +92,21 @@ Used for exposure monitoring metrics.
 | port                              | port                                         |
 | jvm-information-collector-enabled | whether to collect JVM indicator information |
 
+#### OpenTelemetry
+
+OpenTelemetry can export tracing data to Jaeger, Zipkin.
+
+* Parameter description
+
+| Name                               | Description     |
+|------------------------------------|-----------------|
+| otel.service.name                  | service name    |
+| otel.traces.exporter               | traces exporter |
+| otel.exporter.otlp.traces.endpoint | traces endpoint |
+| otel.traces.sampler                | traces sampler  |
+
+Parameter reference [OpenTelemetry SDK Autoconfigure](https://github.com/open-telemetry/opentelemetry-java/tree/main/sdk-extensions/autoconfigure)
+
 ## Usage in ShardingSphere-JDBC
 
 + 1 The `SpringBoot` project ready to integrate `ShardingSphere-JDBC`, test-project.jar
diff --git a/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/FilePluginE2EIT.java b/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/FilePluginE2EIT.java
index 99d390bae8d..4b2681d9135 100644
--- a/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/FilePluginE2EIT.java
+++ b/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/FilePluginE2EIT.java
@@ -39,7 +39,7 @@ public final class FilePluginE2EIT extends BasePluginE2EIT {
     
     private Collection<String> getExpectedLogRegex() {
         Collection<String> result = new LinkedList<>();
-        result.add("Build meta data contexts finished, cost\\s(?=[1-9]+)");
+        result.add("Build meta data contexts finished, cost\\s(?=[1-9]+\\d*)");
         return result;
     }
 }
diff --git a/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/loader/LogLoader.java b/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/loader/LogLoader.java
index a662bb59721..40a971d340d 100644
--- a/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/loader/LogLoader.java
+++ b/test/e2e/agent/plugins/logging/file/src/test/java/org/apache/shardingsphere/test/e2e/agent/file/loader/LogLoader.java
@@ -49,7 +49,7 @@ public final class LogLoader {
             Matcher matcher = pattern.matcher(each);
             if (matcher.find()) {
                 if (hasFind) {
-                    result.add(builder.toString());
+                    result.add(builder.append(System.lineSeparator()).toString());
                     builder.delete(0, builder.length());
                 }
                 builder.append(each);
@@ -61,7 +61,7 @@ public final class LogLoader {
             }
         }
         if (builder.length() > 0) {
-            result.add(builder.toString());
+            result.add(builder.append(System.lineSeparator()).toString());
         }
         return result;
     }
@@ -72,7 +72,7 @@ public final class LogLoader {
      * @return log file path
      */
     public static String getLogFilePath() {
-        return String.join(File.separator, System.getProperty("user.dir"), "target", "logs", "stdout.log");
+        return String.join(File.separator, Paths.get("").toAbsolutePath().toString(), "target", "logs", "stdout.log");
     }
     
     /**