Skip to content

Commit e6c9ebe

Browse files
committed
netty
1 parent b51f306 commit e6c9ebe

File tree

6 files changed

+89
-164
lines changed

6 files changed

+89
-164
lines changed
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: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,49 +9,41 @@
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;
17-
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
18-
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
19-
import java.util.Collections;
20-
import java.util.function.Function;
19+
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
20+
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
2121

2222
public final class NettyClientSingletons {
2323

2424
private static final boolean connectionTelemetryEnabled =
25-
AgentInstrumentationConfig.get()
25+
InstrumentationConfig.get()
2626
.getBoolean("otel.instrumentation.netty.connection-telemetry.enabled", false);
2727
private static final boolean sslTelemetryEnabled =
28-
AgentInstrumentationConfig.get()
28+
InstrumentationConfig.get()
2929
.getBoolean("otel.instrumentation.netty.ssl-telemetry.enabled", false);
3030

3131
private static final Instrumenter<HttpRequestAndChannel, HttpResponse> INSTRUMENTER;
3232
private static final NettyConnectionInstrumenter CONNECTION_INSTRUMENTER;
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-
AgentCommonConfig.get().getPeerServiceResolver(),
43-
AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
44-
INSTRUMENTER =
45-
factory.createHttpInstrumenter(
46-
builder ->
47-
builder
48-
.setCapturedRequestHeaders(AgentCommonConfig.get().getClientRequestHeaders())
49-
.setCapturedResponseHeaders(AgentCommonConfig.get().getClientResponseHeaders())
50-
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()),
51-
builder ->
52-
builder.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()),
53-
Function.identity(),
54-
Collections.emptyList());
44+
enabledOrErrorOnly(sslTelemetryEnabled)
45+
);
46+
INSTRUMENTER = factory.instrumenter();
5547
CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter();
5648
SSL_INSTRUMENTER = factory.createSslInstrumenter();
5749
}

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

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@
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;
18-
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
19-
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
20-
import java.util.Collections;
21-
import java.util.function.Function;
20+
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
21+
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
2222

2323
public final class NettyClientSingletons {
2424

2525
private static final boolean connectionTelemetryEnabled =
26-
AgentInstrumentationConfig.get()
26+
InstrumentationConfig.get()
2727
.getBoolean("otel.instrumentation.netty.connection-telemetry.enabled", false);
2828
private static final boolean sslTelemetryEnabled =
29-
AgentInstrumentationConfig.get()
29+
InstrumentationConfig.get()
3030
.getBoolean("otel.instrumentation.netty.ssl-telemetry.enabled", false);
3131

3232
private static final Instrumenter<HttpRequestAndChannel, HttpResponse> INSTRUMENTER;
@@ -35,30 +35,20 @@ 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-
AgentCommonConfig.get().getPeerServiceResolver(),
45-
AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
46-
INSTRUMENTER =
47-
factory.createHttpInstrumenter(
48-
builder ->
49-
builder
50-
.setCapturedRequestHeaders(AgentCommonConfig.get().getClientRequestHeaders())
51-
.setCapturedResponseHeaders(AgentCommonConfig.get().getClientResponseHeaders())
52-
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()),
53-
builder ->
54-
builder.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()),
55-
Function.identity(),
56-
Collections.emptyList());
45+
enabledOrErrorOnly(sslTelemetryEnabled));
46+
INSTRUMENTER = factory.instrumenter();
5747
CONNECTION_INSTRUMENTER = factory.createConnectionInstrumenter();
5848
SSL_INSTRUMENTER = factory.createSslInstrumenter();
5949
CLIENT_HANDLER_FACTORY =
6050
new NettyClientHandlerFactory(
61-
INSTRUMENTER, AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
51+
INSTRUMENTER, CommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
6252
}
6353

6454
public static Instrumenter<HttpRequestAndChannel, HttpResponse> instrumenter() {

0 commit comments

Comments
 (0)