Skip to content

Commit d21d732

Browse files
committed
use delegation
1 parent fa45c6e commit d21d732

File tree

9 files changed

+475
-102
lines changed

9 files changed

+475
-102
lines changed
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
import java.util.function.Consumer;
3232
import java.util.function.Function;
3333

34-
public abstract class AbstractHttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE> {
34+
public class DefaultHttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE>
35+
implements HttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE> {
3536

3637
private final String instrumentationName;
3738
protected final OpenTelemetry openTelemetry;
@@ -47,7 +48,7 @@ public abstract class AbstractHttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE
4748
spanNameExtractorTransformer = Function.identity();
4849
private boolean emitExperimentalHttpClientMetrics = false;
4950

50-
public AbstractHttpClientTelemetryBuilder(
51+
public DefaultHttpClientTelemetryBuilder(
5152
String instrumentationName,
5253
OpenTelemetry openTelemetry,
5354
HttpClientAttributesGetter<REQUEST, RESPONSE> attributesGetter,
@@ -60,72 +61,44 @@ public AbstractHttpClientTelemetryBuilder(
6061
this.headerSetter = headerSetter;
6162
}
6263

63-
/**
64-
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
65-
* items. The {@link AttributesExtractor} will be executed after all default extractors.
66-
*/
64+
@Override
6765
@CanIgnoreReturnValue
6866
public SELF addAttributeExtractor(
6967
AttributesExtractor<? super REQUEST, ? super RESPONSE> attributesExtractor) {
7068
additionalExtractors.add(attributesExtractor);
7169
return self();
7270
}
7371

74-
/**
75-
* Configures the HTTP request headers that will be captured as span attributes.
76-
*
77-
* @param requestHeaders A list of HTTP header names.
78-
*/
72+
@Override
7973
@CanIgnoreReturnValue
8074
public SELF setCapturedRequestHeaders(List<String> requestHeaders) {
8175
httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
8276
return self();
8377
}
8478

85-
/**
86-
* Configures the HTTP response headers that will be captured as span attributes.
87-
*
88-
* @param responseHeaders A list of HTTP header names.
89-
*/
79+
@Override
9080
@CanIgnoreReturnValue
9181
public SELF setCapturedResponseHeaders(List<String> responseHeaders) {
9282
httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
9383
return self();
9484
}
9585

96-
/**
97-
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
98-
*
99-
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
100-
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
101-
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
102-
*
103-
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
104-
* not supplement it.
105-
*
106-
* @param knownMethods A set of recognized HTTP request methods.
107-
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
108-
*/
86+
@Override
10987
@CanIgnoreReturnValue
11088
public SELF setKnownMethods(Set<String> knownMethods) {
11189
httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
11290
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
11391
return self();
11492
}
11593

116-
/**
117-
* Configures the instrumentation to emit experimental HTTP client metrics.
118-
*
119-
* @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics
120-
* are to be emitted.
121-
*/
94+
@Override
12295
@CanIgnoreReturnValue
12396
public SELF setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics) {
12497
this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics;
12598
return self();
12699
}
127100

128-
/** Sets custom {@link SpanNameExtractor} via transform function. */
101+
@Override
129102
@CanIgnoreReturnValue
130103
public SELF setSpanNameExtractor(
131104
Function<SpanNameExtractor<REQUEST>, ? extends SpanNameExtractor<? super REQUEST>>
@@ -174,4 +147,8 @@ public Instrumenter<REQUEST, RESPONSE> instrumenter(
174147
private SELF self() {
175148
return (SELF) this;
176149
}
150+
151+
public OpenTelemetry getOpenTelemetry() {
152+
return openTelemetry;
153+
}
177154
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.builder;
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.semconv.http.HttpClientAttributesExtractorBuilder;
12+
import java.util.List;
13+
import java.util.Set;
14+
import java.util.function.Function;
15+
16+
public interface HttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE> {
17+
/**
18+
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
19+
* items. The {@link AttributesExtractor} will be executed after all default extractors.
20+
*/
21+
@CanIgnoreReturnValue
22+
SELF addAttributeExtractor(
23+
AttributesExtractor<? super REQUEST, ? super RESPONSE> attributesExtractor);
24+
25+
/**
26+
* Configures the HTTP request headers that will be captured as span attributes.
27+
*
28+
* @param requestHeaders A list of HTTP header names.
29+
*/
30+
@CanIgnoreReturnValue
31+
SELF setCapturedRequestHeaders(List<String> requestHeaders);
32+
33+
/**
34+
* Configures the HTTP response headers that will be captured as span attributes.
35+
*
36+
* @param responseHeaders A list of HTTP header names.
37+
*/
38+
@CanIgnoreReturnValue
39+
SELF setCapturedResponseHeaders(List<String> responseHeaders);
40+
41+
/**
42+
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
43+
*
44+
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
45+
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
46+
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
47+
*
48+
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
49+
* not supplement it.
50+
*
51+
* @param knownMethods A set of recognized HTTP request methods.
52+
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
53+
*/
54+
@CanIgnoreReturnValue
55+
SELF setKnownMethods(Set<String> knownMethods);
56+
57+
/**
58+
* Configures the instrumentation to emit experimental HTTP client metrics.
59+
*
60+
* @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics
61+
* are to be emitted.
62+
*/
63+
@CanIgnoreReturnValue
64+
SELF setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics);
65+
66+
/** Sets custom {@link SpanNameExtractor} via transform function. */
67+
@CanIgnoreReturnValue
68+
SELF setSpanNameExtractor(
69+
Function<SpanNameExtractor<REQUEST>, ? extends SpanNameExtractor<? super REQUEST>>
70+
spanNameExtractorTransformer);
71+
}

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

+63-8
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,78 @@
55

66
package io.opentelemetry.instrumentation.apachehttpclient.v4_3;
77

8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
89
import io.opentelemetry.api.OpenTelemetry;
9-
import io.opentelemetry.instrumentation.api.incubator.builder.AbstractHttpClientTelemetryBuilder;
10+
import io.opentelemetry.instrumentation.api.incubator.builder.DefaultHttpClientTelemetryBuilder;
11+
import io.opentelemetry.instrumentation.api.incubator.builder.HttpClientTelemetryBuilder;
12+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
13+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
14+
import java.util.List;
1015
import java.util.Optional;
16+
import java.util.Set;
17+
import java.util.function.Function;
1118
import org.apache.http.HttpResponse;
1219

1320
/** A builder for {@link ApacheHttpClientTelemetry}. */
1421
public final class ApacheHttpClientTelemetryBuilder
15-
extends AbstractHttpClientTelemetryBuilder<
22+
implements HttpClientTelemetryBuilder<
1623
ApacheHttpClientTelemetryBuilder, ApacheHttpClientRequest, HttpResponse> {
1724

1825
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-4.3";
26+
private final DefaultHttpClientTelemetryBuilder<
27+
ApacheHttpClientTelemetryBuilder, ApacheHttpClientRequest, HttpResponse>
28+
builder;
1929

2030
ApacheHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) {
21-
super(
22-
INSTRUMENTATION_NAME,
23-
openTelemetry,
24-
ApacheHttpClientHttpAttributesGetter.INSTANCE,
25-
Optional.empty());
31+
builder =
32+
new DefaultHttpClientTelemetryBuilder<>(
33+
INSTRUMENTATION_NAME,
34+
openTelemetry,
35+
ApacheHttpClientHttpAttributesGetter.INSTANCE,
36+
Optional.empty());
37+
}
38+
39+
@Override
40+
@CanIgnoreReturnValue
41+
public ApacheHttpClientTelemetryBuilder addAttributeExtractor(
42+
AttributesExtractor<? super ApacheHttpClientRequest, ? super HttpResponse>
43+
attributesExtractor) {
44+
return builder.addAttributeExtractor(attributesExtractor);
45+
}
46+
47+
@Override
48+
@CanIgnoreReturnValue
49+
public ApacheHttpClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
50+
return builder.setCapturedRequestHeaders(requestHeaders);
51+
}
52+
53+
@Override
54+
@CanIgnoreReturnValue
55+
public ApacheHttpClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
56+
return builder.setCapturedResponseHeaders(responseHeaders);
57+
}
58+
59+
@Override
60+
@CanIgnoreReturnValue
61+
public ApacheHttpClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
62+
return builder.setKnownMethods(knownMethods);
63+
}
64+
65+
@Override
66+
@CanIgnoreReturnValue
67+
public ApacheHttpClientTelemetryBuilder setEmitExperimentalHttpClientMetrics(
68+
boolean emitExperimentalHttpClientMetrics) {
69+
return builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
70+
}
71+
72+
@Override
73+
@CanIgnoreReturnValue
74+
public ApacheHttpClientTelemetryBuilder setSpanNameExtractor(
75+
Function<
76+
SpanNameExtractor<ApacheHttpClientRequest>,
77+
? extends SpanNameExtractor<? super ApacheHttpClientRequest>>
78+
spanNameExtractorTransformer) {
79+
return builder.setSpanNameExtractor(spanNameExtractorTransformer);
2680
}
2781

2882
/**
@@ -31,6 +85,7 @@ public final class ApacheHttpClientTelemetryBuilder
3185
*/
3286
public ApacheHttpClientTelemetry build() {
3387
// We manually inject because we need to inject internal requests for redirects.
34-
return new ApacheHttpClientTelemetry(instrumenter(), openTelemetry.getPropagators());
88+
return new ApacheHttpClientTelemetry(
89+
builder.instrumenter(), builder.getOpenTelemetry().getPropagators());
3590
}
3691
}

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

+65-9
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,88 @@
55

66
package io.opentelemetry.instrumentation.apachehttpclient.v5_2;
77

8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
89
import io.opentelemetry.api.OpenTelemetry;
9-
import io.opentelemetry.instrumentation.api.incubator.builder.AbstractHttpClientTelemetryBuilder;
10+
import io.opentelemetry.instrumentation.api.incubator.builder.DefaultHttpClientTelemetryBuilder;
11+
import io.opentelemetry.instrumentation.api.incubator.builder.HttpClientTelemetryBuilder;
12+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
13+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
14+
import java.util.List;
1015
import java.util.Optional;
16+
import java.util.Set;
17+
import java.util.function.Function;
1118
import org.apache.hc.core5.http.HttpResponse;
1219

1320
/** A builder for {@link ApacheHttpClient5Telemetry}. */
1421
public final class ApacheHttpClient5TelemetryBuilder
15-
extends AbstractHttpClientTelemetryBuilder<
22+
implements HttpClientTelemetryBuilder<
1623
ApacheHttpClient5TelemetryBuilder, ApacheHttpClient5Request, HttpResponse> {
1724

1825
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-httpclient-5.2";
26+
private final DefaultHttpClientTelemetryBuilder<
27+
ApacheHttpClient5TelemetryBuilder, ApacheHttpClient5Request, HttpResponse>
28+
builder;
1929

2030
ApacheHttpClient5TelemetryBuilder(OpenTelemetry openTelemetry) {
21-
super(
22-
INSTRUMENTATION_NAME,
23-
openTelemetry,
24-
ApacheHttpClient5HttpAttributesGetter.INSTANCE,
25-
// We manually inject because we need to inject internal requests for redirects.
26-
Optional.empty());
31+
builder =
32+
new DefaultHttpClientTelemetryBuilder<>(
33+
INSTRUMENTATION_NAME,
34+
openTelemetry,
35+
ApacheHttpClient5HttpAttributesGetter.INSTANCE,
36+
// We manually inject because we need to inject internal requests for redirects.
37+
Optional.empty());
38+
}
39+
40+
@Override
41+
@CanIgnoreReturnValue
42+
public ApacheHttpClient5TelemetryBuilder addAttributeExtractor(
43+
AttributesExtractor<? super ApacheHttpClient5Request, ? super HttpResponse>
44+
attributesExtractor) {
45+
return builder.addAttributeExtractor(attributesExtractor);
46+
}
47+
48+
@Override
49+
@CanIgnoreReturnValue
50+
public ApacheHttpClient5TelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
51+
return builder.setCapturedRequestHeaders(requestHeaders);
52+
}
53+
54+
@Override
55+
@CanIgnoreReturnValue
56+
public ApacheHttpClient5TelemetryBuilder setCapturedResponseHeaders(
57+
List<String> responseHeaders) {
58+
return builder.setCapturedResponseHeaders(responseHeaders);
59+
}
60+
61+
@Override
62+
@CanIgnoreReturnValue
63+
public ApacheHttpClient5TelemetryBuilder setKnownMethods(Set<String> knownMethods) {
64+
return builder.setKnownMethods(knownMethods);
65+
}
66+
67+
@Override
68+
@CanIgnoreReturnValue
69+
public ApacheHttpClient5TelemetryBuilder setEmitExperimentalHttpClientMetrics(
70+
boolean emitExperimentalHttpClientMetrics) {
71+
return builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
72+
}
73+
74+
@Override
75+
@CanIgnoreReturnValue
76+
public ApacheHttpClient5TelemetryBuilder setSpanNameExtractor(
77+
Function<
78+
SpanNameExtractor<ApacheHttpClient5Request>,
79+
? extends SpanNameExtractor<? super ApacheHttpClient5Request>>
80+
spanNameExtractorTransformer) {
81+
return builder.setSpanNameExtractor(spanNameExtractorTransformer);
2782
}
2883

2984
/**
3085
* Returns a new {@link ApacheHttpClient5Telemetry} configured with this {@link
3186
* ApacheHttpClient5TelemetryBuilder}.
3287
*/
3388
public ApacheHttpClient5Telemetry build() {
34-
return new ApacheHttpClient5Telemetry(instrumenter(), openTelemetry.getPropagators());
89+
return new ApacheHttpClient5Telemetry(
90+
builder.instrumenter(), builder.getOpenTelemetry().getPropagators());
3591
}
3692
}

0 commit comments

Comments
 (0)