Skip to content

Commit 0bab846

Browse files
committed
Introduce common telemetry builder interfaces
1 parent 7795dec commit 0bab846

File tree

22 files changed

+479
-20
lines changed

22 files changed

+479
-20
lines changed
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,23 @@
11
Comparing source compatibility of opentelemetry-instrumentation-api-2.11.0-SNAPSHOT.jar against opentelemetry-instrumentation-api-2.10.0.jar
2-
No changes.
2+
+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder (not serializable)
3+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
4+
GENERIC TEMPLATES: +++ REQUEST:java.lang.Object, +++ RESPONSE:java.lang.Object
5+
+++ NEW SUPERCLASS: java.lang.Object
6+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder<REQUEST,RESPONSE> addAttributesExtractor(io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor<REQUEST,RESPONSE>)
7+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.Object build()
8+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder<REQUEST,RESPONSE> setCapturedRequestHeaders(java.util.List<java.lang.String>)
9+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder<REQUEST,RESPONSE> setCapturedResponseHeaders(java.util.List<java.lang.String>)
10+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder<REQUEST,RESPONSE> setKnownMethods(java.util.Set<java.lang.String>)
11+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder<REQUEST,RESPONSE> setSpanNameExtractor(java.util.function.Function<io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor<REQUEST>,io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor<REQUEST>>)
12+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder<REQUEST,RESPONSE> setStatusExtractor(java.util.function.Function<io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor<REQUEST,RESPONSE>,io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor<REQUEST,RESPONSE>>)
13+
+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder (not serializable)
14+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
15+
GENERIC TEMPLATES: +++ REQUEST:java.lang.Object, +++ RESPONSE:java.lang.Object
16+
+++ NEW SUPERCLASS: java.lang.Object
17+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder<REQUEST,RESPONSE> addAttributesExtractor(io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor<REQUEST,RESPONSE>)
18+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.Object build()
19+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder<REQUEST,RESPONSE> setCapturedRequestHeaders(java.util.List<java.lang.String>)
20+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder<REQUEST,RESPONSE> setCapturedResponseHeaders(java.util.List<java.lang.String>)
21+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder<REQUEST,RESPONSE> setKnownMethods(java.util.Set<java.lang.String>)
22+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder<REQUEST,RESPONSE> setSpanNameExtractor(java.util.function.Function<io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor<REQUEST>,io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor<REQUEST>>)
23+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.api.semconv.http.HttpServerTelemetryBuilder<REQUEST,RESPONSE> setStatusExtractor(java.util.function.Function<io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor<REQUEST,RESPONSE>,io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor<REQUEST,RESPONSE>>)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.semconv.http;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
10+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
11+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
12+
import java.util.List;
13+
import java.util.Set;
14+
import java.util.function.Function;
15+
16+
public interface HttpClientTelemetryBuilder<REQUEST, RESPONSE> {
17+
18+
@CanIgnoreReturnValue
19+
HttpClientTelemetryBuilder<REQUEST, RESPONSE> addAttributesExtractor(
20+
AttributesExtractor<REQUEST, RESPONSE> attributesExtractor);
21+
22+
@CanIgnoreReturnValue
23+
HttpClientTelemetryBuilder<REQUEST, RESPONSE> setCapturedRequestHeaders(
24+
List<String> requestHeaders);
25+
26+
@CanIgnoreReturnValue
27+
HttpClientTelemetryBuilder<REQUEST, RESPONSE> setCapturedResponseHeaders(
28+
List<String> responseHeaders);
29+
30+
@CanIgnoreReturnValue
31+
HttpClientTelemetryBuilder<REQUEST, RESPONSE> setKnownMethods(Set<String> knownMethods);
32+
33+
@CanIgnoreReturnValue
34+
HttpClientTelemetryBuilder<REQUEST, RESPONSE> setSpanNameExtractor(
35+
Function<SpanNameExtractor<REQUEST>, SpanNameExtractor<REQUEST>>
36+
spanNameExtractorTransformer);
37+
38+
@CanIgnoreReturnValue
39+
HttpClientTelemetryBuilder<REQUEST, RESPONSE> setStatusExtractor(
40+
Function<SpanStatusExtractor<REQUEST, RESPONSE>, SpanStatusExtractor<REQUEST, RESPONSE>>
41+
statusExtractorTransformer);
42+
43+
Object build();
44+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.semconv.http;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
10+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
11+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
12+
import java.util.List;
13+
import java.util.Set;
14+
import java.util.function.Function;
15+
16+
public interface HttpServerTelemetryBuilder<REQUEST, RESPONSE> {
17+
18+
@CanIgnoreReturnValue
19+
HttpServerTelemetryBuilder<REQUEST, RESPONSE> addAttributesExtractor(
20+
AttributesExtractor<REQUEST, RESPONSE> attributesExtractor);
21+
22+
@CanIgnoreReturnValue
23+
HttpServerTelemetryBuilder<REQUEST, RESPONSE> setCapturedRequestHeaders(
24+
List<String> requestHeaders);
25+
26+
@CanIgnoreReturnValue
27+
HttpServerTelemetryBuilder<REQUEST, RESPONSE> setCapturedResponseHeaders(
28+
List<String> responseHeaders);
29+
30+
@CanIgnoreReturnValue
31+
HttpServerTelemetryBuilder<REQUEST, RESPONSE> setKnownMethods(Set<String> knownMethods);
32+
33+
@CanIgnoreReturnValue
34+
HttpServerTelemetryBuilder<REQUEST, RESPONSE> setSpanNameExtractor(
35+
Function<SpanNameExtractor<REQUEST>, SpanNameExtractor<REQUEST>>
36+
spanNameExtractorTransformer);
37+
38+
@CanIgnoreReturnValue
39+
HttpServerTelemetryBuilder<REQUEST, RESPONSE> setStatusExtractor(
40+
Function<SpanStatusExtractor<REQUEST, RESPONSE>, SpanStatusExtractor<REQUEST, RESPONSE>>
41+
statusExtractorTransformer);
42+
43+
Object build();
44+
}

instrumentation/apache-httpclient/apache-httpclient-4.3/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v4_3/ApacheHttpClientTelemetryBuilder.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
1212
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1313
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
14+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1415
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
16+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder;
1517
import java.util.List;
1618
import java.util.Set;
1719
import java.util.function.Function;
1820
import org.apache.http.HttpResponse;
1921

2022
/** A builder for {@link ApacheHttpClientTelemetry}. */
21-
public final class ApacheHttpClientTelemetryBuilder {
23+
public final class ApacheHttpClientTelemetryBuilder
24+
implements HttpClientTelemetryBuilder<ApacheHttpClientRequest, HttpResponse> {
2225

2326
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-4.3";
2427
private final DefaultHttpClientInstrumenterBuilder<ApacheHttpClientRequest, HttpResponse> builder;
@@ -50,6 +53,7 @@ public ApacheHttpClientTelemetryBuilder addAttributeExtractor(
5053
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
5154
* items. The {@link AttributesExtractor} will be executed after all default extractors.
5255
*/
56+
@Override
5357
@CanIgnoreReturnValue
5458
public ApacheHttpClientTelemetryBuilder addAttributesExtractor(
5559
AttributesExtractor<ApacheHttpClientRequest, HttpResponse> attributesExtractor) {
@@ -62,6 +66,7 @@ public ApacheHttpClientTelemetryBuilder addAttributesExtractor(
6266
*
6367
* @param requestHeaders A list of HTTP header names.
6468
*/
69+
@Override
6570
@CanIgnoreReturnValue
6671
public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
6772
builder.setCapturedRequestHeaders(requestHeaders);
@@ -73,6 +78,7 @@ public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List<String> r
7378
*
7479
* @param responseHeaders A list of HTTP header names.
7580
*/
81+
@Override
7682
@CanIgnoreReturnValue
7783
public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
7884
builder.setCapturedResponseHeaders(responseHeaders);
@@ -92,6 +98,7 @@ public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List<String>
9298
* @param knownMethods A set of recognized HTTP request methods.
9399
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
94100
*/
101+
@Override
95102
@CanIgnoreReturnValue
96103
public ApacheHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
97104
builder.setKnownMethods(knownMethods);
@@ -116,6 +123,7 @@ public ApacheHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics(
116123
}
117124

118125
/** Sets custom {@link SpanNameExtractor} via transform function. */
126+
@Override
119127
@CanIgnoreReturnValue
120128
public ApacheHttpClientTelemetryBuilder setSpanNameExtractor(
121129
Function<
@@ -126,10 +134,21 @@ public ApacheHttpClientTelemetryBuilder setSpanNameExtractor(
126134
return this;
127135
}
128136

137+
@Override
138+
public ApacheHttpClientTelemetryBuilder setStatusExtractor(
139+
Function<
140+
SpanStatusExtractor<ApacheHttpClientRequest, HttpResponse>,
141+
SpanStatusExtractor<ApacheHttpClientRequest, HttpResponse>>
142+
statusExtractorTransformer) {
143+
builder.setStatusExtractor(statusExtractorTransformer);
144+
return this;
145+
}
146+
129147
/**
130148
* Returns a new {@link ApacheHttpClientTelemetry} configured with this {@link
131149
* ApacheHttpClientTelemetryBuilder}.
132150
*/
151+
@Override
133152
public ApacheHttpClientTelemetry build() {
134153
return new ApacheHttpClientTelemetry(builder.build(), openTelemetry.getPropagators());
135154
}

instrumentation/apache-httpclient/apache-httpclient-5.2/library/src/main/java/io/opentelemetry/instrumentation/apachehttpclient/v5_2/ApacheHttpClientTelemetryBuilder.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
1212
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1313
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
14+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1415
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
16+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder;
1517
import java.util.List;
1618
import java.util.Set;
1719
import java.util.function.Function;
1820
import org.apache.hc.core5.http.HttpResponse;
1921

2022
/** A builder for {@link ApacheHttpClientTelemetry}. */
21-
public final class ApacheHttpClientTelemetryBuilder {
23+
public final class ApacheHttpClientTelemetryBuilder
24+
implements HttpClientTelemetryBuilder<ApacheHttpClientRequest, HttpResponse> {
2225

2326
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-5.2";
2427
private final DefaultHttpClientInstrumenterBuilder<ApacheHttpClientRequest, HttpResponse> builder;
@@ -35,6 +38,7 @@ public final class ApacheHttpClientTelemetryBuilder {
3538
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
3639
* items. The {@link AttributesExtractor} will be executed after all default extractors.
3740
*/
41+
@Override
3842
@CanIgnoreReturnValue
3943
public ApacheHttpClientTelemetryBuilder addAttributesExtractor(
4044
AttributesExtractor<ApacheHttpClientRequest, HttpResponse> attributesExtractor) {
@@ -47,6 +51,7 @@ public ApacheHttpClientTelemetryBuilder addAttributesExtractor(
4751
*
4852
* @param requestHeaders A list of HTTP header names.
4953
*/
54+
@Override
5055
@CanIgnoreReturnValue
5156
public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
5257
builder.setCapturedRequestHeaders(requestHeaders);
@@ -58,6 +63,7 @@ public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List<String> r
5863
*
5964
* @param responseHeaders A list of HTTP header names.
6065
*/
66+
@Override
6167
@CanIgnoreReturnValue
6268
public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
6369
builder.setCapturedResponseHeaders(responseHeaders);
@@ -77,13 +83,15 @@ public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List<String>
7783
* @param knownMethods A set of recognized HTTP request methods.
7884
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
7985
*/
86+
@Override
8087
@CanIgnoreReturnValue
8188
public ApacheHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
8289
builder.setKnownMethods(knownMethods);
8390
return this;
8491
}
8592

8693
/** Sets custom {@link SpanNameExtractor} via transform function. */
94+
@Override
8795
@CanIgnoreReturnValue
8896
public ApacheHttpClientTelemetryBuilder setSpanNameExtractor(
8997
Function<
@@ -94,6 +102,16 @@ public ApacheHttpClientTelemetryBuilder setSpanNameExtractor(
94102
return this;
95103
}
96104

105+
@Override
106+
public ApacheHttpClientTelemetryBuilder setStatusExtractor(
107+
Function<
108+
SpanStatusExtractor<ApacheHttpClientRequest, HttpResponse>,
109+
SpanStatusExtractor<ApacheHttpClientRequest, HttpResponse>>
110+
spanNameExtractorTransformer) {
111+
builder.setStatusExtractor(spanNameExtractorTransformer);
112+
return this;
113+
}
114+
97115
/**
98116
* Can be used via the unstable method {@link
99117
* Experimental#setEmitExperimentalTelemetry(ApacheHttpClientTelemetryBuilder, boolean)}.
@@ -106,6 +124,7 @@ void setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetr
106124
* Returns a new {@link ApacheHttpClientTelemetry} configured with this {@link
107125
* ApacheHttpClientTelemetryBuilder}.
108126
*/
127+
@Override
109128
public ApacheHttpClientTelemetry build() {
110129
return new ApacheHttpClientTelemetry(builder.build(), openTelemetry.getPropagators());
111130
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@
1414
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1515
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
1616
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
17+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientTelemetryBuilder;
1718
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderFactory;
1819
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderUtil;
1920
import io.opentelemetry.instrumentation.armeria.v1_3.internal.Experimental;
2021
import java.util.List;
2122
import java.util.Set;
2223
import java.util.function.Function;
2324

24-
public final class ArmeriaClientTelemetryBuilder {
25+
public final class ArmeriaClientTelemetryBuilder
26+
implements HttpClientTelemetryBuilder<ClientRequestContext, RequestLog> {
2527

2628
private final DefaultHttpClientInstrumenterBuilder<ClientRequestContext, RequestLog> builder;
2729

@@ -34,6 +36,7 @@ public final class ArmeriaClientTelemetryBuilder {
3436
}
3537

3638
/** Sets the status extractor for client spans. */
39+
@Override
3740
@CanIgnoreReturnValue
3841
public ArmeriaClientTelemetryBuilder setStatusExtractor(
3942
Function<
@@ -48,6 +51,7 @@ public ArmeriaClientTelemetryBuilder setStatusExtractor(
4851
* Adds an extra {@link AttributesExtractor} to invoke to set attributes to instrumented items.
4952
* The {@link AttributesExtractor} will be executed after all default extractors.
5053
*/
54+
@Override
5155
@CanIgnoreReturnValue
5256
public ArmeriaClientTelemetryBuilder addAttributesExtractor(
5357
AttributesExtractor<ClientRequestContext, RequestLog> attributesExtractor) {
@@ -60,6 +64,7 @@ public ArmeriaClientTelemetryBuilder addAttributesExtractor(
6064
*
6165
* @param requestHeaders A list of HTTP header names.
6266
*/
67+
@Override
6368
@CanIgnoreReturnValue
6469
public ArmeriaClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
6570
builder.setCapturedRequestHeaders(requestHeaders);
@@ -71,6 +76,7 @@ public ArmeriaClientTelemetryBuilder setCapturedRequestHeaders(List<String> requ
7176
*
7277
* @param responseHeaders A list of HTTP header names.
7378
*/
79+
@Override
7480
@CanIgnoreReturnValue
7581
public ArmeriaClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
7682
builder.setCapturedResponseHeaders(responseHeaders);
@@ -90,13 +96,15 @@ public ArmeriaClientTelemetryBuilder setCapturedResponseHeaders(List<String> res
9096
* @param knownMethods A set of recognized HTTP request methods.
9197
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
9298
*/
99+
@Override
93100
@CanIgnoreReturnValue
94101
public ArmeriaClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
95102
builder.setKnownMethods(knownMethods);
96103
return this;
97104
}
98105

99106
/** Sets custom client {@link SpanNameExtractor} via transform function. */
107+
@Override
100108
@CanIgnoreReturnValue
101109
public ArmeriaClientTelemetryBuilder setSpanNameExtractor(
102110
Function<SpanNameExtractor<ClientRequestContext>, SpanNameExtractor<ClientRequestContext>>
@@ -121,6 +129,7 @@ void setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetr
121129
builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
122130
}
123131

132+
@Override
124133
public ArmeriaClientTelemetry build() {
125134
return new ArmeriaClientTelemetry(builder.build());
126135
}

0 commit comments

Comments
 (0)