Skip to content

Commit 7d2faa2

Browse files
committed
back
1 parent cb39859 commit 7d2faa2

8 files changed

Lines changed: 63 additions & 120 deletions

File tree

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpClientInstrumenterBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import com.google.errorprone.annotations.CanIgnoreReturnValue;
1111
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.api.logs.Severity;
1213
import io.opentelemetry.context.Context;
1314
import io.opentelemetry.context.propagation.TextMapSetter;
1415
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
@@ -226,6 +227,12 @@ public Instrumenter<REQUEST, RESPONSE> build() {
226227
.addAttributesExtractors(additionalExtractors)
227228
.addOperationMetrics(HttpClientMetrics.get())
228229
.setSchemaUrl(SchemaUrls.V1_41_0);
230+
Experimental.setExceptionEventExtractor(
231+
builder,
232+
(logRecordBuilder, context, request) -> {
233+
logRecordBuilder.setEventName("http.client.request.exception");
234+
logRecordBuilder.setSeverity(Severity.WARN);
235+
});
229236
if (emitExperimentalHttpClientTelemetry) {
230237
builder
231238
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(attributesGetter))

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerInstrumenterBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import com.google.errorprone.annotations.CanIgnoreReturnValue;
1111
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.api.logs.Severity;
1213
import io.opentelemetry.context.propagation.TextMapGetter;
1314
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
1415
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
@@ -231,6 +232,12 @@ public InstrumenterBuilder<REQUEST, RESPONSE> instrumenterBuilder() {
231232
.addContextCustomizer(httpServerRouteBuilder.build())
232233
.addOperationMetrics(HttpServerMetrics.get())
233234
.setSchemaUrl(SchemaUrls.V1_41_0);
235+
Experimental.setExceptionEventExtractor(
236+
builder,
237+
(logRecordBuilder, context, request) -> {
238+
logRecordBuilder.setEventName("http.server.request.exception");
239+
logRecordBuilder.setSeverity(Severity.ERROR);
240+
});
234241
if (emitExperimentalHttpServerTelemetry) {
235242
builder
236243
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(attributesGetter))

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import io.opentelemetry.context.propagation.TextMapSetter;
2727
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
2828
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
29-
import io.opentelemetry.instrumentation.api.internal.ExceptionEventExtractorProvider;
3029
import io.opentelemetry.instrumentation.api.internal.Experimental;
3130
import io.opentelemetry.instrumentation.api.internal.InstrumenterBuilderAccess;
3231
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
@@ -84,6 +83,10 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
8483
builder.operationListenerAttributesExtractors.add(
8584
requireNonNull(
8685
operationListenerAttributesExtractor, "operationListenerAttributesExtractor")));
86+
Experimental.internalSetExceptionEventExtractor(
87+
(builder, exceptionEventExtractor) ->
88+
builder.exceptionEventExtractor =
89+
requireNonNull(exceptionEventExtractor, "exceptionEventExtractor"));
8790
}
8891

8992
InstrumenterBuilder(
@@ -302,29 +305,9 @@ private Instrumenter<REQUEST, RESPONSE> buildInstrumenter(
302305
applyCustomizers(this);
303306

304307
this.spanKindExtractor = spanKindExtractor;
305-
exceptionEventExtractor = getExceptionEventExtractorFromAttributesExtractors();
306308
return constructor.create(this);
307309
}
308310

309-
@Nullable
310-
@SuppressWarnings("unchecked") // Exception event extractors from providers don't use REQUEST
311-
private InternalExceptionEventExtractor<? super REQUEST>
312-
getExceptionEventExtractorFromAttributesExtractors() {
313-
for (AttributesExtractor<? super REQUEST, ? super RESPONSE> attributesExtractor :
314-
attributesExtractors) {
315-
if (attributesExtractor instanceof ExceptionEventExtractorProvider) {
316-
ExceptionEventExtractorProvider provider =
317-
(ExceptionEventExtractorProvider) attributesExtractor;
318-
InternalExceptionEventExtractor<?> extractor =
319-
provider.internalGetExceptionEventExtractor();
320-
if (extractor != null) {
321-
return (InternalExceptionEventExtractor<? super REQUEST>) extractor;
322-
}
323-
}
324-
}
325-
return null;
326-
}
327-
328311
Tracer buildTracer() {
329312
TracerBuilder tracerBuilder =
330313
openTelemetry.getTracerProvider().tracerBuilder(instrumentationName);

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ExceptionEventExtractorProvider.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/Experimental.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public final class Experimental {
4040
private static volatile BiConsumer<InstrumenterBuilder<?, ?>, AttributesExtractor<?, ?>>
4141
operationListenerAttributesExtractorAdder;
4242

43+
@Nullable
44+
private static volatile BiConsumer<InstrumenterBuilder<?, ?>, InternalExceptionEventExtractor<?>>
45+
exceptionEventExtractorSetter;
46+
4347
private Experimental() {}
4448

4549
/**
@@ -117,4 +121,23 @@ public static <REQUEST, RESPONSE> void internalAddOperationListenerAttributesExt
117121
Experimental.operationListenerAttributesExtractorAdder =
118122
(BiConsumer) operationListenerAttributesExtractorAdder;
119123
}
124+
125+
/**
126+
* Sets the {@link InternalExceptionEventExtractor} that will determine the exception event name
127+
* and severity. Only used when stable exception semconv is enabled.
128+
*/
129+
public static <REQUEST> void setExceptionEventExtractor(
130+
InstrumenterBuilder<REQUEST, ?> builder,
131+
InternalExceptionEventExtractor<? super REQUEST> exceptionEventExtractor) {
132+
if (exceptionEventExtractorSetter != null) {
133+
exceptionEventExtractorSetter.accept(builder, exceptionEventExtractor);
134+
}
135+
}
136+
137+
@SuppressWarnings({"rawtypes", "unchecked"}) // we lose the generic type information
138+
public static <REQUEST> void internalSetExceptionEventExtractor(
139+
BiConsumer<InstrumenterBuilder<REQUEST, ?>, InternalExceptionEventExtractor<? super REQUEST>>
140+
exceptionEventExtractorSetter) {
141+
Experimental.exceptionEventExtractorSetter = (BiConsumer) exceptionEventExtractorSetter;
142+
}
120143
}

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpClientAttributesExtractor.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,9 @@
99
import static io.opentelemetry.semconv.UrlAttributes.URL_FULL;
1010

1111
import io.opentelemetry.api.common.AttributesBuilder;
12-
import io.opentelemetry.api.logs.Severity;
1312
import io.opentelemetry.context.Context;
1413
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1514
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
16-
import io.opentelemetry.instrumentation.api.internal.ExceptionEventExtractorProvider;
17-
import io.opentelemetry.instrumentation.api.internal.InternalExceptionEventExtractor;
1815
import io.opentelemetry.instrumentation.api.internal.SpanKey;
1916
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
2017
import io.opentelemetry.instrumentation.api.semconv.network.internal.InternalNetworkAttributesExtractor;
@@ -34,7 +31,7 @@
3431
public final class HttpClientAttributesExtractor<REQUEST, RESPONSE>
3532
extends HttpCommonAttributesExtractor<
3633
REQUEST, RESPONSE, HttpClientAttributesGetter<REQUEST, RESPONSE>>
37-
implements SpanKeyProvider, ExceptionEventExtractorProvider {
34+
implements SpanKeyProvider {
3835

3936
/**
4037
* Creates the HTTP client attributes extractor with default configuration.
@@ -109,18 +106,6 @@ public SpanKey internalGetSpanKey() {
109106
return SpanKey.HTTP_CLIENT;
110107
}
111108

112-
/**
113-
* This method is internal and is hence not for public use. Its API is unstable and can change at
114-
* any time.
115-
*/
116-
@Override
117-
public InternalExceptionEventExtractor<?> internalGetExceptionEventExtractor() {
118-
return (logRecordBuilder, context, request) -> {
119-
logRecordBuilder.setEventName("http.client.request.exception");
120-
logRecordBuilder.setSeverity(Severity.WARN);
121-
};
122-
}
123-
124109
@Nullable
125110
private String stripSensitiveData(@Nullable String url) {
126111
if (url == null || url.isEmpty()) {

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpServerAttributesExtractor.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,9 @@
99
import static io.opentelemetry.semconv.UserAgentAttributes.USER_AGENT_ORIGINAL;
1010

1111
import io.opentelemetry.api.common.AttributesBuilder;
12-
import io.opentelemetry.api.logs.Severity;
1312
import io.opentelemetry.context.Context;
1413
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1514
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
16-
import io.opentelemetry.instrumentation.api.internal.ExceptionEventExtractorProvider;
17-
import io.opentelemetry.instrumentation.api.internal.InternalExceptionEventExtractor;
1815
import io.opentelemetry.instrumentation.api.internal.SpanKey;
1916
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
2017
import io.opentelemetry.instrumentation.api.semconv.network.internal.InternalClientAttributesExtractor;
@@ -34,7 +31,7 @@
3431
public final class HttpServerAttributesExtractor<REQUEST, RESPONSE>
3532
extends HttpCommonAttributesExtractor<
3633
REQUEST, RESPONSE, HttpServerAttributesGetter<REQUEST, RESPONSE>>
37-
implements SpanKeyProvider, ExceptionEventExtractorProvider {
34+
implements SpanKeyProvider {
3835

3936
/**
4037
* Creates the HTTP server attributes extractor with default configuration.
@@ -111,18 +108,6 @@ public SpanKey internalGetSpanKey() {
111108
return SpanKey.HTTP_SERVER;
112109
}
113110

114-
/**
115-
* This method is internal and is hence not for public use. Its API is unstable and can change at
116-
* any time.
117-
*/
118-
@Override
119-
public InternalExceptionEventExtractor<?> internalGetExceptionEventExtractor() {
120-
return (logRecordBuilder, context, request) -> {
121-
logRecordBuilder.setEventName("http.server.request.exception");
122-
logRecordBuilder.setSeverity(Severity.ERROR);
123-
};
124-
}
125-
126111
@Nullable
127112
private String userAgent(REQUEST request) {
128113
return firstHeaderValue(getter.getHttpRequestHeader(request, "user-agent"));

instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java

Lines changed: 20 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@
3333
import io.opentelemetry.context.Context;
3434
import io.opentelemetry.context.ContextKey;
3535
import io.opentelemetry.context.propagation.TextMapGetter;
36-
import io.opentelemetry.instrumentation.api.internal.ExceptionEventExtractorProvider;
3736
import io.opentelemetry.instrumentation.api.internal.Experimental;
38-
import io.opentelemetry.instrumentation.api.internal.InternalExceptionEventExtractor;
3937
import io.opentelemetry.instrumentation.api.internal.SchemaUrlProvider;
4038
import io.opentelemetry.instrumentation.api.internal.SpanKey;
4139
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
@@ -151,39 +149,6 @@ public String internalGetSchemaUrl() {
151149
}
152150
}
153151

154-
static class AttributesExtractorWithExceptionEventExtractor
155-
implements AttributesExtractor<Map<String, String>, Map<String, String>>,
156-
ExceptionEventExtractorProvider {
157-
158-
private final InternalExceptionEventExtractor<Object> exceptionEventExtractor;
159-
160-
AttributesExtractorWithExceptionEventExtractor(String eventName, Severity severity) {
161-
exceptionEventExtractor =
162-
(logRecordBuilder, context, request) -> {
163-
logRecordBuilder.setEventName(eventName);
164-
logRecordBuilder.setSeverity(severity);
165-
};
166-
}
167-
168-
@Override
169-
public void onStart(
170-
AttributesBuilder attributes, Context parentContext, Map<String, String> request) {}
171-
172-
@Override
173-
public void onEnd(
174-
AttributesBuilder attributes,
175-
Context context,
176-
Map<String, String> request,
177-
@Nullable Map<String, String> response,
178-
@Nullable Throwable error) {}
179-
180-
@Nullable
181-
@Override
182-
public InternalExceptionEventExtractor<?> internalGetExceptionEventExtractor() {
183-
return exceptionEventExtractor;
184-
}
185-
}
186-
187152
static class LinksExtractor implements SpanLinksExtractor<Map<String, String>> {
188153

189154
@Override
@@ -263,15 +228,19 @@ void server() {
263228

264229
@Test
265230
void server_error() {
266-
Instrumenter<Map<String, String>, Map<String, String>> instrumenter =
231+
InstrumenterBuilder<Map<String, String>, Map<String, String>> builder =
267232
Instrumenter.<Map<String, String>, Map<String, String>>builder(
268233
otelTesting.getOpenTelemetry(), "test", unused -> "span")
269234
.addAttributesExtractor(new AttributesExtractor1())
270-
.addAttributesExtractor(new AttributesExtractor2())
271-
.addAttributesExtractor(
272-
new AttributesExtractorWithExceptionEventExtractor(
273-
"http.server.request.exception", Severity.ERROR))
274-
.buildServerInstrumenter(new MapGetter());
235+
.addAttributesExtractor(new AttributesExtractor2());
236+
Experimental.setExceptionEventExtractor(
237+
builder,
238+
(logRecordBuilder, context, request) -> {
239+
logRecordBuilder.setEventName("http.server.request.exception");
240+
logRecordBuilder.setSeverity(Severity.ERROR);
241+
});
242+
Instrumenter<Map<String, String>, Map<String, String>> instrumenter =
243+
builder.buildServerInstrumenter(new MapGetter());
275244

276245
Context context = instrumenter.start(Context.root(), REQUEST);
277246
assertThat(Span.fromContext(context).getSpanContext().isValid()).isTrue();
@@ -387,15 +356,19 @@ void client() {
387356

388357
@Test
389358
void client_error() {
390-
Instrumenter<Map<String, String>, Map<String, String>> instrumenter =
359+
InstrumenterBuilder<Map<String, String>, Map<String, String>> builder =
391360
Instrumenter.<Map<String, String>, Map<String, String>>builder(
392361
otelTesting.getOpenTelemetry(), "test", unused -> "span")
393362
.addAttributesExtractor(new AttributesExtractor1())
394-
.addAttributesExtractor(new AttributesExtractor2())
395-
.addAttributesExtractor(
396-
new AttributesExtractorWithExceptionEventExtractor(
397-
"http.client.request.exception", Severity.WARN))
398-
.buildClientInstrumenter(Map::put);
363+
.addAttributesExtractor(new AttributesExtractor2());
364+
Experimental.setExceptionEventExtractor(
365+
builder,
366+
(logRecordBuilder, context, request) -> {
367+
logRecordBuilder.setEventName("http.client.request.exception");
368+
logRecordBuilder.setSeverity(Severity.WARN);
369+
});
370+
Instrumenter<Map<String, String>, Map<String, String>> instrumenter =
371+
builder.buildClientInstrumenter(Map::put);
399372

400373
Map<String, String> request = new HashMap<>(REQUEST);
401374
Context context = instrumenter.start(Context.root(), request);

0 commit comments

Comments
 (0)