You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/01/09 04:30:13 UTC
(shardingsphere) branch master updated: Add nullability checks to the Agent's OpenTelemetry plugin (#37659)
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 <li...@outlook.com>
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));