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));