Skip to content

Commit 74a9fd0

Browse files
trasklaurit
andauthored
Better qualify Java HttpClient instrumentation package name (#13296)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent a2b06f6 commit 74a9fd0

File tree

22 files changed

+304
-25
lines changed

22 files changed

+304
-25
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## Unreleased
44

5+
### Migration notes
6+
7+
- The `java.net.http.HttpClient` instrumentation package
8+
`io.opentelemetry.instrumentation.httpclient` was deprecated in favor of the new package name
9+
`io.opentelemetry.instrumentation.javahttpclient`
10+
511
## Version 2.13.0 (2025-02-17)
612

713
### Migration notes
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.httpclient;
6+
package io.opentelemetry.javaagent.instrumentation.javahttpclient;
77

88
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass;
1010
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
11-
import static io.opentelemetry.javaagent.instrumentation.httpclient.JavaHttpClientSingletons.instrumenter;
11+
import static io.opentelemetry.javaagent.instrumentation.javahttpclient.JavaHttpClientSingletons.instrumenter;
1212
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1313
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1414
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@@ -19,8 +19,8 @@
1919

2020
import io.opentelemetry.context.Context;
2121
import io.opentelemetry.context.Scope;
22-
import io.opentelemetry.instrumentation.httpclient.internal.CompletableFutureWrapper;
23-
import io.opentelemetry.instrumentation.httpclient.internal.ResponseConsumer;
22+
import io.opentelemetry.instrumentation.javahttpclient.internal.CompletableFutureWrapper;
23+
import io.opentelemetry.instrumentation.javahttpclient.internal.ResponseConsumer;
2424
import io.opentelemetry.javaagent.bootstrap.CallDepth;
2525
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2626
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.httpclient;
6+
package io.opentelemetry.javaagent.instrumentation.javahttpclient;
77

88
import static java.util.Arrays.asList;
99

Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.httpclient;
6+
package io.opentelemetry.javaagent.instrumentation.javahttpclient;
77

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass;
9-
import static io.opentelemetry.javaagent.instrumentation.httpclient.JavaHttpClientSingletons.setter;
9+
import static io.opentelemetry.javaagent.instrumentation.javahttpclient.JavaHttpClientSingletons.setter;
1010
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1111
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
1212
import static net.bytebuddy.matcher.ElementMatchers.named;
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.httpclient;
6+
package io.opentelemetry.javaagent.instrumentation.javahttpclient;
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10-
import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter;
11-
import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
10+
import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter;
11+
import io.opentelemetry.instrumentation.javahttpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
1212
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
1313
import java.net.http.HttpRequest;
1414
import java.net.http.HttpResponse;
+2-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.httpclient;
6+
package io.opentelemetry.javaagent.instrumentation.javahttpclient;
77

8-
import io.opentelemetry.instrumentation.httpclient.AbstractJavaHttpClientTest;
8+
import io.opentelemetry.instrumentation.javahttpclient.AbstractJavaHttpClientTest;
99
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1010
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension;
1111
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions;

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@
77

88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10-
import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter;
11-
import io.opentelemetry.instrumentation.httpclient.internal.OpenTelemetryHttpClient;
10+
import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter;
11+
import io.opentelemetry.instrumentation.javahttpclient.internal.OpenTelemetryHttpClient;
1212
import java.net.http.HttpClient;
1313
import java.net.http.HttpRequest;
1414
import java.net.http.HttpResponse;
1515

16-
/** Entrypoint for instrumenting Java HTTP Client. */
16+
/**
17+
* Entrypoint for instrumenting Java HTTP Client.
18+
*
19+
* @deprecated Use {@link io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetry}
20+
* instead.
21+
*/
22+
@Deprecated
1723
public final class JavaHttpClientTelemetry {
1824

1925
/**

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@
1212
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1313
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
1414
import io.opentelemetry.instrumentation.httpclient.internal.Experimental;
15-
import io.opentelemetry.instrumentation.httpclient.internal.HttpHeadersSetter;
16-
import io.opentelemetry.instrumentation.httpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
15+
import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter;
16+
import io.opentelemetry.instrumentation.javahttpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
1717
import java.net.http.HttpRequest;
1818
import java.net.http.HttpResponse;
1919
import java.util.Collection;
2020
import java.util.function.Function;
2121

22+
/**
23+
* @deprecated Use {@link
24+
* io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetryBuilder} instead.
25+
*/
26+
@Deprecated
2227
public final class JavaHttpClientTelemetryBuilder {
2328

2429
private final DefaultHttpClientInstrumenterBuilder<HttpRequest, HttpResponse<?>> builder;

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

+4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
* This class is internal and experimental. Its APIs are unstable and can change at any time. Its
1414
* APIs (or a version of them) may be promoted to the public stable API in the future, but no
1515
* guarantees are made.
16+
*
17+
* @deprecated Use {@link io.opentelemetry.instrumentation.javahttpclient.internal.Experimental}
18+
* instead.
1619
*/
20+
@Deprecated
1721
public final class Experimental {
1822

1923
@Nullable
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.javahttpclient;
7+
8+
import io.opentelemetry.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10+
import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter;
11+
import io.opentelemetry.instrumentation.javahttpclient.internal.OpenTelemetryHttpClient;
12+
import java.net.http.HttpClient;
13+
import java.net.http.HttpRequest;
14+
import java.net.http.HttpResponse;
15+
16+
/** Entrypoint for instrumenting Java HTTP Client. */
17+
public final class JavaHttpClientTelemetry {
18+
19+
/**
20+
* Returns a new {@link JavaHttpClientTelemetry} configured with the given {@link OpenTelemetry}.
21+
*/
22+
public static JavaHttpClientTelemetry create(OpenTelemetry openTelemetry) {
23+
return builder(openTelemetry).build();
24+
}
25+
26+
public static JavaHttpClientTelemetryBuilder builder(OpenTelemetry openTelemetry) {
27+
return new JavaHttpClientTelemetryBuilder(openTelemetry);
28+
}
29+
30+
private final Instrumenter<HttpRequest, HttpResponse<?>> instrumenter;
31+
private final HttpHeadersSetter headersSetter;
32+
33+
JavaHttpClientTelemetry(
34+
Instrumenter<HttpRequest, HttpResponse<?>> instrumenter, HttpHeadersSetter headersSetter) {
35+
this.instrumenter = instrumenter;
36+
this.headersSetter = headersSetter;
37+
}
38+
39+
/**
40+
* Construct a new OpenTelemetry tracing-enabled {@link HttpClient} using the provided {@link
41+
* HttpClient} instance.
42+
*
43+
* @param client An instance of HttpClient configured as desired.
44+
* @return a tracing-enabled {@link HttpClient}.
45+
*/
46+
public HttpClient newHttpClient(HttpClient client) {
47+
return new OpenTelemetryHttpClient(client, instrumenter, headersSetter);
48+
}
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.javahttpclient;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import io.opentelemetry.api.OpenTelemetry;
10+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
11+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
12+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
13+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
14+
import io.opentelemetry.instrumentation.javahttpclient.internal.Experimental;
15+
import io.opentelemetry.instrumentation.javahttpclient.internal.HttpHeadersSetter;
16+
import io.opentelemetry.instrumentation.javahttpclient.internal.JavaHttpClientInstrumenterBuilderFactory;
17+
import java.net.http.HttpRequest;
18+
import java.net.http.HttpResponse;
19+
import java.util.Collection;
20+
import java.util.function.Function;
21+
22+
public final class JavaHttpClientTelemetryBuilder {
23+
24+
private final DefaultHttpClientInstrumenterBuilder<HttpRequest, HttpResponse<?>> builder;
25+
private final OpenTelemetry openTelemetry;
26+
27+
static {
28+
Experimental.internalSetEmitExperimentalTelemetry(
29+
(builder, emit) -> builder.builder.setEmitExperimentalHttpClientMetrics(emit));
30+
}
31+
32+
JavaHttpClientTelemetryBuilder(OpenTelemetry openTelemetry) {
33+
builder = JavaHttpClientInstrumenterBuilderFactory.create(openTelemetry);
34+
this.openTelemetry = openTelemetry;
35+
}
36+
37+
/**
38+
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
39+
* items. The {@link AttributesExtractor} will be executed after all default extractors.
40+
*/
41+
@CanIgnoreReturnValue
42+
public JavaHttpClientTelemetryBuilder addAttributesExtractor(
43+
AttributesExtractor<? super HttpRequest, ? super HttpResponse<?>> attributesExtractor) {
44+
builder.addAttributesExtractor(attributesExtractor);
45+
return this;
46+
}
47+
48+
/**
49+
* Configures the HTTP request headers that will be captured as span attributes.
50+
*
51+
* @param requestHeaders A list of HTTP header names.
52+
*/
53+
@CanIgnoreReturnValue
54+
public JavaHttpClientTelemetryBuilder setCapturedRequestHeaders(
55+
Collection<String> requestHeaders) {
56+
builder.setCapturedRequestHeaders(requestHeaders);
57+
return this;
58+
}
59+
60+
/**
61+
* Configures the HTTP response headers that will be captured as span attributes.
62+
*
63+
* @param responseHeaders A list of HTTP header names.
64+
*/
65+
@CanIgnoreReturnValue
66+
public JavaHttpClientTelemetryBuilder setCapturedResponseHeaders(
67+
Collection<String> responseHeaders) {
68+
builder.setCapturedResponseHeaders(responseHeaders);
69+
return this;
70+
}
71+
72+
/**
73+
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
74+
*
75+
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
76+
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
77+
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
78+
*
79+
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
80+
* not supplement it.
81+
*
82+
* @param knownMethods A set of recognized HTTP request methods.
83+
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Collection)
84+
*/
85+
@CanIgnoreReturnValue
86+
public JavaHttpClientTelemetryBuilder setKnownMethods(Collection<String> knownMethods) {
87+
builder.setKnownMethods(knownMethods);
88+
return this;
89+
}
90+
91+
/** Sets custom {@link SpanNameExtractor} via transform function. */
92+
@CanIgnoreReturnValue
93+
public JavaHttpClientTelemetryBuilder setSpanNameExtractor(
94+
Function<
95+
SpanNameExtractor<? super HttpRequest>,
96+
? extends SpanNameExtractor<? super HttpRequest>>
97+
spanNameExtractorTransformer) {
98+
builder.setSpanNameExtractor(spanNameExtractorTransformer);
99+
return this;
100+
}
101+
102+
public JavaHttpClientTelemetry build() {
103+
return new JavaHttpClientTelemetry(
104+
builder.build(), new HttpHeadersSetter(openTelemetry.getPropagators()));
105+
}
106+
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.httpclient.internal;
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
77

88
import io.opentelemetry.context.Context;
99
import io.opentelemetry.context.Scope;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
7+
8+
import io.opentelemetry.instrumentation.javahttpclient.JavaHttpClientTelemetryBuilder;
9+
import java.util.function.BiConsumer;
10+
import javax.annotation.Nullable;
11+
12+
/**
13+
* This class is internal and experimental. Its APIs are unstable and can change at any time. Its
14+
* APIs (or a version of them) may be promoted to the public stable API in the future, but no
15+
* guarantees are made.
16+
*/
17+
public final class Experimental {
18+
19+
@Nullable
20+
private static volatile BiConsumer<JavaHttpClientTelemetryBuilder, Boolean>
21+
setEmitExperimentalTelemetry;
22+
23+
public static void setEmitExperimentalTelemetry(
24+
JavaHttpClientTelemetryBuilder builder, boolean emitExperimentalTelemetry) {
25+
if (setEmitExperimentalTelemetry != null) {
26+
setEmitExperimentalTelemetry.accept(builder, emitExperimentalTelemetry);
27+
}
28+
}
29+
30+
public static void internalSetEmitExperimentalTelemetry(
31+
BiConsumer<JavaHttpClientTelemetryBuilder, Boolean> setEmitExperimentalTelemetry) {
32+
Experimental.setEmitExperimentalTelemetry = setEmitExperimentalTelemetry;
33+
}
34+
35+
private Experimental() {}
36+
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.httpclient.internal;
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
77

88
import io.opentelemetry.context.Context;
99
import io.opentelemetry.context.propagation.ContextPropagators;
+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.httpclient.internal;
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
77

88
import java.net.URI;
99
import java.net.http.HttpClient;
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.httpclient.internal;
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
77

88
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter;
99
import java.net.http.HttpClient;
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.httpclient.internal;
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
77

88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.instrumentation.httpclient.internal;
6+
package io.opentelemetry.instrumentation.javahttpclient.internal;
77

88
import io.opentelemetry.context.Context;
99
import io.opentelemetry.context.Scope;

0 commit comments

Comments
 (0)