Skip to content

Commit 0e218de

Browse files
authored
Remove reflection from builder (#11673)
1 parent 3037865 commit 0e218de

File tree

12 files changed

+101
-63
lines changed

12 files changed

+101
-63
lines changed

instrumentation/java-http-client/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/JavaHttpClientSingletons.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10-
import io.opentelemetry.instrumentation.httpclient.JavaHttpClientTelemetry;
1110
import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter;
11+
import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
1212
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
1313
import java.net.http.HttpRequest;
1414
import java.net.http.HttpResponse;
@@ -23,7 +23,7 @@ public class JavaHttpClientSingletons {
2323

2424
INSTRUMENTER =
2525
JavaagentHttpClientInstrumenters.create(
26-
JavaHttpClientTelemetry.builder(GlobalOpenTelemetry.get()));
26+
JavaHttpClientInstrumenterBuilderFactory.create(GlobalOpenTelemetry.get()));
2727
}
2828

2929
public static Instrumenter<HttpRequest, HttpResponse<?>> instrumenter() {

instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/JavaHttpClientTelemetryBuilder.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1313
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
1414
import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter;
15-
import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientAttributesGetter;
15+
import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
1616
import java.net.http.HttpRequest;
1717
import java.net.http.HttpResponse;
1818
import java.util.List;
@@ -21,13 +21,10 @@
2121

2222
public final class JavaHttpClientTelemetryBuilder {
2323

24-
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-client";
2524
private final DefaultHttpClientInstrumenterBuilder<HttpRequest, HttpResponse<?>> builder;
2625

2726
JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) {
28-
builder =
29-
new DefaultHttpClientInstrumenterBuilder<>(
30-
INSTRUMENTATION_NAME, openTelemetry, JavaHttpClientAttributesGetter.INSTANCE);
27+
builder = JavaHttpClientInstrumenterBuilderFactory.create(openTelemetry);
3128
}
3229

3330
/**

instrumentation/java-http-client/library/src/main/java/io/opentelemetry/instrumentation/httpclient/internal/JavaHttpClientAttributesGetter.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@
1212
import java.util.List;
1313
import javax.annotation.Nullable;
1414

15-
/**
16-
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
17-
* any time.
18-
*/
19-
public enum JavaHttpClientAttributesGetter
15+
enum JavaHttpClientAttributesGetter
2016
implements HttpClientAttributesGetter<HttpRequest, HttpResponse<?>> {
2117
INSTANCE;
2218

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.httpclient.internal;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
10+
import java.net.http.HttpRequest;
11+
import java.net.http.HttpResponse;
12+
13+
/**
14+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
15+
* any time.
16+
*/
17+
public class JavaHttpClientInstrumenterBuilderFactory {
18+
private JavaHttpClientInstrumenterBuilderFactory() {}
19+
20+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.java-http-client";
21+
22+
public static DefaultHttpClientInstrumenterBuilder<HttpRequest, HttpResponse<?>> create(
23+
OpenTelemetry openTelemetry) {
24+
return new DefaultHttpClientInstrumenterBuilder<>(
25+
INSTRUMENTATION_NAME, openTelemetry, JavaHttpClientAttributesGetter.INSTANCE);
26+
}
27+
}

instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClientSingletons.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10-
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.JettyClientTelemetry;
10+
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyHttpClientInstrumenterBuilderFactory;
1111
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
1212
import org.eclipse.jetty.client.api.Request;
1313
import org.eclipse.jetty.client.api.Response;
@@ -16,7 +16,7 @@ public class JettyHttpClientSingletons {
1616

1717
private static final Instrumenter<Request, Response> INSTRUMENTER =
1818
JavaagentHttpClientInstrumenters.create(
19-
JettyClientTelemetry.builder(GlobalOpenTelemetry.get()));
19+
JettyHttpClientInstrumenterBuilderFactory.create(GlobalOpenTelemetry.get()));
2020

2121
public static Instrumenter<Request, Response> instrumenter() {
2222
return INSTRUMENTER;

instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/JettyClientTelemetryBuilder.java

+2-7
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1212
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1313
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
14-
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.HttpHeaderSetter;
15-
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientHttpAttributesGetter;
14+
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyHttpClientInstrumenterBuilderFactory;
1615
import java.util.List;
1716
import java.util.Set;
1817
import java.util.function.Function;
@@ -24,16 +23,12 @@
2423
/** A builder of {@link JettyClientTelemetry}. */
2524
public final class JettyClientTelemetryBuilder {
2625

27-
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jetty-httpclient-9.2";
2826
private final DefaultHttpClientInstrumenterBuilder<Request, Response> builder;
2927
private HttpClientTransport httpClientTransport;
3028
private SslContextFactory sslContextFactory;
3129

3230
JettyClientTelemetryBuilder(OpenTelemetry openTelemetry) {
33-
builder =
34-
new DefaultHttpClientInstrumenterBuilder<>(
35-
INSTRUMENTATION_NAME, openTelemetry, JettyClientHttpAttributesGetter.INSTANCE)
36-
.setHeaderSetter(HttpHeaderSetter.INSTANCE);
31+
builder = JettyHttpClientInstrumenterBuilderFactory.create(openTelemetry);
3732
}
3833

3934
@CanIgnoreReturnValue

instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/HttpHeaderSetter.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@
88
import io.opentelemetry.context.propagation.TextMapSetter;
99
import org.eclipse.jetty.client.api.Request;
1010

11-
/**
12-
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
13-
* any time.
14-
*/
15-
public enum HttpHeaderSetter implements TextMapSetter<Request> {
11+
enum HttpHeaderSetter implements TextMapSetter<Request> {
1612
INSTANCE;
1713

1814
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
10+
import org.eclipse.jetty.client.api.Request;
11+
import org.eclipse.jetty.client.api.Response;
12+
13+
/**
14+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
15+
* any time.
16+
*/
17+
public class JettyHttpClientInstrumenterBuilderFactory {
18+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jetty-httpclient-9.2";
19+
20+
private JettyHttpClientInstrumenterBuilderFactory() {}
21+
22+
public static DefaultHttpClientInstrumenterBuilder<Request, Response> create(
23+
OpenTelemetry openTelemetry) {
24+
return new DefaultHttpClientInstrumenterBuilder<>(
25+
INSTRUMENTATION_NAME, openTelemetry, JettyClientHttpAttributesGetter.INSTANCE)
26+
.setHeaderSetter(HttpHeaderSetter.INSTANCE);
27+
}
28+
}

instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import io.opentelemetry.context.Scope;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1212
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount;
13-
import io.opentelemetry.instrumentation.okhttp.v3_0.OkHttpTelemetry;
1413
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.ConnectionErrorSpanInterceptor;
14+
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpClientInstrumenterBuilderFactory;
1515
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.TracingInterceptor;
1616
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
1717
import okhttp3.Interceptor;
@@ -22,7 +22,8 @@
2222
public final class OkHttp3Singletons {
2323

2424
private static final Instrumenter<Request, Response> INSTRUMENTER =
25-
JavaagentHttpClientInstrumenters.create(OkHttpTelemetry.builder(GlobalOpenTelemetry.get()));
25+
JavaagentHttpClientInstrumenters.create(
26+
OkHttpClientInstrumenterBuilderFactory.create(GlobalOpenTelemetry.get()));
2627

2728
public static final Interceptor CONTEXT_INTERCEPTOR =
2829
chain -> {

instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/OkHttpTelemetryBuilder.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1212
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1313
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
14-
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpAttributesGetter;
14+
import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpClientInstrumenterBuilderFactory;
1515
import java.util.List;
1616
import java.util.Set;
1717
import java.util.function.Function;
@@ -21,13 +21,10 @@
2121
/** A builder of {@link OkHttpTelemetry}. */
2222
public final class OkHttpTelemetryBuilder {
2323

24-
public static final String INSTRUMENTATION_NAME = "io.opentelemetry.okhttp-3.0";
2524
private final DefaultHttpClientInstrumenterBuilder<Request, Response> builder;
2625

2726
OkHttpTelemetryBuilder(OpenTelemetry openTelemetry) {
28-
builder =
29-
new DefaultHttpClientInstrumenterBuilder<>(
30-
INSTRUMENTATION_NAME, openTelemetry, OkHttpAttributesGetter.INSTANCE);
27+
builder = OkHttpClientInstrumenterBuilderFactory.create(openTelemetry);
3128
}
3229

3330
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.okhttp.v3_0.internal;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
10+
import okhttp3.Request;
11+
import okhttp3.Response;
12+
13+
/**
14+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
15+
* any time.
16+
*/
17+
public class OkHttpClientInstrumenterBuilderFactory {
18+
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.okhttp-3.0";
19+
20+
private OkHttpClientInstrumenterBuilderFactory() {}
21+
22+
public static DefaultHttpClientInstrumenterBuilder<Request, Response> create(
23+
OpenTelemetry openTelemetry) {
24+
return new DefaultHttpClientInstrumenterBuilder<>(
25+
INSTRUMENTATION_NAME, openTelemetry, OkHttpAttributesGetter.INSTANCE);
26+
}
27+
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/JavaagentHttpClientInstrumenters.java

+4-30
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1212
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1313
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
14-
import java.lang.reflect.Field;
1514
import java.util.function.Consumer;
1615
import java.util.function.Supplier;
1716

@@ -36,11 +35,9 @@ public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(
3635
return create(instrumentationName, httpAttributesGetter, headerSetter, b -> {});
3736
}
3837

39-
// this is where an HttpClientTelemetryBuilder interface would be nice
40-
// instead of having to pass Object and using reflection to unwrap the underlying builder
41-
public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(Object builder) {
42-
DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> defaultBuilder = unwrapBuilder(builder);
43-
return create(defaultBuilder, customizer -> {});
38+
public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(
39+
DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> builder) {
40+
return create(builder, customizer -> {});
4441
}
4542

4643
public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(
@@ -64,34 +61,11 @@ private static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(
6461
set(config::getKnownHttpRequestMethods, builder::setKnownMethods);
6562
set(config::getClientRequestHeaders, builder::setCapturedRequestHeaders);
6663
set(config::getClientResponseHeaders, builder::setCapturedResponseHeaders);
67-
// is not exposed in the public API
6864
set(config::getPeerServiceResolver, builder::setPeerServiceResolver);
6965
set(
7066
config::shouldEmitExperimentalHttpClientTelemetry,
7167
builder::setEmitExperimentalHttpClientMetrics);
72-
// is not exposed in the public API
73-
builder.setBuilderCustomizer(builderCustomizer);
74-
return builder.build();
75-
}
76-
77-
/**
78-
* This method is used to access the builder field of the builder object.
79-
*
80-
* <p>This approach allows us to re-use the existing builder classes from the library modules
81-
*/
82-
@SuppressWarnings("unchecked")
83-
private static <REQUEST, RESPONSE>
84-
DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE> unwrapBuilder(Object builder) {
85-
if (builder instanceof DefaultHttpClientInstrumenterBuilder<?, ?>) {
86-
return (DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE>) builder;
87-
}
88-
try {
89-
Field field = builder.getClass().getDeclaredField("builder");
90-
field.setAccessible(true);
91-
return (DefaultHttpClientInstrumenterBuilder<REQUEST, RESPONSE>) field.get(builder);
92-
} catch (Exception e) {
93-
throw new IllegalStateException("Could not access builder field", e);
94-
}
68+
return builder.setBuilderCustomizer(builderCustomizer).build();
9569
}
9670

9771
private static <T> void set(Supplier<T> supplier, Consumer<T> consumer) {

0 commit comments

Comments
 (0)