Skip to content

Commit fcbda86

Browse files
committed
Add DB exception event extractor helper
1 parent b2035d0 commit fcbda86

26 files changed

Lines changed: 309 additions & 188 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.semconv.db.internal;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.logs.Severity;
10+
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
11+
import io.opentelemetry.instrumentation.api.internal.Experimental;
12+
13+
/**
14+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
15+
* any time.
16+
*/
17+
public final class DbExceptionEventExtractors {
18+
19+
/**
20+
* Configures the database client exception event name and severity. Only takes effect when
21+
* emitting exceptions as logs is enabled via the {@code otel.semconv.exception.signal.preview}
22+
* flag.
23+
*/
24+
@CanIgnoreReturnValue
25+
public static <REQUEST, RESPONSE>
26+
InstrumenterBuilder<REQUEST, RESPONSE> setDbClientExceptionEventExtractor(
27+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
28+
Experimental.setExceptionEventExtractor(
29+
builder,
30+
(logRecordBuilder, context, request) -> {
31+
logRecordBuilder.setEventName("db.client.operation.exception");
32+
logRecordBuilder.setSeverity(Severity.WARN);
33+
});
34+
return builder;
35+
}
36+
37+
private DbExceptionEventExtractors() {}
38+
}

instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.javaagent.instrumentation.cassandra.v3_0;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
89
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE;
910

1011
import com.datastax.driver.core.ExecutionInfo;
@@ -28,18 +29,20 @@ class CassandraSingletons {
2829
CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter();
2930

3031
instrumenter =
31-
Instrumenter.<CassandraRequest, ExecutionInfo>builder(
32-
GlobalOpenTelemetry.get(),
33-
INSTRUMENTATION_NAME,
34-
DbClientSpanNameExtractor.create(attributesGetter))
35-
.addAttributesExtractor(
36-
SqlClientAttributesExtractor.builder(attributesGetter)
37-
.setTableAttribute(DB_CASSANDRA_TABLE)
38-
.setQuerySanitizationEnabled(
39-
DbConfig.isQuerySanitizationEnabled(GlobalOpenTelemetry.get(), "cassandra"))
40-
.build())
41-
.addAttributesExtractor(new CassandraAttributesExtractor())
42-
.addOperationMetrics(DbClientMetrics.get())
32+
setDbClientExceptionEventExtractor(
33+
Instrumenter.<CassandraRequest, ExecutionInfo>builder(
34+
GlobalOpenTelemetry.get(),
35+
INSTRUMENTATION_NAME,
36+
DbClientSpanNameExtractor.create(attributesGetter))
37+
.addAttributesExtractor(
38+
SqlClientAttributesExtractor.builder(attributesGetter)
39+
.setTableAttribute(DB_CASSANDRA_TABLE)
40+
.setQuerySanitizationEnabled(
41+
DbConfig.isQuerySanitizationEnabled(
42+
GlobalOpenTelemetry.get(), "cassandra"))
43+
.build())
44+
.addAttributesExtractor(new CassandraAttributesExtractor())
45+
.addOperationMetrics(DbClientMetrics.get()))
4346
.buildInstrumenter(SpanKindExtractor.alwaysClient());
4447
}
4548

instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
89
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CASSANDRA_TABLE;
910

1011
import com.datastax.oss.driver.api.core.cql.ExecutionInfo;
@@ -27,18 +28,20 @@ class CassandraSingletons {
2728
CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter();
2829

2930
instrumenter =
30-
Instrumenter.<CassandraRequest, ExecutionInfo>builder(
31-
GlobalOpenTelemetry.get(),
32-
INSTRUMENTATION_NAME,
33-
DbClientSpanNameExtractor.create(attributesGetter))
34-
.addAttributesExtractor(
35-
SqlClientAttributesExtractor.builder(attributesGetter)
36-
.setTableAttribute(DB_CASSANDRA_TABLE)
37-
.setQuerySanitizationEnabled(
38-
DbConfig.isQuerySanitizationEnabled(GlobalOpenTelemetry.get(), "cassandra"))
39-
.build())
40-
.addAttributesExtractor(new CassandraAttributesExtractor())
41-
.addOperationMetrics(DbClientMetrics.get())
31+
setDbClientExceptionEventExtractor(
32+
Instrumenter.<CassandraRequest, ExecutionInfo>builder(
33+
GlobalOpenTelemetry.get(),
34+
INSTRUMENTATION_NAME,
35+
DbClientSpanNameExtractor.create(attributesGetter))
36+
.addAttributesExtractor(
37+
SqlClientAttributesExtractor.builder(attributesGetter)
38+
.setTableAttribute(DB_CASSANDRA_TABLE)
39+
.setQuerySanitizationEnabled(
40+
DbConfig.isQuerySanitizationEnabled(
41+
GlobalOpenTelemetry.get(), "cassandra"))
42+
.build())
43+
.addAttributesExtractor(new CassandraAttributesExtractor())
44+
.addOperationMetrics(DbClientMetrics.get()))
4245
.buildInstrumenter(SpanKindExtractor.alwaysClient());
4346
}
4447

instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.instrumentation.cassandra.v4_4;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import com.datastax.oss.driver.api.core.cql.ExecutionInfo;
911
import com.google.errorprone.annotations.CanIgnoreReturnValue;
1012
import io.opentelemetry.api.OpenTelemetry;
@@ -56,15 +58,18 @@ private static Instrumenter<CassandraRequest, ExecutionInfo> createInstrumenter(
5658
OpenTelemetry openTelemetry, boolean querySanitizationEnabled) {
5759
CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter();
5860

59-
return Instrumenter.<CassandraRequest, ExecutionInfo>builder(
60-
openTelemetry, INSTRUMENTATION_NAME, DbClientSpanNameExtractor.create(attributesGetter))
61-
.addAttributesExtractor(
62-
SqlClientAttributesExtractor.builder(attributesGetter)
63-
.setTableAttribute(DB_CASSANDRA_TABLE)
64-
.setQuerySanitizationEnabled(querySanitizationEnabled)
65-
.build())
66-
.addAttributesExtractor(new CassandraAttributesExtractor())
67-
.addOperationMetrics(DbClientMetrics.get())
61+
return setDbClientExceptionEventExtractor(
62+
Instrumenter.<CassandraRequest, ExecutionInfo>builder(
63+
openTelemetry,
64+
INSTRUMENTATION_NAME,
65+
DbClientSpanNameExtractor.create(attributesGetter))
66+
.addAttributesExtractor(
67+
SqlClientAttributesExtractor.builder(attributesGetter)
68+
.setTableAttribute(DB_CASSANDRA_TABLE)
69+
.setQuerySanitizationEnabled(querySanitizationEnabled)
70+
.build())
71+
.addAttributesExtractor(new CassandraAttributesExtractor())
72+
.addOperationMetrics(DbClientMetrics.get()))
6873
.buildInstrumenter(SpanKindExtractor.alwaysClient());
6974
}
7075
}

instrumentation/clickhouse/clickhouse-client-common-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/client/common/v0_5/ClickHouseInstrumenterFactory.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.clickhouse.client.common.v0_5;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.instrumentation.api.incubator.config.internal.DbConfig;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
@@ -22,17 +24,19 @@ public static Instrumenter<ClickHouseDbRequest, Void> createInstrumenter(
2224
ClickHouseAttributesGetter dbAttributesGetter =
2325
new ClickHouseAttributesGetter(errorCodeExtractor);
2426

25-
return Instrumenter.<ClickHouseDbRequest, Void>builder(
26-
GlobalOpenTelemetry.get(),
27-
instrumenterName,
28-
DbClientSpanNameExtractor.createWithGenericOldSpanName(dbAttributesGetter))
29-
.addAttributesExtractor(
30-
SqlClientAttributesExtractor.builder(dbAttributesGetter)
31-
.setTableAttribute(null)
32-
.setQuerySanitizationEnabled(
33-
DbConfig.isQuerySanitizationEnabled(GlobalOpenTelemetry.get(), "clickhouse"))
34-
.build())
35-
.addOperationMetrics(DbClientMetrics.get())
27+
return setDbClientExceptionEventExtractor(
28+
Instrumenter.<ClickHouseDbRequest, Void>builder(
29+
GlobalOpenTelemetry.get(),
30+
instrumenterName,
31+
DbClientSpanNameExtractor.createWithGenericOldSpanName(dbAttributesGetter))
32+
.addAttributesExtractor(
33+
SqlClientAttributesExtractor.builder(dbAttributesGetter)
34+
.setTableAttribute(null)
35+
.setQuerySanitizationEnabled(
36+
DbConfig.isQuerySanitizationEnabled(
37+
GlobalOpenTelemetry.get(), "clickhouse"))
38+
.build())
39+
.addOperationMetrics(DbClientMetrics.get()))
3640
.buildInstrumenter(SpanKindExtractor.alwaysClient());
3741
}
3842

instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor;
@@ -35,6 +37,7 @@ public class CouchbaseSingletons {
3537
(context, couchbaseRequest, startAttributes) ->
3638
CouchbaseRequestInfo.init(context, couchbaseRequest))
3739
.addOperationMetrics(DbClientMetrics.get());
40+
setDbClientExceptionEventExtractor(builder);
3841

3942
if (DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "couchbase")
4043
.getBoolean("experimental_span_attributes/development", false)) {

instrumentation/elasticsearch/elasticsearch-rest-common-5.0/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/common/v5_0/internal/ElasticsearchRestInstrumenterFactory.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.instrumentation.elasticsearch.rest.common.v5_0.internal;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import io.opentelemetry.api.OpenTelemetry;
911
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
@@ -41,12 +43,14 @@ public static Instrumenter<ElasticsearchRestRequest, Response> create(
4143
spanNameExtractorTransformer.apply(
4244
new ElasticsearchSpanNameExtractor(dbClientAttributesGetter));
4345

44-
return Instrumenter.<ElasticsearchRestRequest, Response>builder(
45-
openTelemetry, instrumentationName, spanNameExtractor)
46-
.addAttributesExtractor(DbClientAttributesExtractor.create(dbClientAttributesGetter))
47-
.addAttributesExtractor(esClientAttributesExtractor)
48-
.addAttributesExtractors(attributesExtractors)
49-
.addOperationMetrics(DbClientMetrics.get())
46+
return setDbClientExceptionEventExtractor(
47+
Instrumenter.<ElasticsearchRestRequest, Response>builder(
48+
openTelemetry, instrumentationName, spanNameExtractor)
49+
.addAttributesExtractor(
50+
DbClientAttributesExtractor.create(dbClientAttributesGetter))
51+
.addAttributesExtractor(esClientAttributesExtractor)
52+
.addAttributesExtractors(attributesExtractors)
53+
.addOperationMetrics(DbClientMetrics.get()))
5054
.buildInstrumenter(SpanKindExtractor.alwaysClient());
5155
}
5256

instrumentation/elasticsearch/elasticsearch-transport-common-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/transport/common/v5_0/ElasticsearchTransportInstrumenterFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.elasticsearch.transport.common.v5_0;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor;
@@ -33,6 +35,7 @@ public static Instrumenter<ElasticTransportRequest, ActionResponse> create(
3335
DbClientSpanNameExtractor.create(dbClientAttributesGetter))
3436
.addAttributesExtractor(DbClientAttributesExtractor.create(dbClientAttributesGetter))
3537
.addOperationMetrics(DbClientMetrics.get());
38+
setDbClientExceptionEventExtractor(instrumenterBuilder);
3639

3740
if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) {
3841
instrumenterBuilder.addAttributesExtractor(experimentalAttributesExtractor);

instrumentation/geode-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/geode/v1_4/GeodeSingletons.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.geode.v1_4;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
@@ -21,12 +23,14 @@ class GeodeSingletons {
2123
GeodeDbAttributesGetter dbClientAttributesGetter = new GeodeDbAttributesGetter();
2224

2325
instrumenter =
24-
Instrumenter.<GeodeRequest, Void>builder(
25-
GlobalOpenTelemetry.get(),
26-
INSTRUMENTATION_NAME,
27-
DbClientSpanNameExtractor.create(dbClientAttributesGetter))
28-
.addAttributesExtractor(DbClientAttributesExtractor.create(dbClientAttributesGetter))
29-
.addOperationMetrics(DbClientMetrics.get())
26+
setDbClientExceptionEventExtractor(
27+
Instrumenter.<GeodeRequest, Void>builder(
28+
GlobalOpenTelemetry.get(),
29+
INSTRUMENTATION_NAME,
30+
DbClientSpanNameExtractor.create(dbClientAttributesGetter))
31+
.addAttributesExtractor(
32+
DbClientAttributesExtractor.create(dbClientAttributesGetter))
33+
.addOperationMetrics(DbClientMetrics.get()))
3034
.buildInstrumenter(SpanKindExtractor.alwaysClient());
3135
}
3236

instrumentation/influxdb-2.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/influxdb/v2_4/InfluxDbSingletons.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.javaagent.instrumentation.influxdb.v2_4;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.internal.DbExceptionEventExtractors.setDbClientExceptionEventExtractor;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
@@ -21,15 +23,16 @@ public class InfluxDbSingletons {
2123
InfluxDbAttributesGetter dbAttributesGetter = new InfluxDbAttributesGetter();
2224

2325
instrumenter =
24-
Instrumenter.<InfluxDbRequest, Void>builder(
25-
GlobalOpenTelemetry.get(),
26-
"io.opentelemetry.influxdb-2.4",
27-
DbClientSpanNameExtractor.createWithGenericOldSpanName(dbAttributesGetter))
28-
.addAttributesExtractor(
29-
SqlClientAttributesExtractor.builder(dbAttributesGetter)
30-
.setTableAttribute(null)
31-
.build())
32-
.addOperationMetrics(DbClientMetrics.get())
26+
setDbClientExceptionEventExtractor(
27+
Instrumenter.<InfluxDbRequest, Void>builder(
28+
GlobalOpenTelemetry.get(),
29+
"io.opentelemetry.influxdb-2.4",
30+
DbClientSpanNameExtractor.createWithGenericOldSpanName(dbAttributesGetter))
31+
.addAttributesExtractor(
32+
SqlClientAttributesExtractor.builder(dbAttributesGetter)
33+
.setTableAttribute(null)
34+
.build())
35+
.addOperationMetrics(DbClientMetrics.get()))
3336
.buildInstrumenter(SpanKindExtractor.alwaysClient());
3437
}
3538

0 commit comments

Comments
 (0)