Skip to content

Commit 3b58c30

Browse files
committed
netty
1 parent c03d1b6 commit 3b58c30

File tree

7 files changed

+82
-151
lines changed

7 files changed

+82
-151
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
4040
* any time.
4141
*/
42-
public final class DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> {
42+
public class DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> {
4343

4444
private final String instrumentationName;
4545
private final OpenTelemetry openTelemetry;
@@ -211,6 +211,10 @@ public OpenTelemetry getOpenTelemetry() {
211211
return openTelemetry;
212212
}
213213

214+
public String getInstrumentationName() {
215+
return instrumentationName;
216+
}
217+
214218
public static <REQUEST, RESPONSE>
215219
DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> unwrapAndConfigure(
216220
CoreCommonConfig config, Object builder) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.opentelemetry.instrumentation.netty.v4.common.internal.client;
2+
3+
import io.netty.handler.codec.http.HttpResponse;
4+
import io.opentelemetry.api.OpenTelemetry;
5+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientTelemetryBuilder;
6+
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver;
7+
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
8+
import java.util.Optional;
9+
10+
public class NettyClientInstrumenterBuilder extends
11+
DefaultHttpClientTelemetryBuilder<HttpRequestAndChannel, HttpResponse> {
12+
private PeerServiceResolver peerServiceResolver;
13+
14+
public NettyClientInstrumenterBuilder(String instrumentationName, OpenTelemetry openTelemetry) {
15+
super(instrumentationName, openTelemetry, new NettyHttpClientAttributesGetter(),
16+
Optional.of(HttpRequestHeadersSetter.INSTANCE));
17+
}
18+
19+
@Override
20+
public NettyClientInstrumenterBuilder setPeerServiceResolver(
21+
PeerServiceResolver peerServiceResolver) {
22+
this.peerServiceResolver = peerServiceResolver;
23+
super.setPeerServiceResolver(peerServiceResolver);
24+
return this;
25+
}
26+
27+
public PeerServiceResolver getPeerServiceResolver() {
28+
return peerServiceResolver;
29+
}
30+
}

instrumentation/netty/netty-4-common/library/src/main/java/io/opentelemetry/instrumentation/netty/v4/common/internal/client/NettyClientInstrumenterFactory.java

Lines changed: 9 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -7,96 +7,37 @@
77

88
import io.netty.channel.Channel;
99
import io.netty.handler.codec.http.HttpResponse;
10-
import io.opentelemetry.api.OpenTelemetry;
11-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics;
1210
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor;
13-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
14-
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver;
15-
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1611
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1712
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1813
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
19-
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
2014
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor;
21-
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
22-
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics;
23-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
24-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder;
25-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
2615
import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor;
2716
import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor;
2817
import io.opentelemetry.instrumentation.netty.common.internal.NettyConnectionRequest;
2918
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
30-
import java.util.List;
31-
import java.util.function.Consumer;
32-
import java.util.function.Function;
3319

3420
/**
3521
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
3622
* any time.
3723
*/
3824
public final class NettyClientInstrumenterFactory {
3925

40-
private final OpenTelemetry openTelemetry;
41-
private final String instrumentationName;
26+
private final NettyClientInstrumenterBuilder builder;
4227
private final NettyConnectionInstrumentationFlag connectionTelemetryState;
4328
private final NettyConnectionInstrumentationFlag sslTelemetryState;
44-
private final PeerServiceResolver peerServiceResolver;
45-
private final boolean emitExperimentalHttpClientMetrics;
4629

4730
public NettyClientInstrumenterFactory(
48-
OpenTelemetry openTelemetry,
49-
String instrumentationName,
31+
NettyClientInstrumenterBuilder builder,
5032
NettyConnectionInstrumentationFlag connectionTelemetryState,
51-
NettyConnectionInstrumentationFlag sslTelemetryState,
52-
PeerServiceResolver peerServiceResolver,
53-
boolean emitExperimentalHttpClientMetrics) {
54-
this.openTelemetry = openTelemetry;
55-
this.instrumentationName = instrumentationName;
33+
NettyConnectionInstrumentationFlag sslTelemetryState) {
34+
this.builder = builder;
5635
this.connectionTelemetryState = connectionTelemetryState;
5736
this.sslTelemetryState = sslTelemetryState;
58-
this.peerServiceResolver = peerServiceResolver;
59-
this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics;
6037
}
6138

62-
public Instrumenter<HttpRequestAndChannel, HttpResponse> createHttpInstrumenter(
63-
Consumer<HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse>>
64-
extractorConfigurer,
65-
Consumer<HttpSpanNameExtractorBuilder<HttpRequestAndChannel>> spanNameExtractorConfigurer,
66-
Function<
67-
SpanNameExtractor<HttpRequestAndChannel>,
68-
? extends SpanNameExtractor<? super HttpRequestAndChannel>>
69-
spanNameExtractorTransformer,
70-
List<AttributesExtractor<HttpRequestAndChannel, HttpResponse>>
71-
additionalHttpAttributeExtractors) {
72-
NettyHttpClientAttributesGetter httpAttributesGetter = new NettyHttpClientAttributesGetter();
73-
74-
HttpClientAttributesExtractorBuilder<HttpRequestAndChannel, HttpResponse> extractorBuilder =
75-
HttpClientAttributesExtractor.builder(httpAttributesGetter);
76-
extractorConfigurer.accept(extractorBuilder);
77-
78-
HttpSpanNameExtractorBuilder<HttpRequestAndChannel> httpSpanNameExtractorBuilder =
79-
HttpSpanNameExtractor.builder(httpAttributesGetter);
80-
spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
81-
SpanNameExtractor<? super HttpRequestAndChannel> spanNameExtractor =
82-
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
83-
84-
InstrumenterBuilder<HttpRequestAndChannel, HttpResponse> builder =
85-
Instrumenter.<HttpRequestAndChannel, HttpResponse>builder(
86-
openTelemetry, instrumentationName, spanNameExtractor)
87-
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
88-
.addAttributesExtractor(extractorBuilder.build())
89-
.addAttributesExtractor(
90-
HttpClientPeerServiceAttributesExtractor.create(
91-
httpAttributesGetter, peerServiceResolver))
92-
.addAttributesExtractors(additionalHttpAttributeExtractors)
93-
.addOperationMetrics(HttpClientMetrics.get());
94-
if (emitExperimentalHttpClientMetrics) {
95-
builder
96-
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
97-
.addOperationMetrics(HttpClientExperimentalMetrics.get());
98-
}
99-
return builder.buildClientInstrumenter(HttpRequestHeadersSetter.INSTANCE);
39+
public Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() {
40+
return builder.instrumenter();
10041
}
10142

10243
public NettyConnectionInstrumenter createConnectionInstrumenter() {
@@ -110,9 +51,9 @@ public NettyConnectionInstrumenter createConnectionInstrumenter() {
11051

11152
InstrumenterBuilder<NettyConnectionRequest, Channel> builder =
11253
Instrumenter.<NettyConnectionRequest, Channel>builder(
113-
openTelemetry, instrumentationName, NettyConnectionRequest::spanName)
54+
this.builder.getOpenTelemetry(), this.builder.getInstrumentationName(), NettyConnectionRequest::spanName)
11455
.addAttributesExtractor(
115-
HttpClientPeerServiceAttributesExtractor.create(getter, peerServiceResolver));
56+
HttpClientPeerServiceAttributesExtractor.create(getter, this.builder.getPeerServiceResolver()));
11657

11758
if (connectionTelemetryFullyEnabled) {
11859
// when the connection telemetry is fully enabled, CONNECT spans are created for every
@@ -147,7 +88,7 @@ public NettySslInstrumenter createSslInstrumenter() {
14788
NettySslNetAttributesGetter netAttributesGetter = new NettySslNetAttributesGetter();
14889
Instrumenter<NettySslRequest, Void> instrumenter =
14990
Instrumenter.<NettySslRequest, Void>builder(
150-
openTelemetry, instrumentationName, NettySslRequest::spanName)
91+
builder.getOpenTelemetry(), builder.getInstrumentationName(), NettySslRequest::spanName)
15192
.addAttributesExtractor(NetworkAttributesExtractor.create(netAttributesGetter))
15293
.buildInstrumenter(
15394
sslTelemetryFullyEnabled

instrumentation/netty/netty-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/client/NettyClientSingletons.java

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99

1010
import io.netty.handler.codec.http.HttpResponse;
1111
import io.opentelemetry.api.GlobalOpenTelemetry;
12+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.HttpClientInstrumenterBuilder;
1213
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1314
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
15+
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterBuilder;
1416
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterFactory;
1517
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumenter;
1618
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettySslInstrumenter;
1719
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
1820
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
19-
import java.util.Collections;
20-
import java.util.function.Function;
2121

2222
public final class NettyClientSingletons {
2323

@@ -33,24 +33,17 @@ public final class NettyClientSingletons {
3333
private static final NettySslInstrumenter SSL_INSTRUMENTER;
3434

3535
static {
36+
NettyClientInstrumenterBuilder builder = new NettyClientInstrumenterBuilder(
37+
"io.opentelemetry.netty-4.0", GlobalOpenTelemetry.get());
38+
HttpClientInstrumenterBuilder.configure(CommonConfig.get(), builder);
39+
3640
NettyClientInstrumenterFactory factory =
3741
new NettyClientInstrumenterFactory(
38-
GlobalOpenTelemetry.get(),
39-
"io.opentelemetry.netty-4.0",
42+
builder,
4043
enabledOrErrorOnly(connectionTelemetryEnabled),
41-
enabledOrErrorOnly(sslTelemetryEnabled),
42-
CommonConfig.get().getPeerServiceResolver(),
43-
CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
44-
INSTRUMENTER =
45-
factory.createHttpInstrumenter(
46-
builder ->
47-
builder
48-
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
49-
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
50-
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
51-
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
52-
Function.identity(),
53-
Collections.emptyList());
44+
enabledOrErrorOnly(sslTelemetryEnabled)
45+
);
46+
INSTRUMENTER = factory.instrumenter();
5447
CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter();
5548
SSL_INSTRUMENTER = factory.createSslInstrumenter();
5649
}

instrumentation/netty/netty-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyClientSingletons.java

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99

1010
import io.netty.handler.codec.http.HttpResponse;
1111
import io.opentelemetry.api.GlobalOpenTelemetry;
12+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.HttpClientInstrumenterBuilder;
1213
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1314
import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel;
15+
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterBuilder;
1416
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyClientInstrumenterFactory;
1517
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettyConnectionInstrumenter;
1618
import io.opentelemetry.instrumentation.netty.v4.common.internal.client.NettySslInstrumenter;
1719
import io.opentelemetry.instrumentation.netty.v4_1.internal.client.NettyClientHandlerFactory;
1820
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
1921
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
20-
import java.util.Collections;
21-
import java.util.function.Function;
2222

2323
public final class NettyClientSingletons {
2424

@@ -35,24 +35,15 @@ public final class NettyClientSingletons {
3535
private static final NettyClientHandlerFactory CLIENT_HANDLER_FACTORY;
3636

3737
static {
38+
NettyClientInstrumenterBuilder builder = new NettyClientInstrumenterBuilder(
39+
"io.opentelemetry.netty-4.1", GlobalOpenTelemetry.get());
40+
HttpClientInstrumenterBuilder.configure(CommonConfig.get(), builder);
3841
NettyClientInstrumenterFactory factory =
3942
new NettyClientInstrumenterFactory(
40-
GlobalOpenTelemetry.get(),
41-
"io.opentelemetry.netty-4.1",
43+
builder,
4244
enabledOrErrorOnly(connectionTelemetryEnabled),
43-
enabledOrErrorOnly(sslTelemetryEnabled),
44-
CommonConfig.get().getPeerServiceResolver(),
45-
CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
46-
INSTRUMENTER =
47-
factory.createHttpInstrumenter(
48-
builder ->
49-
builder
50-
.setCapturedRequestHeaders(CommonConfig.get().getClientRequestHeaders())
51-
.setCapturedResponseHeaders(CommonConfig.get().getClientResponseHeaders())
52-
.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
53-
builder -> builder.setKnownMethods(CommonConfig.get().getKnownHttpRequestMethods()),
54-
Function.identity(),
55-
Collections.emptyList());
45+
enabledOrErrorOnly(sslTelemetryEnabled));
46+
INSTRUMENTER = factory.instrumenter();
5647
CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter();
5748
SSL_INSTRUMENTER = factory.createSslInstrumenter();
5849
CLIENT_HANDLER_FACTORY =

0 commit comments

Comments
 (0)