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