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

zhangliang 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 bb2c48096f8 Add nullability checks to the Agent's OpenTelemetry plugin 
(#37659)
bb2c48096f8 is described below

commit bb2c48096f8bceab8e02d944a4a1c31cb7941ebd
Author: Ling Hengqian <[email protected]>
AuthorDate: Fri Jan 9 12:30:07 2026 +0800

    Add nullability checks to the Agent's OpenTelemetry plugin (#37659)
---
 .../OpenTelemetryJDBCExecutorCallbackAdvice.java    | 16 +++++++++++-----
 .../advice/OpenTelemetrySQLParserEngineAdvice.java  | 16 +++++++++++-----
 ...OpenTelemetryJDBCExecutorCallbackAdviceTest.java | 18 +++++++++++++++---
 .../OpenTelemetrySQLParserEngineAdviceTest.java     | 21 +++++++++++++++++----
 4 files changed, 54 insertions(+), 17 deletions(-)

diff --git 
a/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdvice.java
 
b/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdvice.java
index d09d9913f4e..dab3e0b89bd 100644
--- 
a/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdvice.java
+++ 
b/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdvice.java
@@ -42,7 +42,9 @@ public final class OpenTelemetryJDBCExecutorCallbackAdvice 
extends TracingJDBCEx
                                      final ConnectionProperties 
connectionProps, final DatabaseType databaseType) {
         Tracer tracer = 
GlobalOpenTelemetry.getTracer(OpenTelemetryConstants.TRACER_NAME);
         SpanBuilder spanBuilder = tracer.spanBuilder(OPERATION_NAME);
-        spanBuilder.setParent(Context.current().with(parentSpan));
+        if (null != parentSpan) {
+            spanBuilder.setParent(Context.current().with(parentSpan));
+        }
         spanBuilder.setAttribute(AttributeConstants.COMPONENT, 
AttributeConstants.COMPONENT_NAME);
         spanBuilder.setAttribute(AttributeConstants.DB_TYPE, 
databaseType.getType());
         spanBuilder.setAttribute(AttributeConstants.DB_INSTANCE, 
executionUnit.getExecutionUnit().getDataSourceName())
@@ -57,14 +59,18 @@ public final class OpenTelemetryJDBCExecutorCallbackAdvice 
extends TracingJDBCEx
     @Override
     public void afterMethod(final TargetAdviceObject target, final 
TargetAdviceMethod method, final Object[] args, final Object result, final 
String pluginType) {
         Span span = (Span) target.getAttachment();
-        span.setStatus(StatusCode.OK);
-        span.end();
+        if (null != span) {
+            span.setStatus(StatusCode.OK);
+            span.end();
+        }
     }
     
     @Override
     public void onThrowing(final TargetAdviceObject target, final 
TargetAdviceMethod method, final Object[] args, final Throwable throwable, 
final String pluginType) {
         Span span = (Span) target.getAttachment();
-        span.setStatus(StatusCode.ERROR).recordException(throwable);
-        span.end();
+        if (null != span) {
+            span.setStatus(StatusCode.ERROR).recordException(throwable);
+            span.end();
+        }
     }
 }
diff --git 
a/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdvice.java
 
b/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdvice.java
index 4f87b13e586..67da40a83a9 100644
--- 
a/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdvice.java
+++ 
b/agent/plugins/tracing/type/opentelemetry/src/main/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdvice.java
@@ -41,7 +41,9 @@ public final class OpenTelemetrySQLParserEngineAdvice extends 
TracingSQLParserEn
                 .setAttribute(AttributeConstants.COMPONENT, 
AttributeConstants.COMPONENT_NAME)
                 .setAttribute(AttributeConstants.DB_STATEMENT, sql)
                 .setAttribute(AttributeConstants.SPAN_KIND, 
AttributeConstants.SPAN_KIND_INTERNAL);
-        spanBuilder.setParent(Context.current().with(parentSpan));
+        if (null != parentSpan) {
+            spanBuilder.setParent(Context.current().with(parentSpan));
+        }
         Span result = spanBuilder.startSpan();
         target.setAttachment(result);
         return result;
@@ -50,14 +52,18 @@ public final class OpenTelemetrySQLParserEngineAdvice 
extends TracingSQLParserEn
     @Override
     public void afterMethod(final TargetAdviceObject target, final 
TargetAdviceMethod method, final Object[] args, final Object result, final 
String pluginType) {
         Span span = (Span) target.getAttachment();
-        span.setStatus(StatusCode.OK);
-        span.end();
+        if (null != span) {
+            span.setStatus(StatusCode.OK);
+            span.end();
+        }
     }
     
     @Override
     public void onThrowing(final TargetAdviceObject target, final 
TargetAdviceMethod method, final Object[] args, final Throwable throwable, 
final String pluginType) {
         Span span = (Span) target.getAttachment();
-        span.setStatus(StatusCode.ERROR).recordException(throwable);
-        span.end();
+        if (null != span) {
+            span.setStatus(StatusCode.ERROR).recordException(throwable);
+            span.end();
+        }
     }
 }
diff --git 
a/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdviceTest.java
 
b/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdviceTest.java
index 48df33aff8d..b03bd9bbe9b 100644
--- 
a/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdviceTest.java
+++ 
b/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetryJDBCExecutorCallbackAdviceTest.java
@@ -21,6 +21,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.SpanId;
 import io.opentelemetry.api.trace.StatusCode;
 import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
@@ -119,24 +120,35 @@ class OpenTelemetryJDBCExecutorCallbackAdviceTest {
         advice.beforeMethod(targetObject, null, new Object[]{executionUnit, 
false}, "OpenTelemetry");
         advice.afterMethod(targetObject, null, new Object[]{executionUnit, 
false}, null, "OpenTelemetry");
         List<SpanData> spanItems = testExporter.getFinishedSpanItems();
-        assertCommonData(spanItems);
+        assertCommonData(spanItems, parentSpan.getSpanContext().getSpanId());
         assertThat(spanItems.iterator().next().getStatus().getStatusCode(), 
is(StatusCode.OK));
     }
     
+    @Test
+    void assertMethodWithoutParentSpan() {
+        RootSpanContext.set(null);
+        OpenTelemetryJDBCExecutorCallbackAdvice advice = new 
OpenTelemetryJDBCExecutorCallbackAdvice();
+        advice.beforeMethod(targetObject, null, new Object[]{executionUnit, 
false}, "OpenTelemetry");
+        advice.afterMethod(targetObject, null, new Object[]{executionUnit, 
false}, null, "OpenTelemetry");
+        List<SpanData> spanItems = testExporter.getFinishedSpanItems();
+        assertCommonData(spanItems, SpanId.getInvalid());
+    }
+    
     @Test
     void assertExceptionHandle() {
         OpenTelemetryJDBCExecutorCallbackAdvice advice = new 
OpenTelemetryJDBCExecutorCallbackAdvice();
         advice.beforeMethod(targetObject, null, new Object[]{executionUnit, 
false}, "OpenTelemetry");
         advice.onThrowing(targetObject, null, new Object[]{executionUnit, 
false}, new IOException(""), "OpenTelemetry");
         List<SpanData> spanItems = testExporter.getFinishedSpanItems();
-        assertCommonData(spanItems);
+        assertCommonData(spanItems, parentSpan.getSpanContext().getSpanId());
         assertThat(spanItems.iterator().next().getStatus().getStatusCode(), 
is(StatusCode.ERROR));
     }
     
-    private void assertCommonData(final List<SpanData> spanItems) {
+    private void assertCommonData(final List<SpanData> spanItems, final String 
expectedParentSpanId) {
         assertThat(spanItems.size(), is(1));
         SpanData spanData = spanItems.iterator().next();
         assertThat(spanData.getName(), is("/ShardingSphere/executeSQL/"));
+        assertThat(spanData.getParentSpanId(), is(expectedParentSpanId));
         Attributes attributes = spanData.getAttributes();
         
assertThat(attributes.get(AttributeKey.stringKey(AttributeConstants.COMPONENT)),
 is(AttributeConstants.COMPONENT_NAME));
         
assertThat(attributes.get(AttributeKey.stringKey(AttributeConstants.DB_TYPE)), 
is(DB_TYPE));
diff --git 
a/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdviceTest.java
 
b/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdviceTest.java
index 1cb6c967800..4336aad832d 100644
--- 
a/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdviceTest.java
+++ 
b/agent/plugins/tracing/type/opentelemetry/src/test/java/org/apache/shardingsphere/agent/plugin/tracing/opentelemetry/advice/OpenTelemetrySQLParserEngineAdviceTest.java
@@ -21,6 +21,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.SpanId;
 import io.opentelemetry.api.trace.StatusCode;
 import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
@@ -71,7 +72,19 @@ class OpenTelemetrySQLParserEngineAdviceTest {
         advice.beforeMethod(adviceObjectFixture, null, new Object[]{SQL, 
true}, "OpenTelemetry");
         advice.afterMethod(adviceObjectFixture, null, new Object[]{SQL, true}, 
null, "OpenTelemetry");
         List<SpanData> spanItems = testExporter.getFinishedSpanItems();
-        assertCommonData(spanItems);
+        assertCommonData(spanItems, parentSpan.getSpanContext().getSpanId());
+        assertThat(spanItems.iterator().next().getStatus().getStatusCode(), 
is(StatusCode.OK));
+    }
+    
+    @Test
+    void assertMethodWithoutParentSpan() {
+        RootSpanContext.set(null);
+        TargetAdviceObjectFixture adviceObjectFixture = new 
TargetAdviceObjectFixture();
+        OpenTelemetrySQLParserEngineAdvice advice = new 
OpenTelemetrySQLParserEngineAdvice();
+        advice.beforeMethod(adviceObjectFixture, null, new Object[]{SQL, 
true}, "OpenTelemetry");
+        advice.afterMethod(adviceObjectFixture, null, new Object[]{SQL, true}, 
null, "OpenTelemetry");
+        List<SpanData> spanItems = testExporter.getFinishedSpanItems();
+        assertCommonData(spanItems, SpanId.getInvalid());
         assertThat(spanItems.iterator().next().getStatus().getStatusCode(), 
is(StatusCode.OK));
     }
     
@@ -82,15 +95,15 @@ class OpenTelemetrySQLParserEngineAdviceTest {
         advice.beforeMethod(adviceObjectFixture, null, new Object[]{SQL, 
true}, "OpenTelemetry");
         advice.onThrowing(adviceObjectFixture, null, new Object[]{SQL, true}, 
new IOException(""), "OpenTelemetry");
         List<SpanData> spanItems = testExporter.getFinishedSpanItems();
-        assertCommonData(spanItems);
+        assertCommonData(spanItems, parentSpan.getSpanContext().getSpanId());
         assertThat(spanItems.iterator().next().getStatus().getStatusCode(), 
is(StatusCode.ERROR));
     }
     
-    private void assertCommonData(final List<SpanData> spanItems) {
+    private void assertCommonData(final List<SpanData> spanItems, final String 
expectedParentSpanId) {
         assertThat(spanItems.size(), is(1));
         SpanData spanData = spanItems.iterator().next();
         assertThat(spanData.getName(), is("/ShardingSphere/parseSQL/"));
-        assertThat(spanData.getParentSpanId(), 
is(parentSpan.getSpanContext().getSpanId()));
+        assertThat(spanData.getParentSpanId(), is(expectedParentSpanId));
         Attributes attributes = spanItems.iterator().next().getAttributes();
         
assertThat(attributes.get(AttributeKey.stringKey(AttributeConstants.COMPONENT)),
 is(AttributeConstants.COMPONENT_NAME));
         
assertThat(attributes.get(AttributeKey.stringKey(AttributeConstants.DB_STATEMENT)),
 is(SQL));

Reply via email to