Skip to content

Commit 2ec5484

Browse files
committed
armeria and ratpack
1 parent e6ecf22 commit 2ec5484

File tree

4 files changed

+100
-223
lines changed

4 files changed

+100
-223
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1919
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
2020
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
21+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
2122
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor;
2223
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
2324
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
@@ -45,6 +46,10 @@ public final class DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> {
4546

4647
private final List<AttributesExtractor<? super REQUEST, ? super RESPONSE>> additionalExtractors =
4748
new ArrayList<>();
49+
private Function<
50+
SpanStatusExtractor<? super REQUEST, ? super RESPONSE>,
51+
? extends SpanStatusExtractor<? super REQUEST, ? super RESPONSE>>
52+
statusExtractorTransformer = Function.identity();
4853
private final HttpClientAttributesExtractorBuilder<REQUEST, RESPONSE>
4954
httpAttributesExtractorBuilder;
5055
private final HttpClientAttributesGetter<REQUEST, RESPONSE> attributesGetter;
@@ -78,6 +83,16 @@ public DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> addAttributeExtra
7883
return this;
7984
}
8085

86+
@CanIgnoreReturnValue
87+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setStatusExtractor(
88+
Function<
89+
SpanStatusExtractor<? super REQUEST, ? super RESPONSE>,
90+
? extends SpanStatusExtractor<? super REQUEST, ? super RESPONSE>>
91+
statusExtractor) {
92+
this.statusExtractorTransformer = statusExtractor;
93+
return this;
94+
}
95+
8196
/**
8297
* Configures the HTTP request headers that will be captured as span attributes.
8398
*
@@ -175,7 +190,7 @@ public Instrumenter<REQUEST, RESPONSE> build() {
175190
InstrumenterBuilder<REQUEST, RESPONSE> builder =
176191
Instrumenter.<REQUEST, RESPONSE>builder(
177192
openTelemetry, instrumentationName, spanNameExtractor)
178-
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(attributesGetter))
193+
.setSpanStatusExtractor(statusExtractorTransformer.apply(HttpSpanStatusExtractor.create(attributesGetter)))
179194
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
180195
.addAttributesExtractors(additionalExtractors)
181196
.addOperationMetrics(HttpClientMetrics.get());

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1616
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
1717
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
18+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1819
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
1920
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
2021
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter;
@@ -42,6 +43,10 @@ public final class DefaultHttpServerTelemetryBuilder<REQUEST, RESPONSE> {
4243

4344
private final List<AttributesExtractor<REQUEST, RESPONSE>> additionalExtractors =
4445
new ArrayList<>();
46+
private Function<
47+
SpanStatusExtractor<? super REQUEST, ? super RESPONSE>,
48+
? extends SpanStatusExtractor<? super REQUEST, ? super RESPONSE>>
49+
statusExtractorTransformer = Function.identity();
4550
private final HttpServerAttributesExtractorBuilder<REQUEST, RESPONSE>
4651
httpAttributesExtractorBuilder;
4752
private final HttpSpanNameExtractorBuilder<REQUEST> httpSpanNameExtractorBuilder;
@@ -75,6 +80,16 @@ public DefaultHttpServerTelemetryBuilder<REQUEST, RESPONSE> addAttributesExtract
7580
return this;
7681
}
7782

83+
@CanIgnoreReturnValue
84+
public DefaultHttpServerTelemetryBuilder<REQUEST, RESPONSE> setStatusExtractor(
85+
Function<
86+
SpanStatusExtractor<? super REQUEST, ? super RESPONSE>,
87+
? extends SpanStatusExtractor<? super REQUEST, ? super RESPONSE>>
88+
statusExtractor) {
89+
this.statusExtractorTransformer = statusExtractor;
90+
return this;
91+
}
92+
7893
/**
7994
* Configures the HTTP request headers that will be captured as span attributes.
8095
*
@@ -164,7 +179,7 @@ public InstrumenterBuilder<REQUEST, RESPONSE> instrumenterBuilder(
164179
InstrumenterBuilder<REQUEST, RESPONSE> builder =
165180
Instrumenter.<REQUEST, RESPONSE>builder(
166181
openTelemetry, instrumentationName, spanNameExtractor)
167-
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(attributesGetter))
182+
.setSpanStatusExtractor(statusExtractorTransformer.apply(HttpSpanStatusExtractor.create(attributesGetter)))
168183
.addAttributesExtractor(httpAttributesExtractorBuilder.build())
169184
.addAttributesExtractors(additionalExtractors)
170185
.addContextCustomizer(httpServerRouteBuilder.build())

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

Lines changed: 42 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,20 @@
1212
import com.linecorp.armeria.server.ServiceRequestContext;
1313
import io.opentelemetry.api.OpenTelemetry;
1414
import io.opentelemetry.api.common.AttributeKey;
15-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics;
16-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
17-
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics;
15+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientTelemetryBuilder;
16+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerTelemetryBuilder;
1817
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
19-
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
20-
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
2118
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
2219
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
23-
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor;
2420
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
25-
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics;
26-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
21+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
2722
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
28-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
29-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
30-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder;
31-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
32-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder;
33-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
23+
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter;
3424
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaHttpClientAttributesGetter;
35-
import java.util.ArrayList;
3625
import java.util.List;
26+
import java.util.Optional;
3727
import java.util.Set;
3828
import java.util.function.Function;
39-
import java.util.stream.Stream;
4029
import javax.annotation.Nullable;
4130

4231
public final class ArmeriaTelemetryBuilder {
@@ -45,64 +34,42 @@ public final class ArmeriaTelemetryBuilder {
4534
// copied from PeerIncubatingAttributes
4635
private static final AttributeKey<String> PEER_SERVICE = AttributeKey.stringKey("peer.service");
4736

48-
private final OpenTelemetry openTelemetry;
4937
@Nullable private String peerService;
50-
private boolean emitExperimentalHttpClientMetrics = false;
51-
private boolean emitExperimentalHttpServerMetrics = false;
52-
53-
private final List<AttributesExtractor<? super RequestContext, ? super RequestLog>>
54-
additionalExtractors = new ArrayList<>();
55-
private final List<AttributesExtractor<? super ClientRequestContext, ? super RequestLog>>
56-
additionalClientExtractors = new ArrayList<>();
57-
58-
private final HttpClientAttributesExtractorBuilder<RequestContext, RequestLog>
59-
httpClientAttributesExtractorBuilder =
60-
HttpClientAttributesExtractor.builder(ArmeriaHttpClientAttributesGetter.INSTANCE);
61-
private final HttpServerAttributesExtractorBuilder<RequestContext, RequestLog>
62-
httpServerAttributesExtractorBuilder =
63-
HttpServerAttributesExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE);
64-
65-
private final HttpSpanNameExtractorBuilder<RequestContext> httpClientSpanNameExtractorBuilder =
66-
HttpSpanNameExtractor.builder(ArmeriaHttpClientAttributesGetter.INSTANCE);
67-
private final HttpSpanNameExtractorBuilder<RequestContext> httpServerSpanNameExtractorBuilder =
68-
HttpSpanNameExtractor.builder(ArmeriaHttpServerAttributesGetter.INSTANCE);
69-
private Function<
70-
SpanNameExtractor<RequestContext>, ? extends SpanNameExtractor<? super RequestContext>>
71-
clientSpanNameExtractorTransformer = Function.identity();
72-
private Function<
73-
SpanNameExtractor<RequestContext>, ? extends SpanNameExtractor<? super RequestContext>>
74-
serverSpanNameExtractorTransformer = Function.identity();
75-
76-
private final HttpServerRouteBuilder<RequestContext> httpServerRouteBuilder =
77-
HttpServerRoute.builder(ArmeriaHttpServerAttributesGetter.INSTANCE);
78-
79-
private Function<
80-
SpanStatusExtractor<RequestContext, RequestLog>,
81-
? extends SpanStatusExtractor<? super RequestContext, ? super RequestLog>>
82-
statusExtractorTransformer = Function.identity();
38+
private final DefaultHttpClientTelemetryBuilder<ClientRequestContext, RequestLog> builder;
39+
private final DefaultHttpServerTelemetryBuilder<ServiceRequestContext, RequestLog> serverBuilder;
8340

41+
@SuppressWarnings({"rawtypes", "unchecked"})
8442
ArmeriaTelemetryBuilder(OpenTelemetry openTelemetry) {
85-
this.openTelemetry = openTelemetry;
43+
builder = new DefaultHttpClientTelemetryBuilder<>(INSTRUMENTATION_NAME,
44+
openTelemetry,
45+
(HttpClientAttributesGetter)ArmeriaHttpClientAttributesGetter.INSTANCE,
46+
Optional.of(ClientRequestContextSetter.INSTANCE));
47+
serverBuilder = new DefaultHttpServerTelemetryBuilder<>(INSTRUMENTATION_NAME, openTelemetry,
48+
(HttpServerAttributesGetter)ArmeriaHttpServerAttributesGetter.INSTANCE, Optional.of(RequestContextGetter.INSTANCE));
8649
}
8750

51+
@SuppressWarnings({"unchecked", "rawtypes"})
8852
@CanIgnoreReturnValue
8953
public ArmeriaTelemetryBuilder setStatusExtractor(
9054
Function<
9155
SpanStatusExtractor<RequestContext, RequestLog>,
9256
? extends SpanStatusExtractor<? super RequestContext, ? super RequestLog>>
9357
statusExtractor) {
94-
this.statusExtractorTransformer = statusExtractor;
58+
builder.setStatusExtractor((Function)statusExtractor);
59+
serverBuilder.setStatusExtractor((Function)statusExtractor);
9560
return this;
9661
}
9762

9863
/**
9964
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
10065
* items. The {@link AttributesExtractor} will be executed after all default extractors.
10166
*/
67+
@SuppressWarnings({"unchecked", "rawtypes"})
10268
@CanIgnoreReturnValue
10369
public ArmeriaTelemetryBuilder addAttributeExtractor(
10470
AttributesExtractor<? super RequestContext, ? super RequestLog> attributesExtractor) {
105-
additionalExtractors.add(attributesExtractor);
71+
builder.addAttributeExtractor(attributesExtractor);
72+
serverBuilder.addAttributesExtractor((AttributesExtractor)attributesExtractor);
10673
return this;
10774
}
10875

@@ -114,7 +81,7 @@ public ArmeriaTelemetryBuilder addAttributeExtractor(
11481
@CanIgnoreReturnValue
11582
public ArmeriaTelemetryBuilder addClientAttributeExtractor(
11683
AttributesExtractor<? super ClientRequestContext, ? super RequestLog> attributesExtractor) {
117-
additionalClientExtractors.add(attributesExtractor);
84+
builder.addAttributeExtractor(attributesExtractor);
11885
return this;
11986
}
12087

@@ -132,7 +99,7 @@ public ArmeriaTelemetryBuilder setPeerService(String peerService) {
13299
*/
133100
@CanIgnoreReturnValue
134101
public ArmeriaTelemetryBuilder setCapturedClientRequestHeaders(List<String> requestHeaders) {
135-
httpClientAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
102+
builder.setCapturedRequestHeaders(requestHeaders);
136103
return this;
137104
}
138105

@@ -143,7 +110,7 @@ public ArmeriaTelemetryBuilder setCapturedClientRequestHeaders(List<String> requ
143110
*/
144111
@CanIgnoreReturnValue
145112
public ArmeriaTelemetryBuilder setCapturedClientResponseHeaders(List<String> responseHeaders) {
146-
httpClientAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
113+
builder.setCapturedResponseHeaders(responseHeaders);
147114
return this;
148115
}
149116

@@ -154,7 +121,7 @@ public ArmeriaTelemetryBuilder setCapturedClientResponseHeaders(List<String> res
154121
*/
155122
@CanIgnoreReturnValue
156123
public ArmeriaTelemetryBuilder setCapturedServerRequestHeaders(List<String> requestHeaders) {
157-
httpServerAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
124+
serverBuilder.setCapturedRequestHeaders(requestHeaders);
158125
return this;
159126
}
160127

@@ -165,7 +132,7 @@ public ArmeriaTelemetryBuilder setCapturedServerRequestHeaders(List<String> requ
165132
*/
166133
@CanIgnoreReturnValue
167134
public ArmeriaTelemetryBuilder setCapturedServerResponseHeaders(List<String> responseHeaders) {
168-
httpServerAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
135+
serverBuilder.setCapturedResponseHeaders(responseHeaders);
169136
return this;
170137
}
171138

@@ -185,11 +152,8 @@ public ArmeriaTelemetryBuilder setCapturedServerResponseHeaders(List<String> res
185152
*/
186153
@CanIgnoreReturnValue
187154
public ArmeriaTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
188-
httpClientAttributesExtractorBuilder.setKnownMethods(knownMethods);
189-
httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods);
190-
httpClientSpanNameExtractorBuilder.setKnownMethods(knownMethods);
191-
httpServerSpanNameExtractorBuilder.setKnownMethods(knownMethods);
192-
httpServerRouteBuilder.setKnownMethods(knownMethods);
155+
builder.setKnownMethods(knownMethods);
156+
serverBuilder.setKnownMethods(knownMethods);
193157
return this;
194158
}
195159

@@ -202,7 +166,8 @@ public ArmeriaTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
202166
@CanIgnoreReturnValue
203167
public ArmeriaTelemetryBuilder setEmitExperimentalHttpClientMetrics(
204168
boolean emitExperimentalHttpClientMetrics) {
205-
this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics;
169+
builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
170+
serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpClientMetrics);
206171
return this;
207172
}
208173

@@ -215,85 +180,43 @@ public ArmeriaTelemetryBuilder setEmitExperimentalHttpClientMetrics(
215180
@CanIgnoreReturnValue
216181
public ArmeriaTelemetryBuilder setEmitExperimentalHttpServerMetrics(
217182
boolean emitExperimentalHttpServerMetrics) {
218-
this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics;
183+
builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpServerMetrics);
184+
serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics);
219185
return this;
220186
}
221187

222188
/** Sets custom client {@link SpanNameExtractor} via transform function. */
189+
@SuppressWarnings({"rawtypes", "unchecked"})
223190
@CanIgnoreReturnValue
224191
public ArmeriaTelemetryBuilder setClientSpanNameExtractor(
225192
Function<
226193
SpanNameExtractor<RequestContext>,
227194
? extends SpanNameExtractor<? super RequestContext>>
228195
clientSpanNameExtractor) {
229-
this.clientSpanNameExtractorTransformer = clientSpanNameExtractor;
196+
builder.setSpanNameExtractor((Function)clientSpanNameExtractor);
230197
return this;
231198
}
232199

233200
/** Sets custom server {@link SpanNameExtractor} via transform function. */
201+
@SuppressWarnings({"rawtypes", "unchecked"})
234202
@CanIgnoreReturnValue
235203
public ArmeriaTelemetryBuilder setServerSpanNameExtractor(
236204
Function<
237205
SpanNameExtractor<RequestContext>,
238206
? extends SpanNameExtractor<? super RequestContext>>
239207
serverSpanNameExtractor) {
240-
this.serverSpanNameExtractorTransformer = serverSpanNameExtractor;
208+
serverBuilder.setSpanNameExtractor((Function)serverSpanNameExtractor);
241209
return this;
242210
}
243211

244212
public ArmeriaTelemetry build() {
245-
ArmeriaHttpClientAttributesGetter clientAttributesGetter =
246-
ArmeriaHttpClientAttributesGetter.INSTANCE;
247-
ArmeriaHttpServerAttributesGetter serverAttributesGetter =
248-
ArmeriaHttpServerAttributesGetter.INSTANCE;
249-
250-
SpanNameExtractor<? super RequestContext> clientSpanNameExtractor =
251-
clientSpanNameExtractorTransformer.apply(httpClientSpanNameExtractorBuilder.build());
252-
SpanNameExtractor<? super RequestContext> serverSpanNameExtractor =
253-
serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build());
254-
255-
InstrumenterBuilder<ClientRequestContext, RequestLog> clientInstrumenterBuilder =
256-
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, clientSpanNameExtractor);
257-
InstrumenterBuilder<ServiceRequestContext, RequestLog> serverInstrumenterBuilder =
258-
Instrumenter.builder(openTelemetry, INSTRUMENTATION_NAME, serverSpanNameExtractor);
259-
260-
Stream.of(clientInstrumenterBuilder, serverInstrumenterBuilder)
261-
.forEach(instrumenter -> instrumenter.addAttributesExtractors(additionalExtractors));
262-
263-
clientInstrumenterBuilder
264-
.setSpanStatusExtractor(
265-
statusExtractorTransformer.apply(
266-
HttpSpanStatusExtractor.create(clientAttributesGetter)))
267-
.addAttributesExtractor(httpClientAttributesExtractorBuilder.build())
268-
.addAttributesExtractors(additionalClientExtractors)
269-
.addOperationMetrics(HttpClientMetrics.get());
270-
serverInstrumenterBuilder
271-
.setSpanStatusExtractor(
272-
statusExtractorTransformer.apply(
273-
HttpSpanStatusExtractor.create(serverAttributesGetter)))
274-
.addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
275-
.addOperationMetrics(HttpServerMetrics.get())
276-
.addContextCustomizer(httpServerRouteBuilder.build());
277-
278-
if (peerService != null) {
279-
clientInstrumenterBuilder.addAttributesExtractor(
280-
AttributesExtractor.constant(PEER_SERVICE, peerService));
281-
}
282-
if (emitExperimentalHttpClientMetrics) {
283-
clientInstrumenterBuilder
284-
.addAttributesExtractor(
285-
HttpExperimentalAttributesExtractor.create(clientAttributesGetter))
286-
.addOperationMetrics(HttpClientExperimentalMetrics.get());
287-
}
288-
if (emitExperimentalHttpServerMetrics) {
289-
serverInstrumenterBuilder
290-
.addAttributesExtractor(
291-
HttpExperimentalAttributesExtractor.create(serverAttributesGetter))
292-
.addOperationMetrics(HttpServerExperimentalMetrics.get());
293-
}
294-
295213
return new ArmeriaTelemetry(
296-
clientInstrumenterBuilder.buildClientInstrumenter(ClientRequestContextSetter.INSTANCE),
297-
serverInstrumenterBuilder.buildServerInstrumenter(RequestContextGetter.INSTANCE));
214+
builder.instrumenter(clientInstrumenterBuilder -> {
215+
if (peerService != null) {
216+
clientInstrumenterBuilder.addAttributesExtractor(
217+
AttributesExtractor.constant(PEER_SERVICE, peerService));
218+
}
219+
}),
220+
serverBuilder.instrumenter());
298221
}
299222
}

0 commit comments

Comments
 (0)