From 2d367bb9209ba4bd2aae15feacee5f3e22e180a3 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 24 Oct 2025 13:31:41 -0700 Subject: [PATCH 1/5] Remove DbClientCommonAttributesExtractor --- .../db/DbClientAttributesExtractor.java | 59 +++++++++++-- .../semconv/db/DbClientAttributesGetter.java | 1 + .../db/DbClientCommonAttributesExtractor.java | 83 ------------------- .../db/DbClientCommonAttributesGetter.java | 7 +- .../db/SqlClientAttributesExtractor.java | 61 +++++++++++++- .../semconv/db/SqlClientAttributesGetter.java | 32 ++++++- 6 files changed, 148 insertions(+), 95 deletions(-) delete mode 100644 instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java index eb089ab38308..e7d09c6515f7 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java @@ -6,15 +6,22 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.db; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_SUMMARY; import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; +import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import io.opentelemetry.instrumentation.api.internal.SpanKey; +import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; +import javax.annotation.Nullable; /** * Extractor of - extends DbClientCommonAttributesExtractor< - REQUEST, RESPONSE, DbClientAttributesGetter> { + implements AttributesExtractor, SpanKeyProvider { // copied from DbIncubatingAttributes + private static final AttributeKey DB_NAME = AttributeKey.stringKey("db.name"); + private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); + private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); + private static final AttributeKey DB_CONNECTION_STRING = + AttributeKey.stringKey("db.connection_string"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); - static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); + private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); + + private final DbClientAttributesGetter getter; /** Creates the database client attributes extractor with default configuration. */ public static AttributesExtractor create( @@ -39,21 +52,55 @@ public static AttributesExtractor create( } DbClientAttributesExtractor(DbClientAttributesGetter getter) { - super(getter); + this.getter = getter; } + @SuppressWarnings("deprecation") // until old db semconv are dropped @Override public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { - super.onStart(attributes, parentContext, request); - if (SemconvStability.emitStableDatabaseSemconv()) { + internalSet( + attributes, + DB_SYSTEM_NAME, + SemconvStability.stableDbSystemName(getter.getDbSystem(request))); + internalSet(attributes, DB_NAMESPACE, getter.getDbNamespace(request)); internalSet(attributes, DB_QUERY_TEXT, getter.getDbQueryText(request)); internalSet(attributes, DB_OPERATION_NAME, getter.getDbOperationName(request)); internalSet(attributes, DB_QUERY_SUMMARY, getter.getDbQuerySummary(request)); } if (SemconvStability.emitOldDatabaseSemconv()) { + internalSet(attributes, DB_SYSTEM, getter.getDbSystem(request)); + internalSet(attributes, DB_USER, getter.getUser(request)); + internalSet(attributes, DB_NAME, getter.getDbNamespace(request)); + internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request)); internalSet(attributes, DB_STATEMENT, getter.getDbQueryText(request)); internalSet(attributes, DB_OPERATION, getter.getDbOperationName(request)); } } + + @Override + public void onEnd( + AttributesBuilder attributes, + Context context, + REQUEST request, + @Nullable RESPONSE response, + @Nullable Throwable error) { + if (SemconvStability.emitStableDatabaseSemconv()) { + if (error != null) { + internalSet(attributes, ERROR_TYPE, error.getClass().getName()); + } + if (error != null || response != null) { + internalSet(attributes, DB_RESPONSE_STATUS_CODE, getter.getResponseStatus(response, error)); + } + } + } + + /** + * This method is internal and is hence not for public use. Its API is unstable and can change at + * any time. + */ + @Override + public SpanKey internalGetSpanKey() { + return SpanKey.DB_CLIENT; + } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java index d3b0b9df6849..06a724d136a1 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java @@ -18,6 +18,7 @@ * from the attribute methods, but implement as many as possible for best compliance with the * OpenTelemetry specification. */ +@SuppressWarnings("deprecation") // extending deprecated interface for backward compatibility public interface DbClientAttributesGetter extends DbClientCommonAttributesGetter { diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java deleted file mode 100644 index ac7e6eb01317..000000000000 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.api.incubator.semconv.db; - -import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; -import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; -import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; -import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; -import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; - -import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.instrumentation.api.internal.SemconvStability; -import io.opentelemetry.instrumentation.api.internal.SpanKey; -import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; -import javax.annotation.Nullable; - -abstract class DbClientCommonAttributesExtractor< - REQUEST, RESPONSE, GETTER extends DbClientCommonAttributesGetter> - implements AttributesExtractor, SpanKeyProvider { - - // copied from DbIncubatingAttributes - private static final AttributeKey DB_NAME = AttributeKey.stringKey("db.name"); - static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); - private static final AttributeKey DB_CONNECTION_STRING = - AttributeKey.stringKey("db.connection_string"); - - final GETTER getter; - - DbClientCommonAttributesExtractor(GETTER getter) { - this.getter = getter; - } - - @SuppressWarnings("deprecation") // until old db semconv are dropped - @Override - public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { - if (SemconvStability.emitStableDatabaseSemconv()) { - internalSet( - attributes, - DB_SYSTEM_NAME, - SemconvStability.stableDbSystemName(getter.getDbSystem(request))); - internalSet(attributes, DB_NAMESPACE, getter.getDbNamespace(request)); - } - if (SemconvStability.emitOldDatabaseSemconv()) { - internalSet(attributes, DB_SYSTEM, getter.getDbSystem(request)); - internalSet(attributes, DB_USER, getter.getUser(request)); - internalSet(attributes, DB_NAME, getter.getDbNamespace(request)); - internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request)); - } - } - - @Override - public final void onEnd( - AttributesBuilder attributes, - Context context, - REQUEST request, - @Nullable RESPONSE response, - @Nullable Throwable error) { - if (SemconvStability.emitStableDatabaseSemconv()) { - if (error != null) { - internalSet(attributes, ERROR_TYPE, error.getClass().getName()); - } - if (error != null || response != null) { - internalSet(attributes, DB_RESPONSE_STATUS_CODE, getter.getResponseStatus(response, error)); - } - } - } - - /** - * This method is internal and is hence not for public use. Its API is unstable and can change at - * any time. - */ - @Override - public SpanKey internalGetSpanKey() { - return SpanKey.DB_CLIENT; - } -} diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java index bda95d5c69a7..3e89f70c0a33 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java @@ -7,7 +7,12 @@ import javax.annotation.Nullable; -/** An interface for getting attributes common to database clients. */ +/** + * An interface for getting attributes common to database clients. + * + * @deprecated Use {@link DbClientAttributesGetter} instead. + */ +@Deprecated public interface DbClientCommonAttributesGetter { String getDbSystem(REQUEST request); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java index b30a61505176..52e3aae74b6b 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java @@ -7,18 +7,25 @@ import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; +import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; +import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import io.opentelemetry.instrumentation.api.internal.SpanKey; +import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; import io.opentelemetry.semconv.AttributeKeyTemplate; import java.util.Collection; import java.util.Map; +import javax.annotation.Nullable; /** * Extractor of - extends DbClientCommonAttributesExtractor< - REQUEST, RESPONSE, SqlClientAttributesGetter> { + implements AttributesExtractor, SpanKeyProvider { // copied from DbIncubatingAttributes + private static final AttributeKey DB_NAME = AttributeKey.stringKey("db.name"); + private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); + private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); + private static final AttributeKey DB_CONNECTION_STRING = + AttributeKey.stringKey("db.connection_string"); private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); private static final AttributeKeyTemplate DB_QUERY_PARAMETER = @@ -57,6 +68,7 @@ public static SqlClientAttributesExtractorBuilder getter; private final AttributeKey oldSemconvTableAttribute; private final boolean statementSanitizationEnabled; private final boolean captureQueryParameters; @@ -66,17 +78,32 @@ public static SqlClientAttributesExtractorBuilder oldSemconvTableAttribute, boolean statementSanitizationEnabled, boolean captureQueryParameters) { - super(getter); + this.getter = getter; this.oldSemconvTableAttribute = oldSemconvTableAttribute; // capturing query parameters disables statement sanitization this.statementSanitizationEnabled = !captureQueryParameters && statementSanitizationEnabled; this.captureQueryParameters = captureQueryParameters; } + @SuppressWarnings("deprecation") // until old db semconv are dropped @Override public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { - super.onStart(attributes, parentContext, request); + // Common attributes + if (SemconvStability.emitStableDatabaseSemconv()) { + internalSet( + attributes, + DB_SYSTEM_NAME, + SemconvStability.stableDbSystemName(getter.getDbSystem(request))); + internalSet(attributes, DB_NAMESPACE, getter.getDbNamespace(request)); + } + if (SemconvStability.emitOldDatabaseSemconv()) { + internalSet(attributes, DB_SYSTEM, getter.getDbSystem(request)); + internalSet(attributes, DB_USER, getter.getUser(request)); + internalSet(attributes, DB_NAME, getter.getDbNamespace(request)); + internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request)); + } + // SQL-specific attributes Collection rawQueryTexts = getter.getRawQueryTexts(request); if (rawQueryTexts.isEmpty()) { @@ -160,4 +187,30 @@ private static String join(String delimiter, Collection collection) { } return builder.toString(); } + + @Override + public void onEnd( + AttributesBuilder attributes, + Context context, + REQUEST request, + @Nullable RESPONSE response, + @Nullable Throwable error) { + if (SemconvStability.emitStableDatabaseSemconv()) { + if (error != null) { + internalSet(attributes, ERROR_TYPE, error.getClass().getName()); + } + if (error != null || response != null) { + internalSet(attributes, DB_RESPONSE_STATUS_CODE, getter.getResponseStatus(response, error)); + } + } + } + + /** + * This method is internal and is hence not for public use. Its API is unstable and can change at + * any time. + */ + @Override + public SpanKey internalGetSpanKey() { + return SpanKey.DB_CLIENT; + } } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java index d4760065b858..69f688776971 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java @@ -22,7 +22,37 @@ * OpenTelemetry specification. */ public interface SqlClientAttributesGetter - extends DbClientCommonAttributesGetter { + extends DbClientAttributesGetter { + + /** + * SqlClientAttributesExtractor will try to populate db.operation.name based on {@link + * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the operation name. + */ + @Override + @Nullable + default String getDbOperationName(REQUEST request) { + return null; + } + + /** + * SqlClientAttributesExtractor will try to populate db.operation.name based on {@link + * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the operation name. + */ + @Override + @Nullable + default String getDbQueryText(REQUEST request) { + return null; + } + + /** + * SqlClientAttributesExtractor will try to populate db.operation.name based on {@link + * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the operation name. + */ + @Override + @Nullable + default String getDbQuerySummary(REQUEST request) { + return null; + } /** * Get the raw SQL query texts. The values returned by this method is later sanitized by the From a228abbedb1a4ba4ca48d06c43efc2b971e35f19 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 6 Nov 2025 12:18:27 -0800 Subject: [PATCH 2/5] Fix copy paste --- .../semconv/db/SqlClientAttributesGetter.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java index 69f688776971..d6f317bc1877 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java @@ -35,8 +35,8 @@ default String getDbOperationName(REQUEST request) { } /** - * SqlClientAttributesExtractor will try to populate db.operation.name based on {@link - * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the operation name. + * SqlClientAttributesExtractor will try to populate db.query.text based on {@link + * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the query text. */ @Override @Nullable @@ -45,8 +45,8 @@ default String getDbQueryText(REQUEST request) { } /** - * SqlClientAttributesExtractor will try to populate db.operation.name based on {@link - * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the operation name. + * SqlClientAttributesExtractor will try to populate db.query.summary based on {@link + * #getRawQueryTexts(REQUEST)}, but this can be used to explicitly provide the query summary. */ @Override @Nullable @@ -55,7 +55,7 @@ default String getDbQuerySummary(REQUEST request) { } /** - * Get the raw SQL query texts. The values returned by this method is later sanitized by the + * Get the raw SQL query texts. The values returned by this method are later sanitized by the * {@link SqlClientAttributesExtractor} before being set as span attribute. * *

If {@code request} is not a batch query, then this method should return a collection with a From b3f6bc0f8d24ff228e1fda80ee2fd39b3810edfa Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 6 Nov 2025 12:20:41 -0800 Subject: [PATCH 3/5] Extract onEndCommon --- .../semconv/db/DbClientAttributesExtractor.java | 8 ++++++++ .../semconv/db/SqlClientAttributesExtractor.java | 9 +-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java index e7d09c6515f7..a9eb0a13c13c 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java @@ -85,6 +85,14 @@ public void onEnd( REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error) { + onEndCommon(attributes, getter, response, error); + } + + static void onEndCommon( + AttributesBuilder attributes, + DbClientAttributesGetter getter, + @Nullable RESPONSE response, + @Nullable Throwable error) { if (SemconvStability.emitStableDatabaseSemconv()) { if (error != null) { internalSet(attributes, ERROR_TYPE, error.getClass().getName()); diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java index 52e3aae74b6b..045f96e2bd71 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java @@ -195,14 +195,7 @@ public void onEnd( REQUEST request, @Nullable RESPONSE response, @Nullable Throwable error) { - if (SemconvStability.emitStableDatabaseSemconv()) { - if (error != null) { - internalSet(attributes, ERROR_TYPE, error.getClass().getName()); - } - if (error != null || response != null) { - internalSet(attributes, DB_RESPONSE_STATUS_CODE, getter.getResponseStatus(response, error)); - } - } + DbClientAttributesExtractor.onEndCommon(attributes, getter, response, error); } /** From 3b3feaa947b98c43cc01c591bc7ffc07e6748a01 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 6 Nov 2025 12:34:47 -0800 Subject: [PATCH 4/5] Extract onStartCommon --- .../db/DbClientAttributesExtractor.java | 8 ++++++ .../db/SqlClientAttributesExtractor.java | 27 +++++-------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java index a9eb0a13c13c..7551408e5ea8 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java @@ -58,6 +58,14 @@ public static AttributesExtractor create( @SuppressWarnings("deprecation") // until old db semconv are dropped @Override public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) { + onStartCommon(attributes, getter, request); + } + + @SuppressWarnings("deprecation") // until old db semconv are dropped + static void onStartCommon( + AttributesBuilder attributes, + DbClientAttributesGetter getter, + REQUEST request) { if (SemconvStability.emitStableDatabaseSemconv()) { internalSet( attributes, diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java index 045f96e2bd71..5a4231dd226c 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java @@ -88,28 +88,8 @@ public static SqlClientAttributesExtractorBuilder rawQueryTexts = getter.getRawQueryTexts(request); - if (rawQueryTexts.isEmpty()) { - return; - } - Long batchSize = getter.getBatchSize(request); boolean isBatch = batchSize != null && batchSize > 1; @@ -145,7 +125,7 @@ public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST if (!SQL_CALL.equals(operation)) { internalSet(attributes, DB_COLLECTION_NAME, sanitizedStatement.getMainIdentifier()); } - } else { + } else if (rawQueryTexts.size() > 1) { MultiQuery multiQuery = MultiQuery.analyze(getter.getRawQueryTexts(request), statementSanitizationEnabled); internalSet(attributes, DB_QUERY_TEXT, join("; ", multiQuery.getStatements())); @@ -163,6 +143,11 @@ public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST Map queryParameters = getter.getQueryParameters(request); setQueryParameters(attributes, isBatch, queryParameters); + + // calling this last so explicit getDbOperationName(), getDbCollectionName(), + // getDbQueryText(), and getDbQuerySummary() implementations can override + // the parsed values from above + DbClientAttributesExtractor.onStartCommon(attributes, getter, request); } private void setQueryParameters( From 109fd7a0c2ea53f6cb08531f1b239d247497736e Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 6 Nov 2025 12:42:18 -0800 Subject: [PATCH 5/5] spotless --- .../semconv/db/SqlClientAttributesExtractor.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java index 5a4231dd226c..e5afadcdd9ae 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java @@ -7,13 +7,9 @@ import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; -import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; -import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; -import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; -import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; @@ -41,11 +37,6 @@ public final class SqlClientAttributesExtractor implements AttributesExtractor, SpanKeyProvider { // copied from DbIncubatingAttributes - private static final AttributeKey DB_NAME = AttributeKey.stringKey("db.name"); - private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); - private static final AttributeKey DB_CONNECTION_STRING = - AttributeKey.stringKey("db.connection_string"); private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); private static final AttributeKeyTemplate DB_QUERY_PARAMETER =