Skip to content

Commit 61c99cf

Browse files
heyamstrask
andauthored
Implement some of the stable database semantic conventions (#11575)
Co-authored-by: Trask Stalnaker <[email protected]>
1 parent 0521ac1 commit 61c99cf

File tree

69 files changed

+982
-315
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+982
-315
lines changed

instrumentation-api-incubator/build.gradle.kts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,17 @@ tasks {
4040
sourcesJar {
4141
dependsOn("generateJflex")
4242
}
43+
44+
val testStableSemconv by registering(Test::class) {
45+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
46+
}
47+
48+
val testBothSemconv by registering(Test::class) {
49+
jvmArgs("-Dotel.semconv-stability.opt-in=database/dup")
50+
}
51+
52+
check {
53+
dependsOn(testStableSemconv)
54+
dependsOn(testBothSemconv)
55+
}
4356
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.api.common.AttributesBuilder;
1212
import io.opentelemetry.context.Context;
1313
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
14+
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
1415

1516
/**
1617
* Extractor of <a
@@ -26,7 +27,11 @@ public final class DbClientAttributesExtractor<REQUEST, RESPONSE>
2627

2728
// copied from DbIncubatingAttributes
2829
private static final AttributeKey<String> DB_STATEMENT = AttributeKey.stringKey("db.statement");
30+
private static final AttributeKey<String> DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text");
31+
2932
private static final AttributeKey<String> DB_OPERATION = AttributeKey.stringKey("db.operation");
33+
private static final AttributeKey<String> DB_OPERATION_NAME =
34+
AttributeKey.stringKey("db.operation.name");
3035

3136
/** Creates the database client attributes extractor with default configuration. */
3237
public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
@@ -42,7 +47,13 @@ public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
4247
public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) {
4348
super.onStart(attributes, parentContext, request);
4449

45-
internalSet(attributes, DB_STATEMENT, getter.getStatement(request));
46-
internalSet(attributes, DB_OPERATION, getter.getOperation(request));
50+
if (SemconvStability.emitStableDatabaseSemconv()) {
51+
internalSet(attributes, DB_QUERY_TEXT, getter.getDbQueryText(request));
52+
internalSet(attributes, DB_OPERATION_NAME, getter.getDbOperationName(request));
53+
}
54+
if (SemconvStability.emitOldDatabaseSemconv()) {
55+
internalSet(attributes, DB_STATEMENT, getter.getDbQueryText(request));
56+
internalSet(attributes, DB_OPERATION, getter.getDbOperationName(request));
57+
}
4758
}
4859
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesGetter.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,33 @@
2020
*/
2121
public interface DbClientAttributesGetter<REQUEST> extends DbClientCommonAttributesGetter<REQUEST> {
2222

23+
/**
24+
* @deprecated Use {@link #getDbQueryText(REQUEST)} instead.
25+
*/
26+
@Deprecated
2327
@Nullable
24-
String getStatement(REQUEST request);
28+
default String getStatement(REQUEST request) {
29+
return null;
30+
}
2531

32+
// TODO: make this required to implement
2633
@Nullable
27-
String getOperation(REQUEST request);
34+
default String getDbQueryText(REQUEST request) {
35+
return getStatement(request);
36+
}
37+
38+
/**
39+
* @deprecated Use {@link #getDbOperationName(REQUEST)} instead.
40+
*/
41+
@Deprecated
42+
@Nullable
43+
default String getOperation(REQUEST request) {
44+
return null;
45+
}
46+
47+
// TODO: make this required to implement
48+
@Nullable
49+
default String getDbOperationName(REQUEST request) {
50+
return getOperation(request);
51+
}
2852
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.api.common.AttributesBuilder;
1212
import io.opentelemetry.context.Context;
1313
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
14+
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
1415
import io.opentelemetry.instrumentation.api.internal.SpanKey;
1516
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
1617
import javax.annotation.Nullable;
@@ -21,6 +22,7 @@ abstract class DbClientCommonAttributesExtractor<
2122

2223
// copied from DbIncubatingAttributes
2324
private static final AttributeKey<String> DB_NAME = AttributeKey.stringKey("db.name");
25+
private static final AttributeKey<String> DB_NAMESPACE = AttributeKey.stringKey("db.namespace");
2426
private static final AttributeKey<String> DB_SYSTEM = AttributeKey.stringKey("db.system");
2527
private static final AttributeKey<String> DB_USER = AttributeKey.stringKey("db.user");
2628
private static final AttributeKey<String> DB_CONNECTION_STRING =
@@ -32,12 +34,18 @@ abstract class DbClientCommonAttributesExtractor<
3234
this.getter = getter;
3335
}
3436

37+
@SuppressWarnings("deprecation") // until old db semconv are dropped
3538
@Override
3639
public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) {
37-
internalSet(attributes, DB_SYSTEM, getter.getSystem(request));
38-
internalSet(attributes, DB_USER, getter.getUser(request));
39-
internalSet(attributes, DB_NAME, getter.getName(request));
40-
internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request));
40+
internalSet(attributes, DB_SYSTEM, getter.getDbSystem(request));
41+
if (SemconvStability.emitStableDatabaseSemconv()) {
42+
internalSet(attributes, DB_NAMESPACE, getter.getDbNamespace(request));
43+
}
44+
if (SemconvStability.emitOldDatabaseSemconv()) {
45+
internalSet(attributes, DB_USER, getter.getUser(request));
46+
internalSet(attributes, DB_NAME, getter.getDbNamespace(request));
47+
internalSet(attributes, DB_CONNECTION_STRING, getter.getConnectionString(request));
48+
}
4149
}
4250

4351
@Override

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesGetter.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,38 @@
1010
/** An interface for getting attributes common to database clients. */
1111
public interface DbClientCommonAttributesGetter<REQUEST> {
1212

13+
@Deprecated
1314
@Nullable
14-
String getSystem(REQUEST request);
15+
default String getSystem(REQUEST request) {
16+
return null;
17+
}
1518

19+
// TODO: make this required to implement
20+
@Nullable
21+
default String getDbSystem(REQUEST request) {
22+
return getSystem(request);
23+
}
24+
25+
@Deprecated
1626
@Nullable
1727
String getUser(REQUEST request);
1828

29+
/**
30+
* @deprecated Use {@link #getDbNamespace(Object)} instead.
31+
*/
32+
@Deprecated
33+
@Nullable
34+
default String getName(REQUEST request) {
35+
return null;
36+
}
37+
38+
// TODO: make this required to implement
1939
@Nullable
20-
String getName(REQUEST request);
40+
default String getDbNamespace(REQUEST request) {
41+
return getName(request);
42+
}
2143

44+
@Deprecated
2245
@Nullable
2346
String getConnectionString(REQUEST request);
2447
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientSpanNameExtractor.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ public abstract class DbClientSpanNameExtractor<REQUEST> implements SpanNameExtr
1313
* Returns a {@link SpanNameExtractor} that constructs the span name according to DB semantic
1414
* conventions: {@code <db.operation> <db.name>}.
1515
*
16-
* @see DbClientAttributesGetter#getOperation(Object) used to extract {@code <db.operation>}.
17-
* @see DbClientAttributesGetter#getName(Object) used to extract {@code <db.name>}.
16+
* @see DbClientAttributesGetter#getDbOperationName(Object) used to extract {@code
17+
* <db.operation.name>}.
18+
* @see DbClientAttributesGetter#getDbNamespace(Object) used to extract {@code <db.namespace>}.
1819
*/
1920
public static <REQUEST> SpanNameExtractor<REQUEST> create(
2021
DbClientAttributesGetter<REQUEST> getter) {
@@ -26,7 +27,7 @@ public static <REQUEST> SpanNameExtractor<REQUEST> create(
2627
* conventions: {@code <db.operation> <db.name>.<identifier>}.
2728
*
2829
* @see SqlStatementInfo#getOperation() used to extract {@code <db.operation>}.
29-
* @see DbClientAttributesGetter#getName(Object) used to extract {@code <db.name>}.
30+
* @see DbClientAttributesGetter#getDbNamespace(Object) used to extract {@code <db.namespace>}.
3031
* @see SqlStatementInfo#getMainIdentifier() used to extract {@code <db.table>} or stored
3132
* procedure name.
3233
*/
@@ -72,9 +73,9 @@ private GenericDbClientSpanNameExtractor(DbClientAttributesGetter<REQUEST> gette
7273

7374
@Override
7475
public String extract(REQUEST request) {
75-
String dbName = getter.getName(request);
76-
String operation = getter.getOperation(request);
77-
return computeSpanName(dbName, operation, null);
76+
String namespace = getter.getDbNamespace(request);
77+
String operationName = getter.getDbOperationName(request);
78+
return computeSpanName(namespace, operationName, null);
7879
}
7980
}
8081

@@ -92,10 +93,10 @@ private SqlClientSpanNameExtractor(SqlClientAttributesGetter<REQUEST> getter) {
9293

9394
@Override
9495
public String extract(REQUEST request) {
95-
String dbName = getter.getName(request);
96-
SqlStatementInfo sanitizedStatement = sanitizer.sanitize(getter.getRawStatement(request));
96+
String namespace = getter.getDbNamespace(request);
97+
SqlStatementInfo sanitizedStatement = sanitizer.sanitize(getter.getRawQueryText(request));
9798
return computeSpanName(
98-
dbName, sanitizedStatement.getOperation(), sanitizedStatement.getMainIdentifier());
99+
namespace, sanitizedStatement.getOperation(), sanitizedStatement.getMainIdentifier());
99100
}
100101
}
101102
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.api.common.AttributesBuilder;
1212
import io.opentelemetry.context.Context;
1313
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
14+
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
1415

1516
/**
1617
* Extractor of <a
@@ -19,7 +20,7 @@
1920
*
2021
* <p>It sets the same set of attributes as {@link DbClientAttributesExtractor} plus an additional
2122
* <code>db.sql.table</code> attribute. The raw SQL statements returned by the {@link
22-
* SqlClientAttributesGetter#getRawStatement(Object)} method are sanitized before use, all statement
23+
* SqlClientAttributesGetter#getRawQueryText(Object)} method are sanitized before use, all statement
2324
* parameters are removed.
2425
*/
2526
public final class SqlClientAttributesExtractor<REQUEST, RESPONSE>
@@ -28,7 +29,12 @@ public final class SqlClientAttributesExtractor<REQUEST, RESPONSE>
2829

2930
// copied from DbIncubatingAttributes
3031
private static final AttributeKey<String> DB_OPERATION = AttributeKey.stringKey("db.operation");
32+
private static final AttributeKey<String> DB_OPERATION_NAME =
33+
AttributeKey.stringKey("db.operation.name");
3134
private static final AttributeKey<String> DB_STATEMENT = AttributeKey.stringKey("db.statement");
35+
private static final AttributeKey<String> DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text");
36+
private static final AttributeKey<String> DB_COLLECTION_NAME =
37+
AttributeKey.stringKey("db.collection.name");
3238

3339
/** Creates the SQL client attributes extractor with default configuration. */
3440
public static <REQUEST, RESPONSE> AttributesExtractor<REQUEST, RESPONSE> create(
@@ -49,32 +55,46 @@ public static <REQUEST, RESPONSE> SqlClientAttributesExtractorBuilder<REQUEST, R
4955
// sanitizer is also used to extract operation and table name, so we have it always enable here
5056
private static final SqlStatementSanitizer sanitizer = SqlStatementSanitizer.create(true);
5157

52-
private final AttributeKey<String> dbTableAttribute;
58+
private final AttributeKey<String> oldSemconvTableAttribute;
5359
private final boolean statementSanitizationEnabled;
5460

5561
SqlClientAttributesExtractor(
5662
SqlClientAttributesGetter<REQUEST> getter,
57-
AttributeKey<String> dbTableAttribute,
63+
AttributeKey<String> oldSemconvTableAttribute,
5864
boolean statementSanitizationEnabled) {
5965
super(getter);
60-
this.dbTableAttribute = dbTableAttribute;
66+
this.oldSemconvTableAttribute = oldSemconvTableAttribute;
6167
this.statementSanitizationEnabled = statementSanitizationEnabled;
6268
}
6369

6470
@Override
6571
public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) {
6672
super.onStart(attributes, parentContext, request);
6773

68-
String rawStatement = getter.getRawStatement(request);
69-
SqlStatementInfo sanitizedStatement = sanitizer.sanitize(rawStatement);
74+
String rawQueryText = getter.getRawQueryText(request);
75+
SqlStatementInfo sanitizedStatement = sanitizer.sanitize(rawQueryText);
7076
String operation = sanitizedStatement.getOperation();
71-
internalSet(
72-
attributes,
73-
DB_STATEMENT,
74-
statementSanitizationEnabled ? sanitizedStatement.getFullStatement() : rawStatement);
75-
internalSet(attributes, DB_OPERATION, operation);
77+
if (SemconvStability.emitStableDatabaseSemconv()) {
78+
internalSet(
79+
attributes,
80+
DB_QUERY_TEXT,
81+
statementSanitizationEnabled ? sanitizedStatement.getFullStatement() : rawQueryText);
82+
internalSet(attributes, DB_OPERATION_NAME, operation);
83+
}
84+
if (SemconvStability.emitOldDatabaseSemconv()) {
85+
internalSet(
86+
attributes,
87+
DB_STATEMENT,
88+
statementSanitizationEnabled ? sanitizedStatement.getFullStatement() : rawQueryText);
89+
internalSet(attributes, DB_OPERATION, operation);
90+
}
7691
if (!SQL_CALL.equals(operation)) {
77-
internalSet(attributes, dbTableAttribute, sanitizedStatement.getMainIdentifier());
92+
if (SemconvStability.emitStableDatabaseSemconv()) {
93+
internalSet(attributes, DB_COLLECTION_NAME, sanitizedStatement.getMainIdentifier());
94+
}
95+
if (SemconvStability.emitOldDatabaseSemconv()) {
96+
internalSet(attributes, oldSemconvTableAttribute, sanitizedStatement.getMainIdentifier());
97+
}
7898
}
7999
}
80100
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorBuilder.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,21 @@ public final class SqlClientAttributesExtractorBuilder<REQUEST, RESPONSE> {
1818
private static final AttributeKey<String> DB_SQL_TABLE = AttributeKey.stringKey("db.sql.table");
1919

2020
final SqlClientAttributesGetter<REQUEST> getter;
21-
AttributeKey<String> dbTableAttribute = DB_SQL_TABLE;
21+
AttributeKey<String> oldSemconvTableAttribute = DB_SQL_TABLE;
2222
boolean statementSanitizationEnabled = true;
2323

2424
SqlClientAttributesExtractorBuilder(SqlClientAttributesGetter<REQUEST> getter) {
2525
this.getter = getter;
2626
}
2727

2828
/**
29-
* Configures the extractor to set the table value extracted by the {@link
30-
* SqlClientAttributesExtractor} under the {@code dbTableAttribute} key. By default, the <code>
31-
* db.sql.table</code> attribute is used.
32-
*
33-
* @param dbTableAttribute The {@link AttributeKey} under which the table extracted by the {@link
34-
* SqlClientAttributesExtractor} will be stored.
29+
* @deprecated not needed anymore since the new semantic conventions always use db.collection.name
3530
*/
3631
@CanIgnoreReturnValue
32+
@Deprecated
3733
public SqlClientAttributesExtractorBuilder<REQUEST, RESPONSE> setTableAttribute(
38-
AttributeKey<String> dbTableAttribute) {
39-
this.dbTableAttribute = requireNonNull(dbTableAttribute);
34+
AttributeKey<String> oldSemconvTableAttribute) {
35+
this.oldSemconvTableAttribute = requireNonNull(oldSemconvTableAttribute);
4036
return this;
4137
}
4238

@@ -58,6 +54,6 @@ public SqlClientAttributesExtractorBuilder<REQUEST, RESPONSE> setStatementSaniti
5854
*/
5955
public AttributesExtractor<REQUEST, RESPONSE> build() {
6056
return new SqlClientAttributesExtractor<>(
61-
getter, dbTableAttribute, statementSanitizationEnabled);
57+
getter, oldSemconvTableAttribute, statementSanitizationEnabled);
6258
}
6359
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesGetter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@ public interface SqlClientAttributesGetter<REQUEST>
2424
/**
2525
* Get the raw SQL statement. The value returned by this method is later sanitized by the {@link
2626
* SqlClientAttributesExtractor} before being set as span attribute.
27+
*
28+
* @deprecated Use {@link #getRawQueryText(Object)} instead.
2729
*/
30+
@Deprecated
2831
@Nullable
29-
String getRawStatement(REQUEST request);
32+
default String getRawStatement(REQUEST request) {
33+
return null;
34+
}
35+
36+
// TODO: make this required to implement
37+
@Nullable
38+
default String getRawQueryText(REQUEST request) {
39+
return getRawStatement(request);
40+
}
3041
}

0 commit comments

Comments
 (0)