Skip to content

Commit bcd3de5

Browse files
committed
http server builder
1 parent 9ca4ec4 commit bcd3de5

File tree

48 files changed

+650
-1219
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+650
-1219
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,10 @@ public OpenTelemetry getOpenTelemetry() {
222222
return openTelemetry;
223223
}
224224

225+
public String getInstrumentationName() {
226+
return instrumentationName;
227+
}
228+
225229
@CanIgnoreReturnValue
226230
public DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> configure(CommonConfig config) {
227231
set(config::getKnownHttpRequestMethods, this::setKnownMethods);

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public final class DefaultHttpServerInstrumenterBuilder<REQUEST, RESPONSE> {
5959
private final HttpServerRouteBuilder<REQUEST> httpServerRouteBuilder;
6060
private final HttpServerAttributesGetter<REQUEST, RESPONSE> attributesGetter;
6161
private boolean emitExperimentalHttpServerMetrics = false;
62+
private Consumer<InstrumenterBuilder<REQUEST, RESPONSE>> builderCustomizer = b -> {};
6263

6364
public DefaultHttpServerInstrumenterBuilder(
6465
String instrumentationName,
@@ -168,6 +169,13 @@ public DefaultHttpServerInstrumenterBuilder<REQUEST, RESPONSE> setSpanNameExtrac
168169
return this;
169170
}
170171

172+
@CanIgnoreReturnValue
173+
public DefaultHttpServerInstrumenterBuilder<REQUEST, RESPONSE> setBuilderCustomizer(
174+
Consumer<InstrumenterBuilder<REQUEST, RESPONSE>> builderCustomizer) {
175+
this.builderCustomizer = builderCustomizer;
176+
return this;
177+
}
178+
171179
public Instrumenter<REQUEST, RESPONSE> build() {
172180
InstrumenterBuilder<REQUEST, RESPONSE> builder = builder();
173181

@@ -177,7 +185,7 @@ public Instrumenter<REQUEST, RESPONSE> build() {
177185
return builder.buildInstrumenter(SpanKindExtractor.alwaysServer());
178186
}
179187

180-
private InstrumenterBuilder<REQUEST, RESPONSE> builder() {
188+
public InstrumenterBuilder<REQUEST, RESPONSE> builder() {
181189
SpanNameExtractor<? super REQUEST> spanNameExtractor =
182190
spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
183191

@@ -195,6 +203,7 @@ private InstrumenterBuilder<REQUEST, RESPONSE> builder() {
195203
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(attributesGetter))
196204
.addOperationMetrics(HttpServerExperimentalMetrics.get());
197205
}
206+
builderCustomizer.accept(builder);
198207

199208
return builder;
200209
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> buildDownstrea
6767
builder, setter, spanKindExtractor);
6868
}
6969

70-
public static <REQUEST, RESPONSE> void propagateOperationListenersToOnEnd(
71-
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
70+
public static <REQUEST, RESPONSE>
71+
InstrumenterBuilder<REQUEST, RESPONSE> propagateOperationListenersToOnEnd(
72+
InstrumenterBuilder<REQUEST, RESPONSE> builder) {
7273
// instrumenterBuilderAccess is guaranteed to be non-null here
7374
instrumenterBuilderAccess.propagateOperationListenersToOnEnd(builder);
75+
return builder;
7476
}
7577

7678
private InstrumenterUtil() {}

instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/AkkaHttpServerSingletons.java

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,20 @@
77

88
import akka.http.scaladsl.model.HttpRequest;
99
import akka.http.scaladsl.model.HttpResponse;
10-
import io.opentelemetry.api.GlobalOpenTelemetry;
11-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
12-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics;
1310
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
14-
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
15-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
16-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
17-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
18-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
19-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
20-
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
11+
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpServerInstrumenters;
2112
import io.opentelemetry.javaagent.instrumentation.akkahttp.AkkaHttpUtil;
2213

2314
public final class AkkaHttpServerSingletons {
2415

2516
private static final Instrumenter<HttpRequest, HttpResponse> INSTRUMENTER;
2617

2718
static {
28-
AkkaHttpServerAttributesGetter httpAttributesGetter = new AkkaHttpServerAttributesGetter();
29-
InstrumenterBuilder<HttpRequest, HttpResponse> builder =
30-
Instrumenter.<HttpRequest, HttpResponse>builder(
31-
GlobalOpenTelemetry.get(),
32-
AkkaHttpUtil.instrumentationName(),
33-
HttpSpanNameExtractor.builder(httpAttributesGetter)
34-
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
35-
.build())
36-
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
37-
.addAttributesExtractor(
38-
HttpServerAttributesExtractor.builder(httpAttributesGetter)
39-
.setCapturedRequestHeaders(AgentCommonConfig.get().getServerRequestHeaders())
40-
.setCapturedResponseHeaders(AgentCommonConfig.get().getServerResponseHeaders())
41-
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
42-
.build())
43-
.addOperationMetrics(HttpServerMetrics.get())
44-
.addContextCustomizer(
45-
HttpServerRoute.builder(httpAttributesGetter)
46-
.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods())
47-
.build());
48-
if (AgentCommonConfig.get().shouldEmitExperimentalHttpServerTelemetry()) {
49-
builder
50-
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
51-
.addOperationMetrics(HttpServerExperimentalMetrics.get());
52-
}
53-
INSTRUMENTER = builder.buildServerInstrumenter(AkkaHttpServerHeaders.INSTANCE);
19+
INSTRUMENTER =
20+
JavaagentHttpServerInstrumenters.create(
21+
AkkaHttpUtil.instrumentationName(),
22+
new AkkaHttpServerAttributesGetter(),
23+
AkkaHttpServerHeaders.INSTANCE);
5424
}
5525

5626
public static Instrumenter<HttpRequest, HttpResponse> instrumenter() {

instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTelemetryBuilder.java

Lines changed: 11 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,12 @@ public final class ArmeriaTelemetryBuilder {
3838
ArmeriaTelemetryBuilder::getServerBuilder);
3939
}
4040

41+
@SuppressWarnings({"rawtypes", "unchecked"})
4142
ArmeriaTelemetryBuilder(OpenTelemetry openTelemetry) {
4243
clientBuilder = ArmeriaInstrumenterBuilderFactory.getClientBuilder(openTelemetry);
4344
serverBuilder = ArmeriaInstrumenterBuilderFactory.getServerBuilder(openTelemetry);
4445
}
4546

46-
/**
47-
* Sets the status extractor for both client and server spans.
48-
*
49-
* @deprecated Use {@link #setClientStatusExtractor(Function)} or {@link
50-
* #setServerStatusExtractor(Function)} instead.
51-
*/
52-
@Deprecated
5347
@SuppressWarnings({"unchecked", "rawtypes"})
5448
@CanIgnoreReturnValue
5549
public ArmeriaTelemetryBuilder setStatusExtractor(
@@ -62,36 +56,10 @@ public ArmeriaTelemetryBuilder setStatusExtractor(
6256
return this;
6357
}
6458

65-
/** Sets the status extractor for client spans. */
66-
@CanIgnoreReturnValue
67-
public ArmeriaTelemetryBuilder setClientStatusExtractor(
68-
Function<
69-
SpanStatusExtractor<? super ClientRequestContext, ? super RequestLog>,
70-
? extends SpanStatusExtractor<? super ClientRequestContext, ? super RequestLog>>
71-
statusExtractor) {
72-
clientBuilder.setStatusExtractor(statusExtractor);
73-
return this;
74-
}
75-
76-
/** Sets the status extractor for server spans. */
77-
@CanIgnoreReturnValue
78-
public ArmeriaTelemetryBuilder setServerStatusExtractor(
79-
Function<
80-
SpanStatusExtractor<? super ServiceRequestContext, ? super RequestLog>,
81-
? extends SpanStatusExtractor<? super ServiceRequestContext, ? super RequestLog>>
82-
statusExtractor) {
83-
serverBuilder.setStatusExtractor(statusExtractor);
84-
return this;
85-
}
86-
8759
/**
8860
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
8961
* items. The {@link AttributesExtractor} will be executed after all default extractors.
90-
*
91-
* @deprecated Use {@link #addClientAttributeExtractor(AttributesExtractor)} or {@link
92-
* #addServerAttributeExtractor(AttributesExtractor)} instead.
9362
*/
94-
@Deprecated
9563
@CanIgnoreReturnValue
9664
public ArmeriaTelemetryBuilder addAttributeExtractor(
9765
AttributesExtractor<? super RequestContext, ? super RequestLog> attributesExtractor) {
@@ -112,18 +80,6 @@ public ArmeriaTelemetryBuilder addClientAttributeExtractor(
11280
return this;
11381
}
11482

115-
/**
116-
* Adds an extra server-only {@link AttributesExtractor} to invoke to set attributes to
117-
* instrumented items. The {@link AttributesExtractor} will be executed after all default
118-
* extractors.
119-
*/
120-
@CanIgnoreReturnValue
121-
public ArmeriaTelemetryBuilder addServerAttributeExtractor(
122-
AttributesExtractor<? super ServiceRequestContext, ? super RequestLog> attributesExtractor) {
123-
serverBuilder.addAttributesExtractor(attributesExtractor);
124-
return this;
125-
}
126-
12783
/** Sets the {@code peer.service} attribute for http client spans. */
12884
@CanIgnoreReturnValue
12985
public ArmeriaTelemetryBuilder setPeerService(String peerService) {
@@ -206,6 +162,7 @@ public ArmeriaTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
206162
public ArmeriaTelemetryBuilder setEmitExperimentalHttpClientMetrics(
207163
boolean emitExperimentalHttpClientMetrics) {
208164
clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
165+
serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpClientMetrics);
209166
return this;
210167
}
211168

@@ -218,29 +175,32 @@ public ArmeriaTelemetryBuilder setEmitExperimentalHttpClientMetrics(
218175
@CanIgnoreReturnValue
219176
public ArmeriaTelemetryBuilder setEmitExperimentalHttpServerMetrics(
220177
boolean emitExperimentalHttpServerMetrics) {
178+
clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpServerMetrics);
221179
serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics);
222180
return this;
223181
}
224182

225183
/** Sets custom client {@link SpanNameExtractor} via transform function. */
184+
@SuppressWarnings({"rawtypes", "unchecked"})
226185
@CanIgnoreReturnValue
227186
public ArmeriaTelemetryBuilder setClientSpanNameExtractor(
228187
Function<
229-
SpanNameExtractor<? super ClientRequestContext>,
230-
? extends SpanNameExtractor<? super ClientRequestContext>>
188+
SpanNameExtractor<RequestContext>,
189+
? extends SpanNameExtractor<? super RequestContext>>
231190
clientSpanNameExtractor) {
232-
clientBuilder.setSpanNameExtractor(clientSpanNameExtractor);
191+
clientBuilder.setSpanNameExtractor((Function) clientSpanNameExtractor);
233192
return this;
234193
}
235194

236195
/** Sets custom server {@link SpanNameExtractor} via transform function. */
196+
@SuppressWarnings({"rawtypes", "unchecked"})
237197
@CanIgnoreReturnValue
238198
public ArmeriaTelemetryBuilder setServerSpanNameExtractor(
239199
Function<
240-
SpanNameExtractor<? super ServiceRequestContext>,
241-
? extends SpanNameExtractor<? super ServiceRequestContext>>
200+
SpanNameExtractor<RequestContext>,
201+
? extends SpanNameExtractor<? super RequestContext>>
242202
serverSpanNameExtractor) {
243-
serverBuilder.setSpanNameExtractor(serverSpanNameExtractor);
203+
serverBuilder.setSpanNameExtractor((Function) serverSpanNameExtractor);
244204
return this;
245205
}
246206

instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/ArmeriaHttpClientAttributesGetter.java

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

66
package io.opentelemetry.instrumentation.armeria.v1_3.internal;
77

8-
import com.linecorp.armeria.client.ClientRequestContext;
98
import com.linecorp.armeria.common.HttpRequest;
109
import com.linecorp.armeria.common.HttpStatus;
10+
import com.linecorp.armeria.common.RequestContext;
1111
import com.linecorp.armeria.common.SessionProtocol;
1212
import com.linecorp.armeria.common.logging.RequestLog;
1313
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
@@ -17,7 +17,7 @@
1717
import javax.annotation.Nullable;
1818

1919
enum ArmeriaHttpClientAttributesGetter
20-
implements HttpClientAttributesGetter<ClientRequestContext, RequestLog> {
20+
implements HttpClientAttributesGetter<RequestContext, RequestLog> {
2121
INSTANCE;
2222

2323
private static final ClassValue<Method> authorityMethodCache =
@@ -34,12 +34,12 @@ protected Method computeValue(Class<?> type) {
3434
};
3535

3636
@Override
37-
public String getHttpRequestMethod(ClientRequestContext ctx) {
37+
public String getHttpRequestMethod(RequestContext ctx) {
3838
return ctx.method().name();
3939
}
4040

4141
@Override
42-
public String getUrlFull(ClientRequestContext ctx) {
42+
public String getUrlFull(RequestContext ctx) {
4343
HttpRequest request = request(ctx);
4444
StringBuilder uri = new StringBuilder();
4545
String scheme = request.scheme();
@@ -61,14 +61,14 @@ public String getUrlFull(ClientRequestContext ctx) {
6161
}
6262

6363
@Override
64-
public List<String> getHttpRequestHeader(ClientRequestContext ctx, String name) {
64+
public List<String> getHttpRequestHeader(RequestContext ctx, String name) {
6565
return request(ctx).headers().getAll(name);
6666
}
6767

6868
@Override
6969
@Nullable
7070
public Integer getHttpResponseStatusCode(
71-
ClientRequestContext ctx, RequestLog requestLog, @Nullable Throwable error) {
71+
RequestContext ctx, RequestLog requestLog, @Nullable Throwable error) {
7272
HttpStatus status = requestLog.responseHeaders().status();
7373
if (!status.equals(HttpStatus.UNKNOWN)) {
7474
return status.code();
@@ -78,26 +78,25 @@ public Integer getHttpResponseStatusCode(
7878

7979
@Override
8080
public List<String> getHttpResponseHeader(
81-
ClientRequestContext ctx, RequestLog requestLog, String name) {
81+
RequestContext ctx, RequestLog requestLog, String name) {
8282
return requestLog.responseHeaders().getAll(name);
8383
}
8484

8585
@Override
86-
public String getNetworkProtocolName(ClientRequestContext ctx, @Nullable RequestLog requestLog) {
86+
public String getNetworkProtocolName(RequestContext ctx, @Nullable RequestLog requestLog) {
8787
return "http";
8888
}
8989

9090
@Override
91-
public String getNetworkProtocolVersion(
92-
ClientRequestContext ctx, @Nullable RequestLog requestLog) {
91+
public String getNetworkProtocolVersion(RequestContext ctx, @Nullable RequestLog requestLog) {
9392
SessionProtocol protocol =
9493
requestLog != null ? requestLog.sessionProtocol() : ctx.sessionProtocol();
9594
return protocol.isMultiplex() ? "2" : "1.1";
9695
}
9796

9897
@Nullable
9998
@Override
100-
public String getServerAddress(ClientRequestContext ctx) {
99+
public String getServerAddress(RequestContext ctx) {
101100
String authority = authority(ctx);
102101
if (authority == null) {
103102
return null;
@@ -108,7 +107,7 @@ public String getServerAddress(ClientRequestContext ctx) {
108107

109108
@Nullable
110109
@Override
111-
public Integer getServerPort(ClientRequestContext ctx) {
110+
public Integer getServerPort(RequestContext ctx) {
112111
String authority = authority(ctx);
113112
if (authority == null) {
114113
return null;
@@ -127,12 +126,12 @@ public Integer getServerPort(ClientRequestContext ctx) {
127126
@Override
128127
@Nullable
129128
public InetSocketAddress getNetworkPeerInetSocketAddress(
130-
ClientRequestContext ctx, @Nullable RequestLog requestLog) {
129+
RequestContext ctx, @Nullable RequestLog requestLog) {
131130
return RequestContextAccess.remoteAddress(ctx);
132131
}
133132

134133
@Nullable
135-
private static String authority(ClientRequestContext ctx) {
134+
private static String authority(RequestContext ctx) {
136135
// newer armeria versions expose authority through DefaultClientRequestContext#authority
137136
// we are using this method as it provides default values based on endpoint
138137
// in older versions armeria wraps the request, and we can get the same default values through
@@ -150,7 +149,7 @@ private static String authority(ClientRequestContext ctx) {
150149
return request.authority();
151150
}
152151

153-
private static HttpRequest request(ClientRequestContext ctx) {
152+
private static HttpRequest request(RequestContext ctx) {
154153
HttpRequest request = ctx.request();
155154
if (request == null) {
156155
throw new IllegalStateException(

instrumentation/armeria/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/internal/ArmeriaInstrumenterBuilderFactory.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import io.opentelemetry.api.OpenTelemetry;
1212
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
1313
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
14+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
15+
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter;
1416

1517
/**
1618
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
@@ -21,17 +23,23 @@ private ArmeriaInstrumenterBuilderFactory() {}
2123

2224
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.armeria-1.3";
2325

26+
@SuppressWarnings({"unchecked", "rawtypes"})
2427
public static DefaultHttpServerInstrumenterBuilder<ServiceRequestContext, RequestLog>
2528
getServerBuilder(OpenTelemetry openTelemetry) {
26-
return new DefaultHttpServerInstrumenterBuilder<>(
27-
INSTRUMENTATION_NAME, openTelemetry, ArmeriaHttpServerAttributesGetter.INSTANCE)
29+
return new DefaultHttpServerInstrumenterBuilder<ServiceRequestContext, RequestLog>(
30+
INSTRUMENTATION_NAME,
31+
openTelemetry,
32+
(HttpServerAttributesGetter) ArmeriaHttpServerAttributesGetter.INSTANCE)
2833
.setHeaderGetter(RequestContextGetter.INSTANCE);
2934
}
3035

36+
@SuppressWarnings({"unchecked", "rawtypes"})
3137
public static DefaultHttpClientInstrumenterBuilder<ClientRequestContext, RequestLog>
3238
getClientBuilder(OpenTelemetry openTelemetry) {
33-
return new DefaultHttpClientInstrumenterBuilder<>(
34-
INSTRUMENTATION_NAME, openTelemetry, ArmeriaHttpClientAttributesGetter.INSTANCE)
39+
return new DefaultHttpClientInstrumenterBuilder<ClientRequestContext, RequestLog>(
40+
INSTRUMENTATION_NAME,
41+
openTelemetry,
42+
(HttpClientAttributesGetter) ArmeriaHttpClientAttributesGetter.INSTANCE)
3543
.setHeaderSetter(ClientRequestContextSetter.INSTANCE);
3644
}
3745
}

0 commit comments

Comments
 (0)