Skip to content

Commit a8ade9c

Browse files
committed
use delegation
1 parent fa45c6e commit a8ade9c

File tree

9 files changed

+521
-119
lines changed

9 files changed

+521
-119
lines changed
Lines changed: 31 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@
3131
import java.util.function.Consumer;
3232
import java.util.function.Function;
3333

34-
public abstract class AbstractHttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE> {
34+
public final class DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE>
35+
implements HttpClientTelemetryBuilder<
36+
DefaultHttpClientTelemetryBuilder<?, ?>, REQUEST, RESPONSE> {
3537

3638
private final String instrumentationName;
37-
protected final OpenTelemetry openTelemetry;
39+
private final OpenTelemetry openTelemetry;
3840

3941
private final List<AttributesExtractor<? super REQUEST, ? super RESPONSE>> additionalExtractors =
4042
new ArrayList<>();
@@ -47,7 +49,7 @@ public abstract class AbstractHttpClientTelemetryBuilder<SELF, REQUEST, RESPONSE
4749
spanNameExtractorTransformer = Function.identity();
4850
private boolean emitExperimentalHttpClientMetrics = false;
4951

50-
public AbstractHttpClientTelemetryBuilder(
52+
public DefaultHttpClientTelemetryBuilder(
5153
String instrumentationName,
5254
OpenTelemetry openTelemetry,
5355
HttpClientAttributesGetter<REQUEST, RESPONSE> attributesGetter,
@@ -60,83 +62,60 @@ public AbstractHttpClientTelemetryBuilder(
6062
this.headerSetter = headerSetter;
6163
}
6264

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-
*/
65+
@Override
6766
@CanIgnoreReturnValue
68-
public SELF addAttributeExtractor(
67+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> addAttributeExtractor(
6968
AttributesExtractor<? super REQUEST, ? super RESPONSE> attributesExtractor) {
7069
additionalExtractors.add(attributesExtractor);
71-
return self();
70+
return this;
7271
}
7372

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-
*/
73+
@Override
7974
@CanIgnoreReturnValue
80-
public SELF setCapturedRequestHeaders(List<String> requestHeaders) {
75+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setCapturedRequestHeaders(
76+
List<String> requestHeaders) {
8177
httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
82-
return self();
78+
return this;
8379
}
8480

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-
*/
81+
@Override
9082
@CanIgnoreReturnValue
91-
public SELF setCapturedResponseHeaders(List<String> responseHeaders) {
83+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setCapturedResponseHeaders(
84+
List<String> responseHeaders) {
9285
httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
93-
return self();
86+
return this;
9487
}
9588

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-
*/
89+
@Override
10990
@CanIgnoreReturnValue
110-
public SELF setKnownMethods(Set<String> knownMethods) {
91+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setKnownMethods(
92+
Set<String> knownMethods) {
11193
httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
11294
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
113-
return self();
95+
return this;
11496
}
11597

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-
*/
98+
@Override
12299
@CanIgnoreReturnValue
123-
public SELF setEmitExperimentalHttpClientMetrics(boolean emitExperimentalHttpClientMetrics) {
100+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setEmitExperimentalHttpClientMetrics(
101+
boolean emitExperimentalHttpClientMetrics) {
124102
this.emitExperimentalHttpClientMetrics = emitExperimentalHttpClientMetrics;
125-
return self();
103+
return this;
126104
}
127105

128-
/** Sets custom {@link SpanNameExtractor} via transform function. */
106+
@Override
129107
@CanIgnoreReturnValue
130-
public SELF setSpanNameExtractor(
108+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setSpanNameExtractor(
131109
Function<SpanNameExtractor<REQUEST>, ? extends SpanNameExtractor<? super REQUEST>>
132110
spanNameExtractorTransformer) {
133111
this.spanNameExtractorTransformer = spanNameExtractorTransformer;
134-
return self();
112+
return this;
135113
}
136114

137115
/** Sets custom {@link PeerServiceResolver}. */
138116
@CanIgnoreReturnValue
139-
public SELF setPeerServiceResolver(PeerServiceResolver peerServiceResolver) {
117+
public DefaultHttpClientTelemetryBuilder<REQUEST, RESPONSE> setPeerServiceResolver(
118+
PeerServiceResolver peerServiceResolver) {
140119
return addAttributeExtractor(
141120
HttpClientPeerServiceAttributesExtractor.create(attributesGetter, peerServiceResolver));
142121
}
@@ -170,8 +149,7 @@ public Instrumenter<REQUEST, RESPONSE> instrumenter(
170149
return builder.buildInstrumenter(SpanKindExtractor.alwaysClient());
171150
}
172151

173-
@SuppressWarnings("unchecked")
174-
private SELF self() {
175-
return (SELF) this;
152+
public OpenTelemetry getOpenTelemetry() {
153+
return openTelemetry;
176154
}
177155
}
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

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,82 @@
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<ApacheHttpClientRequest, HttpResponse> builder;
1927

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

2886
/**
@@ -31,6 +89,7 @@ public final class ApacheHttpClientTelemetryBuilder
3189
*/
3290
public ApacheHttpClientTelemetry build() {
3391
// We manually inject because we need to inject internal requests for redirects.
34-
return new ApacheHttpClientTelemetry(instrumenter(), openTelemetry.getPropagators());
92+
return new ApacheHttpClientTelemetry(
93+
builder.instrumenter(), builder.getOpenTelemetry().getPropagators());
3594
}
3695
}

0 commit comments

Comments
 (0)