1212import com .linecorp .armeria .server .ServiceRequestContext ;
1313import io .opentelemetry .api .OpenTelemetry ;
1414import 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 ;
1817import io .opentelemetry .instrumentation .api .instrumenter .AttributesExtractor ;
19- import io .opentelemetry .instrumentation .api .instrumenter .Instrumenter ;
20- import io .opentelemetry .instrumentation .api .instrumenter .InstrumenterBuilder ;
2118import io .opentelemetry .instrumentation .api .instrumenter .SpanNameExtractor ;
2219import io .opentelemetry .instrumentation .api .instrumenter .SpanStatusExtractor ;
23- import io .opentelemetry .instrumentation .api .semconv .http .HttpClientAttributesExtractor ;
2420import 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 ;
2722import 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 ;
3424import io .opentelemetry .instrumentation .armeria .v1_3 .internal .ArmeriaHttpClientAttributesGetter ;
35- import java .util .ArrayList ;
3625import java .util .List ;
26+ import java .util .Optional ;
3727import java .util .Set ;
3828import java .util .function .Function ;
39- import java .util .stream .Stream ;
4029import javax .annotation .Nullable ;
4130
4231public 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