Skip to content

Commit ef1b24d

Browse files
committed
Add messaging exception event extractor helpers
1 parent b2035d0 commit ef1b24d

12 files changed

Lines changed: 236 additions & 106 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.semconv.messaging;
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+
/** Utilities for configuring messaging exception events. */
14+
public final class MessagingExceptionEventExtractors {
15+
16+
/** Configures the messaging create exception event name and severity. */
17+
@CanIgnoreReturnValue
18+
public static <REQUEST, RESPONSE>
19+
InstrumenterBuilder<REQUEST, RESPONSE> setMessagingCreateExceptionEventExtractor(
20+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
21+
return setExceptionEventExtractor(builder, "messaging.create.exception", Severity.WARN);
22+
}
23+
24+
/** Configures the messaging send exception event name and severity. */
25+
@CanIgnoreReturnValue
26+
public static <REQUEST, RESPONSE>
27+
InstrumenterBuilder<REQUEST, RESPONSE> setMessagingSendExceptionEventExtractor(
28+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
29+
return setExceptionEventExtractor(builder, "messaging.send.exception", Severity.WARN);
30+
}
31+
32+
/** Configures the messaging receive exception event name and severity. */
33+
@CanIgnoreReturnValue
34+
public static <REQUEST, RESPONSE>
35+
InstrumenterBuilder<REQUEST, RESPONSE> setMessagingReceiveExceptionEventExtractor(
36+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
37+
return setExceptionEventExtractor(builder, "messaging.receive.exception", Severity.WARN);
38+
}
39+
40+
/** Configures the messaging settle exception event name and severity. */
41+
@CanIgnoreReturnValue
42+
public static <REQUEST, RESPONSE>
43+
InstrumenterBuilder<REQUEST, RESPONSE> setMessagingSettleExceptionEventExtractor(
44+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
45+
return setExceptionEventExtractor(builder, "messaging.settle.exception", Severity.WARN);
46+
}
47+
48+
/** Configures the messaging process exception event name and severity. */
49+
@CanIgnoreReturnValue
50+
public static <REQUEST, RESPONSE>
51+
InstrumenterBuilder<REQUEST, RESPONSE> setMessagingProcessExceptionEventExtractor(
52+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
53+
return setExceptionEventExtractor(builder, "messaging.process.exception", Severity.ERROR);
54+
}
55+
56+
@CanIgnoreReturnValue
57+
private static <REQUEST, RESPONSE>
58+
InstrumenterBuilder<REQUEST, RESPONSE> setExceptionEventExtractor(
59+
InstrumenterBuilder<REQUEST, RESPONSE> builder, String eventName, Severity severity) {
60+
Experimental.setExceptionEventExtractor(
61+
builder,
62+
(logRecordBuilder, context, request) -> {
63+
logRecordBuilder.setEventName(eventName);
64+
logRecordBuilder.setSeverity(severity);
65+
});
66+
return builder;
67+
}
68+
69+
private MessagingExceptionEventExtractors() {}
70+
}

instrumentation/jms/jms-common-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/common/v1_1/JmsInstrumenterFactory.java

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

66
package io.opentelemetry.javaagent.instrumentation.jms.common.v1_1;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingProcessExceptionEventExtractor;
9+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingReceiveExceptionEventExtractor;
10+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingSendExceptionEventExtractor;
811
import static java.util.Collections.emptyList;
912

1013
import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -50,11 +53,12 @@ public Instrumenter<MessageWithDestination, Void> createProducerInstrumenter() {
5053
JmsMessageAttributesGetter getter = new JmsMessageAttributesGetter();
5154
MessageOperation operation = MessageOperation.PUBLISH;
5255

53-
return Instrumenter.<MessageWithDestination, Void>builder(
54-
openTelemetry,
55-
instrumentationName,
56-
MessagingSpanNameExtractor.create(getter, operation))
57-
.addAttributesExtractor(createMessagingAttributesExtractor(operation))
56+
return setMessagingSendExceptionEventExtractor(
57+
Instrumenter.<MessageWithDestination, Void>builder(
58+
openTelemetry,
59+
instrumentationName,
60+
MessagingSpanNameExtractor.create(getter, operation))
61+
.addAttributesExtractor(createMessagingAttributesExtractor(operation)))
5862
.buildProducerInstrumenter(new MessagePropertySetter());
5963
}
6064

@@ -68,6 +72,7 @@ public Instrumenter<MessageWithDestination, Void> createConsumerReceiveInstrumen
6872
instrumentationName,
6973
MessagingSpanNameExtractor.create(getter, operation))
7074
.addAttributesExtractor(createMessagingAttributesExtractor(operation));
75+
setMessagingReceiveExceptionEventExtractor(builder);
7176
if (messagingReceiveInstrumentationEnabled) {
7277
builder.addSpanLinksExtractor(
7378
new PropagatorBasedSpanLinksExtractor<>(
@@ -88,6 +93,7 @@ public Instrumenter<MessageWithDestination, Void> createConsumerProcessInstrumen
8893
instrumentationName,
8994
MessagingSpanNameExtractor.create(getter, operation))
9095
.addAttributesExtractor(createMessagingAttributesExtractor(operation));
96+
setMessagingProcessExceptionEventExtractor(builder);
9197
if (canHaveReceiveInstrumentation && messagingReceiveInstrumentationEnabled) {
9298
builder.addSpanLinksExtractor(
9399
new PropagatorBasedSpanLinksExtractor<>(

instrumentation/kafka/kafka-clients/kafka-clients-common-0.11/library/src/main/java/io/opentelemetry/instrumentation/kafkaclients/common/v0_11/internal/KafkaInstrumenterFactory.java

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

66
package io.opentelemetry.instrumentation.kafkaclients.common.v0_11.internal;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingProcessExceptionEventExtractor;
9+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingReceiveExceptionEventExtractor;
10+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingSendExceptionEventExtractor;
811
import static java.util.Collections.emptyList;
912

1013
import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -91,6 +94,7 @@ public Instrumenter<KafkaProducerRequest, RecordMetadata> createProducerInstrume
9194
if (captureExperimentalSpanAttributes) {
9295
builder.addAttributesExtractor(new KafkaProducerExperimentalAttributesExtractor());
9396
}
97+
setMessagingSendExceptionEventExtractor(builder);
9498
return builder.buildInstrumenter(SpanKindExtractor.alwaysProducer());
9599
}
96100

@@ -103,16 +107,17 @@ public Instrumenter<KafkaReceiveRequest, Void> createConsumerReceiveInstrumenter
103107
KafkaReceiveAttributesGetter getter = new KafkaReceiveAttributesGetter();
104108
MessageOperation operation = MessageOperation.RECEIVE;
105109

106-
return Instrumenter.<KafkaReceiveRequest, Void>builder(
107-
openTelemetry,
108-
instrumentationName,
109-
MessagingSpanNameExtractor.create(getter, operation))
110-
.addAttributesExtractor(
111-
buildMessagingAttributesExtractor(getter, operation, capturedHeaders))
112-
.addAttributesExtractor(new KafkaReceiveAttributesExtractor())
113-
.addAttributesExtractors(extractors)
114-
.setErrorCauseExtractor(errorCauseExtractor)
115-
.setEnabled(messagingReceiveInstrumentationEnabled)
110+
return setMessagingReceiveExceptionEventExtractor(
111+
Instrumenter.<KafkaReceiveRequest, Void>builder(
112+
openTelemetry,
113+
instrumentationName,
114+
MessagingSpanNameExtractor.create(getter, operation))
115+
.addAttributesExtractor(
116+
buildMessagingAttributesExtractor(getter, operation, capturedHeaders))
117+
.addAttributesExtractor(new KafkaReceiveAttributesExtractor())
118+
.addAttributesExtractors(extractors)
119+
.setErrorCauseExtractor(errorCauseExtractor)
120+
.setEnabled(messagingReceiveInstrumentationEnabled))
116121
.buildInstrumenter(SpanKindExtractor.alwaysConsumer());
117122
}
118123

@@ -138,6 +143,7 @@ public Instrumenter<KafkaProcessRequest, Void> createConsumerProcessInstrumenter
138143
if (captureExperimentalSpanAttributes) {
139144
builder.addAttributesExtractor(new KafkaConsumerExperimentalAttributesExtractor());
140145
}
146+
setMessagingProcessExceptionEventExtractor(builder);
141147

142148
if (messagingReceiveInstrumentationEnabled) {
143149
builder.addSpanLinksExtractor(
@@ -154,17 +160,18 @@ public Instrumenter<KafkaReceiveRequest, Void> createBatchProcessInstrumenter()
154160
KafkaReceiveAttributesGetter getter = new KafkaReceiveAttributesGetter();
155161
MessageOperation operation = MessageOperation.PROCESS;
156162

157-
return Instrumenter.<KafkaReceiveRequest, Void>builder(
158-
openTelemetry,
159-
instrumentationName,
160-
MessagingSpanNameExtractor.create(getter, operation))
161-
.addAttributesExtractor(
162-
buildMessagingAttributesExtractor(getter, operation, capturedHeaders))
163-
.addAttributesExtractor(new KafkaReceiveAttributesExtractor())
164-
.addSpanLinksExtractor(
165-
new KafkaBatchProcessSpanLinksExtractor(
166-
openTelemetry.getPropagators().getTextMapPropagator()))
167-
.setErrorCauseExtractor(errorCauseExtractor)
163+
return setMessagingProcessExceptionEventExtractor(
164+
Instrumenter.<KafkaReceiveRequest, Void>builder(
165+
openTelemetry,
166+
instrumentationName,
167+
MessagingSpanNameExtractor.create(getter, operation))
168+
.addAttributesExtractor(
169+
buildMessagingAttributesExtractor(getter, operation, capturedHeaders))
170+
.addAttributesExtractor(new KafkaReceiveAttributesExtractor())
171+
.addSpanLinksExtractor(
172+
new KafkaBatchProcessSpanLinksExtractor(
173+
openTelemetry.getPropagators().getTextMapPropagator()))
174+
.setErrorCauseExtractor(errorCauseExtractor))
168175
.buildInstrumenter(SpanKindExtractor.alwaysConsumer());
169176
}
170177

instrumentation/kafka/kafka-connect-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/kafkaconnect/v2_6/KafkaConnectSingletons.java

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

66
package io.opentelemetry.javaagent.instrumentation.kafkaconnect.v2_6;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingProcessExceptionEventExtractor;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.context.propagation.TextMapPropagator;
1012
import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation;
@@ -26,16 +28,17 @@ public class KafkaConnectSingletons {
2628
new KafkaConnectBatchProcessSpanLinksExtractor(propagator);
2729

2830
instrumenter =
29-
Instrumenter.<KafkaConnectTask, Void>builder(
30-
GlobalOpenTelemetry.get(),
31-
INSTRUMENTATION_NAME,
32-
MessagingSpanNameExtractor.create(
33-
new KafkaConnectAttributesGetter(), MessageOperation.PROCESS))
34-
.addAttributesExtractor(
35-
MessagingAttributesExtractor.builder(
36-
new KafkaConnectAttributesGetter(), MessageOperation.PROCESS)
37-
.build())
38-
.addSpanLinksExtractor(spanLinksExtractor)
31+
setMessagingProcessExceptionEventExtractor(
32+
Instrumenter.<KafkaConnectTask, Void>builder(
33+
GlobalOpenTelemetry.get(),
34+
INSTRUMENTATION_NAME,
35+
MessagingSpanNameExtractor.create(
36+
new KafkaConnectAttributesGetter(), MessageOperation.PROCESS))
37+
.addAttributesExtractor(
38+
MessagingAttributesExtractor.builder(
39+
new KafkaConnectAttributesGetter(), MessageOperation.PROCESS)
40+
.build())
41+
.addSpanLinksExtractor(spanLinksExtractor))
3942
.buildInstrumenter(SpanKindExtractor.alwaysConsumer());
4043
}
4144

instrumentation/nats/nats-2.17/library/src/main/java/io/opentelemetry/instrumentation/nats/v2_17/internal/NatsInstrumenterFactory.java

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

66
package io.opentelemetry.instrumentation.nats.v2_17.internal;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingProcessExceptionEventExtractor;
9+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingSendExceptionEventExtractor;
10+
811
import io.opentelemetry.api.OpenTelemetry;
912
import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation;
1013
import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor;
@@ -22,16 +25,17 @@ public final class NatsInstrumenterFactory {
2225

2326
public static Instrumenter<NatsRequest, NatsRequest> createProducerInstrumenter(
2427
OpenTelemetry openTelemetry, List<String> capturedHeaders) {
25-
return Instrumenter.<NatsRequest, NatsRequest>builder(
26-
openTelemetry,
27-
INSTRUMENTATION_NAME,
28-
MessagingSpanNameExtractor.create(
29-
new NatsRequestMessagingAttributesGetter(), MessageOperation.PUBLISH))
30-
.addAttributesExtractor(
31-
MessagingAttributesExtractor.builder(
32-
new NatsRequestMessagingAttributesGetter(), MessageOperation.PUBLISH)
33-
.setCapturedHeaders(capturedHeaders)
34-
.build())
28+
return setMessagingSendExceptionEventExtractor(
29+
Instrumenter.<NatsRequest, NatsRequest>builder(
30+
openTelemetry,
31+
INSTRUMENTATION_NAME,
32+
MessagingSpanNameExtractor.create(
33+
new NatsRequestMessagingAttributesGetter(), MessageOperation.PUBLISH))
34+
.addAttributesExtractor(
35+
MessagingAttributesExtractor.builder(
36+
new NatsRequestMessagingAttributesGetter(), MessageOperation.PUBLISH)
37+
.setCapturedHeaders(capturedHeaders)
38+
.build()))
3539
.buildProducerInstrumenter(new NatsRequestTextMapSetter());
3640
}
3741

@@ -48,6 +52,7 @@ public static Instrumenter<NatsRequest, Void> createConsumerProcessInstrumenter(
4852
new NatsRequestMessagingAttributesGetter(), MessageOperation.PROCESS)
4953
.setCapturedHeaders(capturedHeaders)
5054
.build());
55+
setMessagingProcessExceptionEventExtractor(builder);
5156

5257
return builder.buildConsumerInstrumenter(new NatsRequestTextMapGetter());
5358
}

instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java

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

66
package io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry;
77

8+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingProcessExceptionEventExtractor;
9+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingReceiveExceptionEventExtractor;
10+
import static io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingExceptionEventExtractors.setMessagingSendExceptionEventExtractor;
11+
812
import io.opentelemetry.api.GlobalOpenTelemetry;
913
import io.opentelemetry.api.OpenTelemetry;
1014
import io.opentelemetry.context.Context;
@@ -77,6 +81,7 @@ private static Instrumenter<PulsarRequest, Void> createConsumerReceiveInstrument
7781
.addOperationMetrics(MessagingConsumerMetrics.get())
7882
.addAttributesExtractor(
7983
ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter()));
84+
setMessagingReceiveExceptionEventExtractor(instrumenterBuilder);
8085

8186
if (receiveInstrumentationEnabled) {
8287
return instrumenterBuilder
@@ -91,16 +96,17 @@ private static Instrumenter<PulsarBatchRequest, Void> createConsumerBatchReceive
9196
MessagingAttributesGetter<PulsarBatchRequest, Void> getter =
9297
new PulsarBatchMessagingAttributesGetter();
9398

94-
return Instrumenter.<PulsarBatchRequest, Void>builder(
95-
telemetry,
96-
INSTRUMENTATION_NAME,
97-
MessagingSpanNameExtractor.create(getter, MessageOperation.RECEIVE))
98-
.addAttributesExtractor(
99-
createMessagingAttributesExtractor(getter, MessageOperation.RECEIVE))
100-
.addAttributesExtractor(
101-
ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter()))
102-
.addSpanLinksExtractor(new PulsarBatchRequestSpanLinksExtractor(propagator))
103-
.addOperationMetrics(MessagingConsumerMetrics.get())
99+
return setMessagingReceiveExceptionEventExtractor(
100+
Instrumenter.<PulsarBatchRequest, Void>builder(
101+
telemetry,
102+
INSTRUMENTATION_NAME,
103+
MessagingSpanNameExtractor.create(getter, MessageOperation.RECEIVE))
104+
.addAttributesExtractor(
105+
createMessagingAttributesExtractor(getter, MessageOperation.RECEIVE))
106+
.addAttributesExtractor(
107+
ServerAttributesExtractor.create(new PulsarNetClientAttributesGetter()))
108+
.addSpanLinksExtractor(new PulsarBatchRequestSpanLinksExtractor(propagator))
109+
.addOperationMetrics(MessagingConsumerMetrics.get()))
104110
.buildInstrumenter(SpanKindExtractor.alwaysConsumer());
105111
}
106112

@@ -114,6 +120,7 @@ private static Instrumenter<PulsarRequest, Void> createConsumerProcessInstrument
114120
MessagingSpanNameExtractor.create(getter, MessageOperation.PROCESS))
115121
.addAttributesExtractor(
116122
createMessagingAttributesExtractor(getter, MessageOperation.PROCESS));
123+
setMessagingProcessExceptionEventExtractor(instrumenterBuilder);
117124

118125
if (receiveInstrumentationEnabled) {
119126
SpanLinksExtractor<PulsarRequest> spanLinksExtractor =
@@ -142,6 +149,7 @@ private static Instrumenter<PulsarRequest, Void> createProducerInstrumenter() {
142149
.getBoolean("experimental_span_attributes/development", false)) {
143150
builder.addAttributesExtractor(new ExperimentalProducerAttributesExtractor());
144151
}
152+
setMessagingSendExceptionEventExtractor(builder);
145153

146154
return builder.buildProducerInstrumenter(new MessageTextMapSetter());
147155
}

0 commit comments

Comments
 (0)