responseHeaders) {
+ httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
+ return this;
+ }
+
+ /**
+ * Configures the instrumentation to recognize an alternative set of HTTP request methods.
+ *
+ * By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH
+ * method defined in RFC5789.
+ *
+ *
Note: calling this method overrides the default known method sets completely; it does
+ * not supplement it.
+ *
+ * @param knownMethods A set of recognized HTTP request methods.
+ * @see HttpServerAttributesExtractorBuilder#setKnownMethods(Set)
+ */
+ @CanIgnoreReturnValue
+ public DefaultHttpServerInstrumenterBuilder setKnownMethods(
+ Set knownMethods) {
+ httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
+ httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
+ httpServerRouteBuilder.setKnownMethods(knownMethods);
+ return this;
+ }
+
+ @CanIgnoreReturnValue
+ public DefaultHttpServerInstrumenterBuilder setHeaderGetter(
+ @Nullable TextMapGetter headerGetter) {
+ this.headerGetter = headerGetter;
+ return this;
+ }
+
+ /**
+ * Configures the instrumentation to emit experimental HTTP server metrics.
+ *
+ * @param emitExperimentalHttpServerMetrics {@code true} if the experimental HTTP server metrics
+ * are to be emitted.
+ */
+ @CanIgnoreReturnValue
+ public DefaultHttpServerInstrumenterBuilder
+ setEmitExperimentalHttpServerMetrics(boolean emitExperimentalHttpServerMetrics) {
+ this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics;
+ return this;
+ }
+
+ /** Sets custom {@link SpanNameExtractor} via transform function. */
+ @CanIgnoreReturnValue
+ public DefaultHttpServerInstrumenterBuilder setSpanNameExtractor(
+ Function, ? extends SpanNameExtractor super REQUEST>>
+ spanNameExtractorTransformer) {
+ this.spanNameExtractorTransformer = spanNameExtractorTransformer;
+ return this;
+ }
+
+ public Instrumenter build() {
+ InstrumenterBuilder builder = builder();
+
+ if (headerGetter != null) {
+ return builder.buildServerInstrumenter(headerGetter);
+ }
+ return builder.buildInstrumenter(SpanKindExtractor.alwaysServer());
+ }
+
+ private InstrumenterBuilder builder() {
+ SpanNameExtractor super REQUEST> spanNameExtractor =
+ spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
+
+ InstrumenterBuilder builder =
+ Instrumenter.builder(
+ openTelemetry, instrumentationName, spanNameExtractor)
+ .setSpanStatusExtractor(
+ statusExtractorTransformer.apply(HttpSpanStatusExtractor.create(attributesGetter)))
+ .addAttributesExtractor(httpAttributesExtractorBuilder.build())
+ .addAttributesExtractors(additionalExtractors)
+ .addContextCustomizer(httpServerRouteBuilder.build())
+ .addOperationMetrics(HttpServerMetrics.get());
+ if (emitExperimentalHttpServerMetrics) {
+ builder
+ .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(attributesGetter))
+ .addOperationMetrics(HttpServerExperimentalMetrics.get());
+ }
+
+ return builder;
+ }
+
+ @CanIgnoreReturnValue
+ public DefaultHttpServerInstrumenterBuilder configure(CommonConfig config) {
+ set(config::getKnownHttpRequestMethods, this::setKnownMethods);
+ set(config::getServerRequestHeaders, this::setCapturedRequestHeaders);
+ set(config::getServerResponseHeaders, this::setCapturedResponseHeaders);
+ set(
+ config::shouldEmitExperimentalHttpServerTelemetry,
+ this::setEmitExperimentalHttpServerMetrics);
+ return this;
+ }
+
+ private static void set(Supplier supplier, Consumer consumer) {
+ T t = supplier.get();
+ if (t != null) {
+ consumer.accept(t);
+ }
+ }
+}
diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcAttributesGetter.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcAttributesGetter.java
index 2e7d0a6e539d..6b0ae2669cc9 100644
--- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcAttributesGetter.java
+++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcAttributesGetter.java
@@ -24,4 +24,12 @@ public interface RpcAttributesGetter {
@Nullable
String getMethod(REQUEST request);
+
+ default Long getRequestSize(REQUEST request) {
+ return null;
+ }
+
+ default Long getResponseSize(REQUEST request) {
+ return null;
+ }
}
diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetrics.java
index db001a3afc87..4ff1b93d4184 100644
--- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetrics.java
+++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetrics.java
@@ -11,6 +11,8 @@
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
+import io.opentelemetry.api.metrics.LongHistogram;
+import io.opentelemetry.api.metrics.LongHistogramBuilder;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
@@ -35,6 +37,8 @@ public final class RpcClientMetrics implements OperationListener {
private static final Logger logger = Logger.getLogger(RpcClientMetrics.class.getName());
private final DoubleHistogram clientDurationHistogram;
+ private final LongHistogram clientRequestSize;
+ private final LongHistogram clientResponseSize;
private RpcClientMetrics(Meter meter) {
DoubleHistogramBuilder durationBuilder =
@@ -44,6 +48,24 @@ private RpcClientMetrics(Meter meter) {
.setUnit("ms");
RpcMetricsAdvice.applyClientDurationAdvice(durationBuilder);
clientDurationHistogram = durationBuilder.build();
+
+ LongHistogramBuilder requestSizeBuilder =
+ meter
+ .histogramBuilder("rpc.client.request.size")
+ .setUnit("By")
+ .setDescription("Measures the size of RPC request messages (uncompressed).")
+ .ofLongs();
+ RpcMetricsAdvice.applyClientRequestSizeAdvice(requestSizeBuilder);
+ clientRequestSize = requestSizeBuilder.build();
+
+ LongHistogramBuilder responseSizeBuilder =
+ meter
+ .histogramBuilder("rpc.client.response.size")
+ .setUnit("By")
+ .setDescription("Measures the size of RPC response messages (uncompressed).")
+ .ofLongs();
+ RpcMetricsAdvice.applyClientRequestSizeAdvice(responseSizeBuilder);
+ clientResponseSize = responseSizeBuilder.build();
}
/**
@@ -72,10 +94,21 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
context);
return;
}
+ Attributes attributes = state.startAttributes().toBuilder().putAll(endAttributes).build();
clientDurationHistogram.record(
- (endNanos - state.startTimeNanos()) / NANOS_PER_MS,
- state.startAttributes().toBuilder().putAll(endAttributes).build(),
- context);
+ (endNanos - state.startTimeNanos()) / NANOS_PER_MS, attributes, context);
+
+ Long rpcClientRequestBodySize =
+ RpcMessageBodySizeUtil.getRpcRequestBodySize(endAttributes, state.startAttributes());
+ if (rpcClientRequestBodySize != null) {
+ clientRequestSize.record(rpcClientRequestBodySize, attributes, context);
+ }
+
+ Long rpcClientResponseBodySize =
+ RpcMessageBodySizeUtil.getRpcResponseBodySize(endAttributes, state.startAttributes());
+ if (rpcClientResponseBodySize != null) {
+ clientResponseSize.record(rpcClientResponseBodySize, attributes, context);
+ }
}
@AutoValue
diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcCommonAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcCommonAttributesExtractor.java
index f731e703586c..13d4c9af75e6 100644
--- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcCommonAttributesExtractor.java
+++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcCommonAttributesExtractor.java
@@ -20,6 +20,10 @@ abstract class RpcCommonAttributesExtractor
static final AttributeKey RPC_METHOD = AttributeKey.stringKey("rpc.method");
static final AttributeKey RPC_SERVICE = AttributeKey.stringKey("rpc.service");
static final AttributeKey RPC_SYSTEM = AttributeKey.stringKey("rpc.system");
+ static final AttributeKey RPC_REQUEST_BODY_SIZE =
+ AttributeKey.longKey("rpc.request.body.size");
+ static final AttributeKey RPC_RESPONSE_BODY_SIZE =
+ AttributeKey.longKey("rpc.response.body.size");
private final RpcAttributesGetter getter;
@@ -41,6 +45,24 @@ public final void onEnd(
REQUEST request,
@Nullable RESPONSE response,
@Nullable Throwable error) {
- // No response attributes
+ Long requestSize = getter.getRequestSize(request);
+ Long responseSize = getter.getResponseSize(request);
+ if (this instanceof RpcClientAttributesExtractor) {
+ if (requestSize != null) {
+ internalSet(attributes, RPC_REQUEST_BODY_SIZE, requestSize);
+ }
+ if (responseSize != null) {
+ internalSet(attributes, RPC_RESPONSE_BODY_SIZE, responseSize);
+ }
+ }
+
+ if (this instanceof RpcServerAttributesExtractor) {
+ if (requestSize != null) {
+ internalSet(attributes, RPC_REQUEST_BODY_SIZE, requestSize);
+ }
+ if (responseSize != null) {
+ internalSet(attributes, RPC_RESPONSE_BODY_SIZE, responseSize);
+ }
+ }
}
}
diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMessageBodySizeUtil.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMessageBodySizeUtil.java
new file mode 100644
index 000000000000..6ebc66e26e75
--- /dev/null
+++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMessageBodySizeUtil.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.api.incubator.semconv.rpc;
+
+import io.opentelemetry.api.common.AttributeKey;
+import io.opentelemetry.api.common.Attributes;
+import javax.annotation.Nullable;
+
+final class RpcMessageBodySizeUtil {
+
+ @Nullable
+ static Long getRpcRequestBodySize(Attributes... attributesList) {
+ return getAttribute(RpcCommonAttributesExtractor.RPC_REQUEST_BODY_SIZE, attributesList);
+ }
+
+ @Nullable
+ static Long getRpcResponseBodySize(Attributes... attributesList) {
+ return getAttribute(RpcCommonAttributesExtractor.RPC_RESPONSE_BODY_SIZE, attributesList);
+ }
+
+ @Nullable
+ private static T getAttribute(AttributeKey key, Attributes... attributesList) {
+ for (Attributes attributes : attributesList) {
+ T value = attributes.get(key);
+ if (value != null) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ private RpcMessageBodySizeUtil() {}
+}
diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMetricsAdvice.java
index 0a24cca3f39c..af317d876d62 100644
--- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMetricsAdvice.java
+++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMetricsAdvice.java
@@ -5,18 +5,32 @@
package io.opentelemetry.instrumentation.api.incubator.semconv.rpc;
+import static java.util.Arrays.asList;
+
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder;
+import io.opentelemetry.api.incubator.metrics.ExtendedLongHistogramBuilder;
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
+import io.opentelemetry.api.metrics.LongHistogramBuilder;
import io.opentelemetry.semconv.NetworkAttributes;
import io.opentelemetry.semconv.ServerAttributes;
-import java.util.Arrays;
+import java.util.List;
final class RpcMetricsAdvice {
// copied from RpcIncubatingAttributes
private static final AttributeKey RPC_GRPC_STATUS_CODE =
AttributeKey.longKey("rpc.grpc.status_code");
+ private static final List> RPC_METRICS_ATTRIBUTE_KEYS =
+ asList(
+ RpcCommonAttributesExtractor.RPC_SYSTEM,
+ RpcCommonAttributesExtractor.RPC_SERVICE,
+ RpcCommonAttributesExtractor.RPC_METHOD,
+ RPC_GRPC_STATUS_CODE,
+ NetworkAttributes.NETWORK_TYPE,
+ NetworkAttributes.NETWORK_TRANSPORT,
+ ServerAttributes.SERVER_ADDRESS,
+ ServerAttributes.SERVER_PORT);
static void applyClientDurationAdvice(DoubleHistogramBuilder builder) {
if (!(builder instanceof ExtendedDoubleHistogramBuilder)) {
@@ -24,17 +38,7 @@ static void applyClientDurationAdvice(DoubleHistogramBuilder builder) {
}
// the list of recommended metrics attributes is from
// https://github.com/open-telemetry/semantic-conventions/blob/main/docs/rpc/rpc-metrics.md
- ((ExtendedDoubleHistogramBuilder) builder)
- .setAttributesAdvice(
- Arrays.asList(
- RpcCommonAttributesExtractor.RPC_SYSTEM,
- RpcCommonAttributesExtractor.RPC_SERVICE,
- RpcCommonAttributesExtractor.RPC_METHOD,
- RPC_GRPC_STATUS_CODE,
- NetworkAttributes.NETWORK_TYPE,
- NetworkAttributes.NETWORK_TRANSPORT,
- ServerAttributes.SERVER_ADDRESS,
- ServerAttributes.SERVER_PORT));
+ ((ExtendedDoubleHistogramBuilder) builder).setAttributesAdvice(RPC_METRICS_ATTRIBUTE_KEYS);
}
static void applyServerDurationAdvice(DoubleHistogramBuilder builder) {
@@ -43,17 +47,25 @@ static void applyServerDurationAdvice(DoubleHistogramBuilder builder) {
}
// the list of recommended metrics attributes is from
// https://github.com/open-telemetry/semantic-conventions/blob/main/docs/rpc/rpc-metrics.md
- ((ExtendedDoubleHistogramBuilder) builder)
- .setAttributesAdvice(
- Arrays.asList(
- RpcCommonAttributesExtractor.RPC_SYSTEM,
- RpcCommonAttributesExtractor.RPC_SERVICE,
- RpcCommonAttributesExtractor.RPC_METHOD,
- RPC_GRPC_STATUS_CODE,
- NetworkAttributes.NETWORK_TYPE,
- NetworkAttributes.NETWORK_TRANSPORT,
- ServerAttributes.SERVER_ADDRESS,
- ServerAttributes.SERVER_PORT));
+ ((ExtendedDoubleHistogramBuilder) builder).setAttributesAdvice(RPC_METRICS_ATTRIBUTE_KEYS);
+ }
+
+ static void applyClientRequestSizeAdvice(LongHistogramBuilder builder) {
+ if (!(builder instanceof ExtendedLongHistogramBuilder)) {
+ return;
+ }
+ // the list of recommended metrics attributes is from
+ // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/rpc/rpc-metrics.md
+ ((ExtendedLongHistogramBuilder) builder).setAttributesAdvice(RPC_METRICS_ATTRIBUTE_KEYS);
+ }
+
+ static void applyServerRequestSizeAdvice(LongHistogramBuilder builder) {
+ if (!(builder instanceof ExtendedLongHistogramBuilder)) {
+ return;
+ }
+ // the list of recommended metrics attributes is from
+ // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/rpc/rpc-metrics.md
+ ((ExtendedLongHistogramBuilder) builder).setAttributesAdvice(RPC_METRICS_ATTRIBUTE_KEYS);
}
private RpcMetricsAdvice() {}
diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetrics.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetrics.java
index 08f50d8b3483..1e0d95743213 100644
--- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetrics.java
+++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetrics.java
@@ -11,6 +11,8 @@
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
+import io.opentelemetry.api.metrics.LongHistogram;
+import io.opentelemetry.api.metrics.LongHistogramBuilder;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
@@ -35,6 +37,8 @@ public final class RpcServerMetrics implements OperationListener {
private static final Logger logger = Logger.getLogger(RpcServerMetrics.class.getName());
private final DoubleHistogram serverDurationHistogram;
+ private final LongHistogram serverRequestSize;
+ private final LongHistogram serverResponseSize;
private RpcServerMetrics(Meter meter) {
DoubleHistogramBuilder durationBuilder =
@@ -44,6 +48,24 @@ private RpcServerMetrics(Meter meter) {
.setUnit("ms");
RpcMetricsAdvice.applyServerDurationAdvice(durationBuilder);
serverDurationHistogram = durationBuilder.build();
+
+ LongHistogramBuilder requestSizeBuilder =
+ meter
+ .histogramBuilder("rpc.server.request.size")
+ .setUnit("By")
+ .setDescription("Measures the size of RPC request messages (uncompressed).")
+ .ofLongs();
+ RpcMetricsAdvice.applyServerRequestSizeAdvice(requestSizeBuilder);
+ serverRequestSize = requestSizeBuilder.build();
+
+ LongHistogramBuilder responseSizeBuilder =
+ meter
+ .histogramBuilder("rpc.server.response.size")
+ .setUnit("By")
+ .setDescription("Measures the size of RPC response messages (uncompressed).")
+ .ofLongs();
+ RpcMetricsAdvice.applyServerRequestSizeAdvice(responseSizeBuilder);
+ serverResponseSize = responseSizeBuilder.build();
}
/**
@@ -72,10 +94,21 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
context);
return;
}
+ Attributes attributes = state.startAttributes().toBuilder().putAll(endAttributes).build();
serverDurationHistogram.record(
- (endNanos - state.startTimeNanos()) / NANOS_PER_MS,
- state.startAttributes().toBuilder().putAll(endAttributes).build(),
- context);
+ (endNanos - state.startTimeNanos()) / NANOS_PER_MS, attributes, context);
+
+ Long rpcServerRequestBodySize =
+ RpcMessageBodySizeUtil.getRpcRequestBodySize(endAttributes, state.startAttributes());
+ if (rpcServerRequestBodySize != null) {
+ serverRequestSize.record(rpcServerRequestBodySize, attributes, context);
+ }
+
+ Long rpcServerResponseBodySize =
+ RpcMessageBodySizeUtil.getRpcResponseBodySize(endAttributes, state.startAttributes());
+ if (rpcServerResponseBodySize != null) {
+ serverResponseSize.record(rpcServerResponseBodySize, attributes, context);
+ }
}
@AutoValue
diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetricsTest.java
index 768a67de0bb2..a75c9b55e7aa 100644
--- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetricsTest.java
+++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetricsTest.java
@@ -46,6 +46,8 @@ void collectsMetrics() {
.put(ServerAttributes.SERVER_PORT, 8080)
.put(NetworkAttributes.NETWORK_TRANSPORT, "tcp")
.put(NetworkAttributes.NETWORK_TYPE, "ipv4")
+ .put(RpcCommonAttributesExtractor.RPC_REQUEST_BODY_SIZE, 10)
+ .put(RpcCommonAttributesExtractor.RPC_RESPONSE_BODY_SIZE, 20)
.build();
Attributes responseAttributes2 =
@@ -76,6 +78,62 @@ void collectsMetrics() {
assertThat(metricReader.collectAllMetrics())
.satisfiesExactlyInAnyOrder(
+ metric ->
+ assertThat(metric)
+ .hasName("rpc.client.response.size")
+ .hasUnit("By")
+ .hasDescription("Measures the size of RPC response messages (uncompressed).")
+ .hasHistogramSatisfying(
+ histogram ->
+ histogram.hasPointsSatisfying(
+ point ->
+ point
+ .hasSum(20 /* bytes */)
+ .hasAttributesSatisfying(
+ equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_SERVICE,
+ "myservice.EchoService"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_METHOD,
+ "exampleMethod"),
+ equalTo(ServerAttributes.SERVER_ADDRESS, "example.com"),
+ equalTo(ServerAttributes.SERVER_PORT, 8080),
+ equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"),
+ equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"))
+ .hasExemplarsSatisfying(
+ exemplar ->
+ exemplar
+ .hasTraceId("ff01020304050600ff0a0b0c0d0e0f00")
+ .hasSpanId("090a0b0c0d0e0f00")))),
+ metric ->
+ assertThat(metric)
+ .hasName("rpc.client.request.size")
+ .hasUnit("By")
+ .hasDescription("Measures the size of RPC request messages (uncompressed).")
+ .hasHistogramSatisfying(
+ histogram ->
+ histogram.hasPointsSatisfying(
+ point ->
+ point
+ .hasSum(10 /* bytes */)
+ .hasAttributesSatisfying(
+ equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_SERVICE,
+ "myservice.EchoService"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_METHOD,
+ "exampleMethod"),
+ equalTo(ServerAttributes.SERVER_ADDRESS, "example.com"),
+ equalTo(ServerAttributes.SERVER_PORT, 8080),
+ equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"),
+ equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"))
+ .hasExemplarsSatisfying(
+ exemplar ->
+ exemplar
+ .hasTraceId("ff01020304050600ff0a0b0c0d0e0f00")
+ .hasSpanId("090a0b0c0d0e0f00")))),
metric ->
assertThat(metric)
.hasName("rpc.client.duration")
diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetricsTest.java
index bb8b59082aa5..3a4a322b5f2e 100644
--- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetricsTest.java
+++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetricsTest.java
@@ -47,6 +47,8 @@ void collectsMetrics() {
.put(NetworkAttributes.NETWORK_LOCAL_ADDRESS, "127.0.0.1")
.put(NetworkAttributes.NETWORK_TRANSPORT, "tcp")
.put(NetworkAttributes.NETWORK_TYPE, "ipv4")
+ .put(RpcCommonAttributesExtractor.RPC_REQUEST_BODY_SIZE, 10)
+ .put(RpcCommonAttributesExtractor.RPC_RESPONSE_BODY_SIZE, 20)
.build();
Attributes responseAttributes2 =
@@ -88,6 +90,60 @@ void collectsMetrics() {
point ->
point
.hasSum(150 /* millis */)
+ .hasAttributesSatisfying(
+ equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_SERVICE,
+ "myservice.EchoService"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_METHOD,
+ "exampleMethod"),
+ equalTo(ServerAttributes.SERVER_ADDRESS, "example.com"),
+ equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"),
+ equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"))
+ .hasExemplarsSatisfying(
+ exemplar ->
+ exemplar
+ .hasTraceId("ff01020304050600ff0a0b0c0d0e0f00")
+ .hasSpanId("090a0b0c0d0e0f00")))),
+ metric ->
+ assertThat(metric)
+ .hasName("rpc.server.response.size")
+ .hasUnit("By")
+ .hasDescription("Measures the size of RPC response messages (uncompressed).")
+ .hasHistogramSatisfying(
+ histogram ->
+ histogram.hasPointsSatisfying(
+ point ->
+ point
+ .hasSum(20 /* bytes */)
+ .hasAttributesSatisfying(
+ equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_SERVICE,
+ "myservice.EchoService"),
+ equalTo(
+ RpcIncubatingAttributes.RPC_METHOD,
+ "exampleMethod"),
+ equalTo(ServerAttributes.SERVER_ADDRESS, "example.com"),
+ equalTo(NetworkAttributes.NETWORK_TRANSPORT, "tcp"),
+ equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"))
+ .hasExemplarsSatisfying(
+ exemplar ->
+ exemplar
+ .hasTraceId("ff01020304050600ff0a0b0c0d0e0f00")
+ .hasSpanId("090a0b0c0d0e0f00")))),
+ metric ->
+ assertThat(metric)
+ .hasName("rpc.server.request.size")
+ .hasUnit("By")
+ .hasDescription("Measures the size of RPC request messages (uncompressed).")
+ .hasHistogramSatisfying(
+ histogram ->
+ histogram.hasPointsSatisfying(
+ point ->
+ point
+ .hasSum(10 /* bytes */)
.hasAttributesSatisfying(
equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "grpc"),
equalTo(
diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java
index cee163f4a12e..a51990317067 100644
--- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java
+++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java
@@ -11,6 +11,7 @@
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
+import io.opentelemetry.context.ContextKey;
import io.opentelemetry.instrumentation.api.internal.HttpRouteState;
import io.opentelemetry.instrumentation.api.internal.InstrumenterAccess;
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
@@ -41,6 +42,9 @@
*/
public class Instrumenter {
+ private static final ContextKey START_OPERATION_LISTENERS =
+ ContextKey.named("instrumenter-start-operation-listeners");
+
/**
* Returns a new {@link InstrumenterBuilder}.
*
@@ -74,6 +78,7 @@ public static InstrumenterBuilder builder
private final ContextCustomizer super REQUEST>[] contextCustomizers;
private final OperationListener[] operationListeners;
private final ErrorCauseExtractor errorCauseExtractor;
+ private final boolean propagateOperationListenersToOnEnd;
private final boolean enabled;
private final SpanSuppressor spanSuppressor;
@@ -89,6 +94,7 @@ public static InstrumenterBuilder builder
this.contextCustomizers = builder.contextCustomizers.toArray(new ContextCustomizer[0]);
this.operationListeners = builder.buildOperationListeners().toArray(new OperationListener[0]);
this.errorCauseExtractor = builder.errorCauseExtractor;
+ this.propagateOperationListenersToOnEnd = builder.propagateOperationListenersToOnEnd;
this.enabled = builder.enabled;
this.spanSuppressor = builder.buildSpanSuppressor();
}
@@ -198,6 +204,15 @@ private Context doStart(Context parentContext, REQUEST request, @Nullable Instan
context = operationListeners[i].onStart(context, attributes, startNanos);
}
}
+ if (propagateOperationListenersToOnEnd || context.get(START_OPERATION_LISTENERS) != null) {
+ // when start and end are not called on the same instrumenter we need to use the operation
+ // listeners that were used during start in end to correctly handle metrics like
+ // http.server.active_requests that is recorded both in start and end
+ //
+ // need to also add when there is already START_OPERATION_LISTENERS, otherwise this
+ // instrumenter will call its parent's operation listeners in doEnd
+ context = context.with(START_OPERATION_LISTENERS, operationListeners);
+ }
if (localRoot) {
context = LocalRootSpan.store(context, span);
@@ -228,6 +243,10 @@ private void doEnd(
}
span.setAllAttributes(attributes);
+ OperationListener[] operationListeners = context.get(START_OPERATION_LISTENERS);
+ if (operationListeners == null) {
+ operationListeners = this.operationListeners;
+ }
if (operationListeners.length != 0) {
long endNanos = getNanos(endTime);
for (int i = operationListeners.length - 1; i >= 0; i--) {
diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java
index 8c68cd0890d4..6b41ae6c60ab 100644
--- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java
+++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java
@@ -66,6 +66,7 @@ public final class InstrumenterBuilder {
SpanStatusExtractor super REQUEST, ? super RESPONSE> spanStatusExtractor =
SpanStatusExtractor.getDefault();
ErrorCauseExtractor errorCauseExtractor = ErrorCauseExtractor.getDefault();
+ boolean propagateOperationListenersToOnEnd = false;
boolean enabled = true;
InstrumenterBuilder(
@@ -370,6 +371,10 @@ private Set getSpanKeysFromAttributesExtractors() {
.collect(Collectors.toSet());
}
+ private void propagateOperationListenersToOnEnd() {
+ propagateOperationListenersToOnEnd = true;
+ }
+
private interface InstrumenterConstructor {
Instrumenter create(InstrumenterBuilder builder);
@@ -406,6 +411,12 @@ public Instrumenter buildDownstreamInstrumenter(
SpanKindExtractor spanKindExtractor) {
return builder.buildDownstreamInstrumenter(setter, spanKindExtractor);
}
+
+ @Override
+ public void propagateOperationListenersToOnEnd(
+ InstrumenterBuilder builder) {
+ builder.propagateOperationListenersToOnEnd();
+ }
});
}
}
diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterBuilderAccess.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterBuilderAccess.java
index d8c40af3e47a..2c660577b17c 100644
--- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterBuilderAccess.java
+++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterBuilderAccess.java
@@ -26,4 +26,7 @@ Instrumenter buildDownstreamInstrumenter(
InstrumenterBuilder builder,
TextMapSetter setter,
SpanKindExtractor spanKindExtractor);
+
+ void propagateOperationListenersToOnEnd(
+ InstrumenterBuilder builder);
}
diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java
index 24648b4b2fb6..d61a6e8fe367 100644
--- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java
+++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/InstrumenterUtil.java
@@ -67,5 +67,11 @@ public static Instrumenter buildDownstrea
builder, setter, spanKindExtractor);
}
+ public static void propagateOperationListenersToOnEnd(
+ InstrumenterBuilder builder) {
+ // instrumenterBuilderAccess is guaranteed to be non-null here
+ instrumenterBuilderAccess.propagateOperationListenersToOnEnd(builder);
+ }
+
private InstrumenterUtil() {}
}
diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java
index 2402365b9efa..efd2a2b1b80e 100644
--- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java
+++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaGrpcTest.java
@@ -16,6 +16,7 @@
import example.Helloworld;
import io.grpc.Status;
import io.grpc.stub.StreamObserver;
+import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import io.opentelemetry.semconv.ServerAttributes;
@@ -29,6 +30,11 @@ class ArmeriaGrpcTest {
@RegisterExtension
static final AgentInstrumentationExtension testing = AgentInstrumentationExtension.create();
+ private static final AttributeKey RPC_REQUEST_BODY_SIZE =
+ AttributeKey.longKey("rpc.request.body.size");
+ private static final AttributeKey RPC_RESPONSE_BODY_SIZE =
+ AttributeKey.longKey("rpc.response.body.size");
+
@RegisterExtension
static final ServerExtension server =
new ServerExtension() {
@@ -58,12 +64,12 @@ void grpcInstrumentation() {
GreeterGrpc.GreeterBlockingStub client =
GrpcClients.builder(server.httpUri()).build(GreeterGrpc.GreeterBlockingStub.class);
- Helloworld.Response response =
- testing.runWithSpan(
- "parent",
- () -> client.sayHello(Helloworld.Request.newBuilder().setName("test").build()));
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("test").build();
+ Helloworld.Response response = testing.runWithSpan("parent", () -> client.sayHello(request));
assertThat(response.getMessage()).isEqualTo("Hello test");
+ int requestSerializedSize = request.getSerializedSize();
+ int responseSerializedSize = response.getSerializedSize();
testing.waitAndAssertTraces(
trace ->
@@ -81,7 +87,9 @@ void grpcInstrumentation() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"),
- equalTo(ServerAttributes.SERVER_PORT, (long) server.httpPort()))
+ equalTo(ServerAttributes.SERVER_PORT, (long) server.httpPort()),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize))
.hasEventsSatisfyingExactly(
event ->
event
@@ -108,7 +116,9 @@ void grpcInstrumentation() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"),
- equalTo(ServerAttributes.SERVER_PORT, server.httpPort()))
+ equalTo(ServerAttributes.SERVER_PORT, server.httpPort()),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize))
.hasEventsSatisfyingExactly(
event ->
event
diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts
index d035a0ffc7d9..b414e5a45350 100644
--- a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts
+++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts
@@ -12,8 +12,6 @@ dependencies {
implementation("com.google.guava:guava")
- implementation("org.apache.groovy:groovy")
implementation("io.opentelemetry:opentelemetry-api")
- implementation("org.spockframework:spock-core")
implementation("com.github.stefanbirkner:system-lambda")
}
diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts
index 8d7e6c135dce..9eb92feeae0f 100644
--- a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts
+++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts
@@ -13,8 +13,6 @@ dependencies {
implementation("com.google.guava:guava")
- implementation("org.apache.groovy:groovy")
implementation("io.opentelemetry:opentelemetry-api")
- implementation("org.spockframework:spock-core")
implementation("com.github.stefanbirkner:system-lambda")
}
diff --git a/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientInstrumentation.java b/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientInstrumentation.java
index 886a364e9921..78055968a872 100644
--- a/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientInstrumentation.java
+++ b/instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientInstrumentation.java
@@ -15,6 +15,7 @@
import com.clickhouse.client.ClickHouseClient;
import com.clickhouse.client.ClickHouseRequest;
+import com.clickhouse.client.config.ClickHouseDefaults;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.javaagent.bootstrap.CallDepth;
@@ -63,7 +64,10 @@ public static void onEnter(
ClickHouseDbRequest.create(
clickHouseRequest.getServer().getHost(),
clickHouseRequest.getServer().getPort(),
- clickHouseRequest.getServer().getDatabase().get(),
+ clickHouseRequest
+ .getServer()
+ .getDatabase()
+ .orElse(ClickHouseDefaults.DATABASE.getDefaultValue().toString()),
clickHouseRequest.getPreparedQuery().getOriginalQuery());
if (!instrumenter().shouldStart(parentContext, request)) {
diff --git a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java
index 472a00cb4319..745bed68392e 100644
--- a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java
+++ b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java
@@ -81,6 +81,31 @@ void cleanup() {
clickhouseServer.stop();
}
+ @Test
+ void testConnectionStringWithoutDatabaseSpecifiedStillGeneratesSpans()
+ throws ClickHouseException {
+ ClickHouseNode server = ClickHouseNode.of("http://" + host + ":" + port + "?compress=0");
+ ClickHouseClient client = ClickHouseClient.builder().build();
+
+ ClickHouseResponse response =
+ client
+ .read(server)
+ .format(ClickHouseFormat.RowBinaryWithNamesAndTypes)
+ .query("select * from " + tableName)
+ .executeAndWait();
+ response.close();
+
+ testing.waitAndAssertTraces(
+ trace ->
+ trace.hasSpansSatisfyingExactly(
+ span ->
+ span.hasName("SELECT " + dbName)
+ .hasKind(SpanKind.CLIENT)
+ .hasNoParent()
+ .hasAttributesSatisfyingExactly(
+ attributeAssertions("select * from " + tableName, "SELECT"))));
+ }
+
@Test
void testExecuteAndWaitWithStringQuery() throws ClickHouseException {
testing.runWithSpan(
diff --git a/instrumentation/grpc-1.6/javaagent/build.gradle.kts b/instrumentation/grpc-1.6/javaagent/build.gradle.kts
index 671fdb315e90..11cc03fdf78c 100644
--- a/instrumentation/grpc-1.6/javaagent/build.gradle.kts
+++ b/instrumentation/grpc-1.6/javaagent/build.gradle.kts
@@ -8,6 +8,7 @@ muzzle {
module.set("grpc-core")
versions.set("[1.6.0,)")
assertInverse.set(true)
+ extraDependency("io.grpc:grpc-protobuf:1.5.0")
}
}
@@ -21,7 +22,7 @@ dependencies {
testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent"))
testLibrary("io.grpc:grpc-netty:$grpcVersion")
- testLibrary("io.grpc:grpc-protobuf:$grpcVersion")
+ library("io.grpc:grpc-protobuf:$grpcVersion")
testLibrary("io.grpc:grpc-services:$grpcVersion")
testLibrary("io.grpc:grpc-stub:$grpcVersion")
diff --git a/instrumentation/grpc-1.6/library/build.gradle.kts b/instrumentation/grpc-1.6/library/build.gradle.kts
index 00ace4566efb..f35591d4f0b3 100644
--- a/instrumentation/grpc-1.6/library/build.gradle.kts
+++ b/instrumentation/grpc-1.6/library/build.gradle.kts
@@ -7,9 +7,9 @@ val grpcVersion = "1.6.0"
dependencies {
library("io.grpc:grpc-core:$grpcVersion")
+ library("io.grpc:grpc-protobuf:$grpcVersion")
testLibrary("io.grpc:grpc-netty:$grpcVersion")
- testLibrary("io.grpc:grpc-protobuf:$grpcVersion")
testLibrary("io.grpc:grpc-services:$grpcVersion")
testLibrary("io.grpc:grpc-stub:$grpcVersion")
diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/BodySizeUtil.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/BodySizeUtil.java
new file mode 100644
index 000000000000..c878882386e9
--- /dev/null
+++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/BodySizeUtil.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.grpc.v1_6;
+
+import com.google.protobuf.MessageLite;
+
+final class BodySizeUtil {
+
+ static Long getBodySize(T message) {
+ if (message instanceof MessageLite) {
+ return (long) ((MessageLite) message).getSerializedSize();
+ } else {
+ // Message is not a protobuf message
+ return null;
+ }
+ }
+
+ private BodySizeUtil() {}
+}
diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRequest.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRequest.java
index 89f6746e1ceb..926799191bb2 100644
--- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRequest.java
+++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRequest.java
@@ -20,6 +20,9 @@ public final class GrpcRequest {
private volatile int logicalPort = -1;
@Nullable private volatile SocketAddress peerSocketAddress;
+ private Long requestSize;
+ private Long responseSize;
+
GrpcRequest(
MethodDescriptor, ?> method,
@Nullable Metadata metadata,
@@ -78,4 +81,20 @@ public SocketAddress getPeerSocketAddress() {
void setPeerSocketAddress(SocketAddress peerSocketAddress) {
this.peerSocketAddress = peerSocketAddress;
}
+
+ public Long getRequestSize() {
+ return requestSize;
+ }
+
+ public void setRequestSize(Long requestSize) {
+ this.requestSize = requestSize;
+ }
+
+ public Long getResponseSize() {
+ return responseSize;
+ }
+
+ public void setResponseSize(Long responseSize) {
+ this.responseSize = responseSize;
+ }
}
diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java
index ee7214bb1a87..d114b0090cf2 100644
--- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java
+++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcRpcAttributesGetter.java
@@ -43,6 +43,16 @@ public String getMethod(GrpcRequest request) {
return fullMethodName.substring(slashIndex + 1);
}
+ @Override
+ public Long getRequestSize(GrpcRequest request) {
+ return request.getRequestSize();
+ }
+
+ @Override
+ public Long getResponseSize(GrpcRequest request) {
+ return request.getResponseSize();
+ }
+
List metadataValue(GrpcRequest request, String key) {
if (request.getMetadata() == null) {
return Collections.emptyList();
diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingClientInterceptor.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingClientInterceptor.java
index 8790dad4c493..eec35d45bf3c 100644
--- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingClientInterceptor.java
+++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingClientInterceptor.java
@@ -109,6 +109,7 @@ public void start(Listener responseListener, Metadata headers) {
@Override
public void sendMessage(REQUEST message) {
+ request.setRequestSize(BodySizeUtil.getBodySize(message));
try (Scope ignored = context.makeCurrent()) {
super.sendMessage(message);
} catch (Throwable e) {
@@ -141,6 +142,7 @@ final class TracingClientCallListener
@Override
public void onMessage(RESPONSE message) {
+ request.setResponseSize(BodySizeUtil.getBodySize(message));
Span span = Span.fromContext(context);
Attributes attributes =
Attributes.of(
diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java
index 241f94188b4d..6f1c3faf0b20 100644
--- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java
+++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java
@@ -103,6 +103,7 @@ TracingServerCallListener start(Metadata headers, ServerCallHandler RPC_REQUEST_BODY_SIZE =
+ AttributeKey.longKey("rpc.request.body.size");
+ private static final AttributeKey RPC_RESPONSE_BODY_SIZE =
+ AttributeKey.longKey("rpc.response.body.size");
+
protected abstract ServerBuilder> configureServer(ServerBuilder> server);
protected abstract ManagedChannelBuilder> configureClient(ManagedChannelBuilder> client);
@@ -153,6 +159,9 @@ public void onCompleted() {
.sorted()
.collect(Collectors.toList()));
+ Helloworld.Response message = Helloworld.Response.newBuilder().setMessage("call " + 1).build();
+ int requestSerializedSize = message.getSerializedSize();
+
List> events = new ArrayList<>();
for (int i = 1; i <= clientMessageCount * serverMessageCount + clientMessageCount; i++) {
long messageId = i;
@@ -191,6 +200,8 @@ public void onCompleted() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.satisfies(
spanData ->
@@ -212,6 +223,8 @@ public void onCompleted() {
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
diff --git a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java
index 0e41014eb4c3..790329af2552 100644
--- a/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java
+++ b/instrumentation/grpc-1.6/testing/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/AbstractGrpcTest.java
@@ -81,6 +81,11 @@ public abstract class AbstractGrpcTest {
protected static final String SERVER_REQUEST_METADATA_KEY = "some-server-key";
+ private static final AttributeKey RPC_REQUEST_BODY_SIZE =
+ AttributeKey.longKey("rpc.request.body.size");
+ private static final AttributeKey RPC_RESPONSE_BODY_SIZE =
+ AttributeKey.longKey("rpc.response.body.size");
+
protected abstract ServerBuilder> configureServer(ServerBuilder> server);
protected abstract ManagedChannelBuilder> configureClient(ManagedChannelBuilder> client);
@@ -123,7 +128,9 @@ public void sayHello(
"parent",
() -> client.sayHello(Helloworld.Request.newBuilder().setName(paramName).build()));
- assertThat(response.getMessage()).isEqualTo("Hello " + paramName);
+ String prefix = "Hello ";
+ assertThat(response.getMessage()).isEqualTo(prefix + paramName);
+ int responseSerializedSize = response.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -143,6 +150,10 @@ public void sayHello(
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(
+ RPC_REQUEST_BODY_SIZE,
+ responseSerializedSize - prefix.length()),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -175,6 +186,10 @@ public void sayHello(
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(
+ RPC_RESPONSE_BODY_SIZE,
+ responseSerializedSize - prefix.length()),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -271,13 +286,14 @@ public void sayHello(
AtomicReference response = new AtomicReference<>();
AtomicReference error = new AtomicReference<>();
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("test").build();
testing()
.runWithSpan(
"parent",
() -> {
ListenableFuture future =
Futures.transform(
- client.sayHello(Helloworld.Request.newBuilder().setName("test").build()),
+ client.sayHello(request),
resp -> {
testing().runWithSpan("child", () -> {});
return resp;
@@ -291,7 +307,10 @@ public void sayHello(
});
assertThat(error).hasValue(null);
- assertThat(response.get().getMessage()).isEqualTo("Hello test");
+ Helloworld.Response res = response.get();
+ assertThat(res.getMessage()).isEqualTo("Hello test");
+ int requestSerializedSize = request.getSerializedSize();
+ int responseSerializedSize = res.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -311,6 +330,8 @@ public void sayHello(
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -343,6 +364,8 @@ public void sayHello(
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -444,12 +467,13 @@ public void sayHello(
AtomicReference response = new AtomicReference<>();
AtomicReference error = new AtomicReference<>();
CountDownLatch latch = new CountDownLatch(1);
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("test").build();
testing()
.runWithSpan(
"parent",
() ->
client.sayHello(
- Helloworld.Request.newBuilder().setName("test").build(),
+ request,
new StreamObserver() {
@Override
public void onNext(Helloworld.Response r) {
@@ -471,7 +495,10 @@ public void onCompleted() {
latch.await(10, TimeUnit.SECONDS);
assertThat(error).hasValue(null);
- assertThat(response.get().getMessage()).isEqualTo("Hello test");
+ Helloworld.Response res = response.get();
+ assertThat(res.getMessage()).isEqualTo("Hello test");
+ int requestSerializedSize = request.getSerializedSize();
+ int responseSerializedSize = res.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -491,6 +518,8 @@ public void onCompleted() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -523,6 +552,8 @@ public void onCompleted() {
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -618,8 +649,9 @@ public void sayHello(
GreeterGrpc.GreeterBlockingStub client = GreeterGrpc.newBlockingStub(channel);
- assertThatThrownBy(
- () -> client.sayHello(Helloworld.Request.newBuilder().setName("error").build()))
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("error").build();
+ int requestSerializedSize = request.getSerializedSize();
+ assertThatThrownBy(() -> client.sayHello(request))
.isInstanceOfSatisfying(
StatusRuntimeException.class,
t -> {
@@ -646,6 +678,7 @@ public void sayHello(
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) status.getCode().value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -671,6 +704,7 @@ public void sayHello(
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -761,9 +795,9 @@ public void sayHello(
closer.add(() -> server.shutdownNow().awaitTermination());
GreeterGrpc.GreeterBlockingStub client = GreeterGrpc.newBlockingStub(channel);
-
- assertThatThrownBy(
- () -> client.sayHello(Helloworld.Request.newBuilder().setName("error").build()))
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("error").build();
+ int requestSerializedSize = request.getSerializedSize();
+ assertThatThrownBy(() -> client.sayHello(request))
.isInstanceOfSatisfying(
StatusRuntimeException.class,
t -> {
@@ -798,6 +832,7 @@ public void sayHello(
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.UNKNOWN.getCode().value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -823,6 +858,7 @@ public void sayHello(
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -990,12 +1026,13 @@ public ClientCall interceptCall(
AtomicReference response = new AtomicReference<>();
AtomicReference error = new AtomicReference<>();
CountDownLatch latch = new CountDownLatch(1);
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("test").build();
testing()
.runWithSpan(
"parent",
() ->
client.sayHello(
- Helloworld.Request.newBuilder().setName("test").build(),
+ request,
new StreamObserver() {
@Override
public void onNext(Helloworld.Response r) {
@@ -1026,7 +1063,10 @@ public void onCompleted() {
latch.await(10, TimeUnit.SECONDS);
assertThat(error).hasValue(null);
- assertThat(response.get().getMessage()).isEqualTo("Hello test");
+ Helloworld.Response res = response.get();
+ assertThat(res.getMessage()).isEqualTo("Hello test");
+ int requestSerializedSize = request.getSerializedSize();
+ int responseSerializedSize = res.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -1046,6 +1086,8 @@ public void onCompleted() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -1078,6 +1120,8 @@ public void onCompleted() {
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -1121,12 +1165,13 @@ public void sayMultipleHello(
IllegalStateException thrown = new IllegalStateException("illegal");
AtomicReference error = new AtomicReference<>();
CountDownLatch latch = new CountDownLatch(1);
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("test").build();
testing()
.runWithSpan(
"parent",
() ->
client.sayMultipleHello(
- Helloworld.Request.newBuilder().setName("test").build(),
+ request,
new StreamObserver() {
@Override
public void onNext(Helloworld.Response r) {
@@ -1149,6 +1194,7 @@ public void onCompleted() {
latch.await(10, TimeUnit.SECONDS);
assertThat(error.get()).isNotNull();
+ int requestSerializedSize = request.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -1169,6 +1215,8 @@ public void onCompleted() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.CANCELLED.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, 0),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfying(
events -> {
@@ -1201,6 +1249,8 @@ public void onCompleted() {
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, 0),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -1258,17 +1308,21 @@ public void onCompleted() {
}
});
- request.onNext(
+ ServerReflectionRequest serverReflectionRequest =
ServerReflectionRequest.newBuilder()
.setListServices("The content will not be checked?")
- .build());
+ .build();
+ request.onNext(serverReflectionRequest);
request.onCompleted();
latch.await(10, TimeUnit.SECONDS);
assertThat(error).hasValue(null);
- assertThat(response.get().getListServicesResponse().getService(0).getName())
+ ServerReflectionResponse serverReflectionResponse = response.get();
+ assertThat(serverReflectionResponse.getListServicesResponse().getService(0).getName())
.isEqualTo("grpc.reflection.v1alpha.ServerReflection");
+ int requestSerializedSize = serverReflectionRequest.getSerializedSize();
+ int responseSerializedSize = serverReflectionResponse.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -1291,7 +1345,9 @@ public void onCompleted() {
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
- equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
+ equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort()),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize)))
.hasEventsSatisfyingExactly(
event ->
event
@@ -1326,6 +1382,8 @@ public void onCompleted() {
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
@@ -1375,13 +1433,12 @@ public void sayHello(
GreeterGrpc.GreeterBlockingStub client = GreeterGrpc.newBlockingStub(channel);
- Helloworld.Response response =
- testing()
- .runWithSpan(
- "parent",
- () -> client.sayHello(Helloworld.Request.newBuilder().setName("test").build()));
+ Helloworld.Request request = Helloworld.Request.newBuilder().setName("test").build();
+ Helloworld.Response response = testing().runWithSpan("parent", () -> client.sayHello(request));
assertThat(response.getMessage()).isEqualTo("Hello test");
+ int requestSerializedSize = request.getSerializedSize();
+ int responseSerializedSize = response.getSerializedSize();
testing()
.waitAndAssertTraces(
@@ -1401,6 +1458,8 @@ public void sayHello(
RpcIncubatingAttributes.RPC_GRPC_STATUS_CODE,
(long) Status.Code.OK.value()),
equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"),
+ equalTo(RPC_RESPONSE_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_REQUEST_BODY_SIZE, requestSerializedSize),
equalTo(ServerAttributes.SERVER_PORT, (long) server.getPort())))
.hasEventsSatisfyingExactly(
event ->
@@ -1433,6 +1492,8 @@ public void sayHello(
equalTo(ServerAttributes.SERVER_PORT, server.getPort()),
equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"),
equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"),
+ equalTo(RPC_REQUEST_BODY_SIZE, responseSerializedSize),
+ equalTo(RPC_RESPONSE_BODY_SIZE, requestSerializedSize),
satisfies(
NetworkAttributes.NETWORK_PEER_PORT,
val -> assertThat(val).isNotNull()))
diff --git a/instrumentation/jetty/jetty-11.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/Jetty11Singletons.java b/instrumentation/jetty/jetty-11.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/Jetty11Singletons.java
index 240a96c39aca..0e7fe4081a1e 100644
--- a/instrumentation/jetty/jetty-11.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/Jetty11Singletons.java
+++ b/instrumentation/jetty/jetty-11.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v11_0/Jetty11Singletons.java
@@ -24,6 +24,7 @@ public final class Jetty11Singletons {
ServletInstrumenterBuilder.create()
.addContextCustomizer(
(context, request, attributes) -> new AppServerBridge.Builder().init(context))
+ .propagateOperationListenersToOnEnd()
.build(INSTRUMENTATION_NAME, Servlet5Accessor.INSTANCE);
private static final JettyHelper HELPER =
diff --git a/instrumentation/jetty/jetty-8.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/Jetty8Singletons.java b/instrumentation/jetty/jetty-8.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/Jetty8Singletons.java
index ed503f12ab4e..fd26bb40a698 100644
--- a/instrumentation/jetty/jetty-8.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/Jetty8Singletons.java
+++ b/instrumentation/jetty/jetty-8.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/v8_0/Jetty8Singletons.java
@@ -24,6 +24,7 @@ public final class Jetty8Singletons {
ServletInstrumenterBuilder.create()
.addContextCustomizer(
(context, request, attributes) -> new AppServerBridge.Builder().init(context))
+ .propagateOperationListenersToOnEnd()
.build(INSTRUMENTATION_NAME, Servlet3Accessor.INSTANCE);
private static final JettyHelper HELPER =
diff --git a/instrumentation/liberty/liberty-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/LibertySingletons.java b/instrumentation/liberty/liberty-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/LibertySingletons.java
index 7468415faf50..7cfcb21c5538 100644
--- a/instrumentation/liberty/liberty-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/LibertySingletons.java
+++ b/instrumentation/liberty/liberty-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/liberty/LibertySingletons.java
@@ -24,6 +24,7 @@ public final class LibertySingletons {
.addContextCustomizer(
(context, request, attributes) ->
new AppServerBridge.Builder().recordException().init(context))
+ .propagateOperationListenersToOnEnd()
.build(INSTRUMENTATION_NAME, Servlet3Accessor.INSTANCE);
private static final LibertyHelper HELPER =
diff --git a/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java b/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java
index 8ac63c9aa873..36ebe81accbf 100644
--- a/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java
+++ b/instrumentation/r2dbc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/r2dbc/v1_0/R2dbcSingletons.java
@@ -7,8 +7,8 @@
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
-import io.opentelemetry.instrumentation.r2dbc.v1_0.R2dbcTelemetry;
-import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.R2dbcNetAttributesGetter;
+import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.R2dbcTelemetry;
+import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.internal.R2dbcNetAttributesGetter;
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
diff --git a/instrumentation/r2dbc-1.0/library-instrumentation-shaded/build.gradle.kts b/instrumentation/r2dbc-1.0/library-instrumentation-shaded/build.gradle.kts
index 7551f9c0cf68..4367637190c8 100644
--- a/instrumentation/r2dbc-1.0/library-instrumentation-shaded/build.gradle.kts
+++ b/instrumentation/r2dbc-1.0/library-instrumentation-shaded/build.gradle.kts
@@ -23,7 +23,11 @@ tasks {
}
relocate(
"io.r2dbc.proxy",
- "io.opentelemetry.instrumentation.r2dbc.v1_0.shaded.io.r2dbc.proxy"
+ "io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.io.r2dbc.proxy"
+ )
+ relocate(
+ "io.opentelemetry.instrumentation.r2dbc.v1_0",
+ "io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded"
)
}
diff --git a/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/JettyServlet3Test.groovy b/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/JettyServlet3Test.groovy
index ca3187fc446f..f2f93e4c2ef9 100644
--- a/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/JettyServlet3Test.groovy
+++ b/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/JettyServlet3Test.groovy
@@ -149,13 +149,6 @@ class JettyServlet3TestAsync extends JettyServlet3Test {
boolean isAsyncTest() {
true
}
-
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-3.0"
- }
}
class JettyServlet3TestFakeAsync extends JettyServlet3Test {
@@ -164,13 +157,6 @@ class JettyServlet3TestFakeAsync extends JettyServlet3Test {
Class servlet() {
TestServlet3.FakeAsync
}
-
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-3.0"
- }
}
class JettyServlet3TestForward extends JettyDispatchTest {
@@ -247,13 +233,6 @@ class JettyServlet3TestDispatchImmediate extends JettyDispatchTest {
true
}
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-3.0"
- }
-
@Override
protected void setupServlets(ServletContextHandler context) {
super.setupServlets(context)
@@ -283,13 +262,6 @@ class JettyServlet3TestDispatchAsync extends JettyDispatchTest {
true
}
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-3.0"
- }
-
@Override
protected void setupServlets(ServletContextHandler context) {
super.setupServlets(context)
diff --git a/instrumentation/servlet/servlet-5.0/javaagent/src/test/groovy/JettyServlet5Test.groovy b/instrumentation/servlet/servlet-5.0/javaagent/src/test/groovy/JettyServlet5Test.groovy
index d71f8ab8eab6..6b547b3dab93 100644
--- a/instrumentation/servlet/servlet-5.0/javaagent/src/test/groovy/JettyServlet5Test.groovy
+++ b/instrumentation/servlet/servlet-5.0/javaagent/src/test/groovy/JettyServlet5Test.groovy
@@ -123,13 +123,6 @@ class JettyServlet5TestAsync extends JettyServlet5Test {
boolean errorEndpointUsesSendError() {
false
}
-
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-5.0"
- }
}
@IgnoreIf({ !jvm.java11Compatible })
@@ -139,13 +132,6 @@ class JettyServlet5TestFakeAsync extends JettyServlet5Test {
Class servlet() {
TestServlet5.FakeAsync
}
-
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-5.0"
- }
}
@IgnoreIf({ !jvm.java11Compatible })
@@ -237,13 +223,6 @@ class JettyServlet5TestDispatchImmediate extends JettyDispatchTest {
addServlet(context, "/dispatch" + INDEXED_CHILD.path, TestServlet5.DispatchImmediate)
addServlet(context, "/dispatch/recursive", TestServlet5.DispatchRecursive)
}
-
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-5.0"
- }
}
@IgnoreIf({ !jvm.java11Compatible })
@@ -275,13 +254,6 @@ class JettyServlet5TestDispatchAsync extends JettyDispatchTest {
boolean errorEndpointUsesSendError() {
false
}
-
- @Override
- String getMetricsInstrumentationName() {
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- "io.opentelemetry.servlet-5.0"
- }
}
abstract class JettyDispatchTest extends JettyServlet5Test {
diff --git a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java
index 8aa9339e7c6b..10b221f613a1 100644
--- a/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java
+++ b/instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/ServletInstrumenterBuilder.java
@@ -14,6 +14,7 @@
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
+import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
@@ -31,6 +32,8 @@ private ServletInstrumenterBuilder() {}
private final List>> contextCustomizers =
new ArrayList<>();
+ private boolean propagateOperationListenersToOnEnd;
+
public static ServletInstrumenterBuilder create() {
return new ServletInstrumenterBuilder<>();
}
@@ -42,6 +45,12 @@ public ServletInstrumenterBuilder addContextCustomizer(
return this;
}
+ @CanIgnoreReturnValue
+ public ServletInstrumenterBuilder propagateOperationListenersToOnEnd() {
+ propagateOperationListenersToOnEnd = true;
+ return this;
+ }
+
public Instrumenter, ServletResponseContext> build(
String instrumentationName,
ServletAccessor accessor,
@@ -85,6 +94,9 @@ public Instrumenter, ServletResponseContext(accessor));
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/README.md b/instrumentation/spring/spring-boot-autoconfigure-3/README.md
deleted file mode 100644
index 50b65c80adf9..000000000000
--- a/instrumentation/spring/spring-boot-autoconfigure-3/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Why do we need a separate module for Spring Boot 3 auto-configuration?
-
-`RestClientInstrumentationAutoConfiguration` imports `RestClientCustomizer`,
-which is part of Spring Boot 3 (rather than Spring framework).
-
-If we were to include this in the `spring-boot-autoconfigure` module, we would have to
-bump the Spring Boot version to 3, which would break compatibility with Spring Boot 2.
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure-3/build.gradle.kts
deleted file mode 100644
index 17e54b614de3..000000000000
--- a/instrumentation/spring/spring-boot-autoconfigure-3/build.gradle.kts
+++ /dev/null
@@ -1,24 +0,0 @@
-plugins {
- id("otel.library-instrumentation")
-}
-
-// Name the Spring Boot modules in accordance with https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration.custom-starter
-base.archivesName.set("opentelemetry-spring-boot-3")
-group = "io.opentelemetry.instrumentation"
-
-otelJava {
- minJavaVersionSupported.set(JavaVersion.VERSION_17)
-}
-
-dependencies {
- val springBootVersion = "3.2.4"
- library("org.springframework.boot:spring-boot-starter-web:$springBootVersion")
- compileOnly(project(":instrumentation:spring:spring-boot-autoconfigure"))
- implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
- implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library"))
-
- testImplementation(project(":instrumentation:spring:spring-boot-autoconfigure"))
- testLibrary("org.springframework.boot:spring-boot-starter-test:$springBootVersion") {
- exclude("org.junit.vintage", "junit-vintage-engine")
- }
-}
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/resources/META-INF/spring.factories b/instrumentation/spring/spring-boot-autoconfigure-3/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 3aa46add58d1..000000000000
--- a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,2 +0,0 @@
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web.RestClientInstrumentationAutoConfiguration
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/instrumentation/spring/spring-boot-autoconfigure-3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
deleted file mode 100644
index 576dd0fab37a..000000000000
--- a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ /dev/null
@@ -1 +0,0 @@
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web.RestClientInstrumentationAutoConfiguration
diff --git a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts
index 4356534ad15e..dafd20b4f923 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts
+++ b/instrumentation/spring/spring-boot-autoconfigure/build.gradle.kts
@@ -1,9 +1,9 @@
plugins {
id("otel.library-instrumentation")
+ id("otel.japicmp-conventions")
}
-// Name the Spring Boot modules in accordance with https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration.custom-starter
-base.archivesName.set("opentelemetry-spring-boot")
+base.archivesName.set("opentelemetry-spring-boot-autoconfigure")
group = "io.opentelemetry.instrumentation"
val springBootVersion = "2.7.18" // AutoConfiguration is added in 2.7.0, but can be used with older versions
@@ -18,6 +18,17 @@ sourceSets {
"builtBy" to ":instrumentation:r2dbc-1.0:library-instrumentation-shaded:extractShadowJarSpring",
)
}
+ create("javaSpring3") {
+ java {
+ setSrcDirs(listOf("src/main/javaSpring3"))
+ }
+ }
+}
+
+configurations {
+ named("javaSpring3CompileOnly") {
+ extendsFrom(configurations["compileOnly"])
+ }
}
dependencies {
@@ -33,9 +44,7 @@ dependencies {
implementation(project(":instrumentation:spring:spring-kafka-2.7:library"))
implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library"))
implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-5.3:library"))
- implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
compileOnly("javax.servlet:javax.servlet-api:3.1.0")
- compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0")
implementation(project(":instrumentation:spring:spring-webflux:spring-webflux-5.3:library"))
implementation(project(":instrumentation:micrometer:micrometer-1.5:library"))
implementation(project(":instrumentation:log4j:log4j-appender-2.17:library"))
@@ -84,6 +93,16 @@ dependencies {
testImplementation("io.opentelemetry:opentelemetry-exporter-otlp")
testImplementation("io.opentelemetry:opentelemetry-exporter-zipkin")
testImplementation(project(":instrumentation-annotations"))
+
+ // needed for the Spring Boot 3 support
+ implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
+
+ // give access to common classes, e.g. InstrumentationConfigUtil
+ add("javaSpring3CompileOnly", files(sourceSets.main.get().output.classesDirs))
+ add("javaSpring3CompileOnly", "org.springframework.boot:spring-boot-starter-web:3.2.4")
+ add("javaSpring3CompileOnly", "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
+ add("javaSpring3CompileOnly", project(":instrumentation:spring:spring-web:spring-web-3.1:library"))
+ add("javaSpring3CompileOnly", project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
}
val latestDepTest = findProperty("testLatestDeps") as Boolean
@@ -95,6 +114,9 @@ if (latestDepTest) {
}
}
+val testJavaVersion = gradle.startParameter.projectProperties["testJavaVersion"]?.let(JavaVersion::toVersion)
+val testSpring3 = (testJavaVersion == null || testJavaVersion.compareTo(JavaVersion.VERSION_17) >= 0)
+
testing {
suites {
val testLogbackAppender by registering(JvmTestSuite::class) {
@@ -120,9 +142,7 @@ testing {
}
}
}
- }
- suites {
val testLogbackMissing by registering(JvmTestSuite::class) {
dependencies {
implementation(project())
@@ -135,6 +155,20 @@ testing {
}
}
}
+
+ val testSpring3 by registering(JvmTestSuite::class) {
+ dependencies {
+ implementation(project())
+ implementation("org.springframework.boot:spring-boot-starter-web:3.2.4")
+ implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
+ implementation(project(":instrumentation:spring:spring-web:spring-web-3.1:library"))
+ implementation(project(":instrumentation:spring:spring-webmvc:spring-webmvc-6.0:library"))
+ implementation("jakarta.servlet:jakarta.servlet-api:5.0.0")
+ implementation("org.springframework.boot:spring-boot-starter-test:3.2.4") {
+ exclude("org.junit.vintage", "junit-vintage-engine")
+ }
+ }
+ }
}
}
@@ -160,4 +194,24 @@ tasks {
jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
}
+
+ named("compileJavaSpring3Java") {
+ sourceCompatibility = "17"
+ targetCompatibility = "17"
+ options.release.set(17)
+ }
+
+ named("compileTestSpring3Java") {
+ sourceCompatibility = "17"
+ targetCompatibility = "17"
+ options.release.set(17)
+ }
+
+ named("testSpring3") {
+ isEnabled = testSpring3
+ }
+
+ withType(Jar::class) {
+ from(sourceSets["javaSpring3"].output)
+ }
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/gradle.properties b/instrumentation/spring/spring-boot-autoconfigure/gradle.properties
new file mode 100644
index 000000000000..45d64bec279d
--- /dev/null
+++ b/instrumentation/spring/spring-boot-autoconfigure/gradle.properties
@@ -0,0 +1 @@
+otel.stable=true
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EnableOpenTelemetry.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EnableOpenTelemetry.java
deleted file mode 100644
index 8a5b2b95c9fa..000000000000
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/EnableOpenTelemetry.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.instrumentation.spring.autoconfigure;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-
-/** Auto-configures OpenTelemetry. Enables OpenTelemetry in Spring applications */
-@Configuration
-@ComponentScan(basePackages = "io.opentelemetry.instrumentation.spring.autoconfigure")
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface EnableOpenTelemetry {}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationConfigUtil.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationConfigUtil.java
deleted file mode 100644
index 0fec424a5e85..000000000000
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/InstrumentationConfigUtil.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.instrumentation.spring.autoconfigure.internal;
-
-import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
-
-/**
- * This class is internal and is hence not for public use. Its APIs are unstable and can change at
- * any time.
- */
-public class InstrumentationConfigUtil {
- private InstrumentationConfigUtil() {}
-
- public static boolean isStatementSanitizationEnabled(ConfigProperties config, String key) {
- return config.getBoolean(
- key, config.getBoolean("otel.instrumentation.common.db-statement-sanitizer.enabled", true));
- }
-}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationAnnotationsAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationAnnotationsAutoConfiguration.java
similarity index 82%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationAnnotationsAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationAnnotationsAutoConfiguration.java
index 052f499d4a1c..0e8081622388 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationAnnotationsAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationAnnotationsAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.annotations.WithSpan;
@@ -15,7 +15,12 @@
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
-/** Configures {@link WithSpanAspect} to trace bean methods annotated with {@link WithSpan}. */
+/**
+ * Configures {@link WithSpanAspect} to trace bean methods annotated with {@link WithSpan}.
+ *
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change
+ * at any time.
+ */
@ConditionalOnEnabledInstrumentation(module = "annotations")
@ConditionalOnClass(Aspect.class)
@Configuration
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationWithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java
similarity index 96%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationWithSpanAspect.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java
index 5cf80fce7ecc..90c8c2e229d5 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationWithSpanAspect.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspect.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import io.opentelemetry.api.OpenTelemetry;
import org.aspectj.lang.ProceedingJoinPoint;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/JoinPointRequest.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JoinPointRequest.java
similarity index 98%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/JoinPointRequest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JoinPointRequest.java
index a308bc80fd12..01a6a62d9894 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/JoinPointRequest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JoinPointRequest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.annotations.WithSpan;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/JointPointCodeAttributesExtractor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JointPointCodeAttributesExtractor.java
similarity index 94%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/JointPointCodeAttributesExtractor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JointPointCodeAttributesExtractor.java
index 1077a35c07ce..c0dc1f8be230 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/JointPointCodeAttributesExtractor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/JointPointCodeAttributesExtractor.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesGetter;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/WithSpanAspect.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java
similarity index 98%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/WithSpanAspect.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java
index 246deef6f61a..f804a820924f 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/WithSpanAspect.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspect.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/WithSpanAspectParameterAttributeNamesExtractor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspectParameterAttributeNamesExtractor.java
similarity index 98%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/WithSpanAspectParameterAttributeNamesExtractor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspectParameterAttributeNamesExtractor.java
index 6c81c7dde0df..7471986cf009 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/WithSpanAspectParameterAttributeNamesExtractor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/WithSpanAspectParameterAttributeNamesExtractor.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import io.opentelemetry.instrumentation.annotations.SpanAttribute;
import io.opentelemetry.instrumentation.api.annotation.support.ParameterAttributeNamesExtractor;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/jdbc/DataSourcePostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java
similarity index 96%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/jdbc/DataSourcePostProcessor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java
index d733caa22b43..875bfa3509b7 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/jdbc/DataSourcePostProcessor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/DataSourcePostProcessor.java
@@ -3,12 +3,12 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.jdbc.datasource.JdbcTelemetry;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.InstrumentationConfigUtil;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import javax.sql.DataSource;
import org.springframework.aop.scope.ScopedProxyUtils;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java
similarity index 90%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java
index 2e012f97687c..3ec55a5a06c2 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/jdbc/JdbcInstrumentationAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
@@ -16,6 +16,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnEnabledInstrumentation(module = "jdbc")
@AutoConfiguration(after = DataSourceAutoConfiguration.class)
@ConditionalOnBean({DataSource.class})
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java
similarity index 98%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java
index c746a72014c9..0842052409e7 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/ConcurrentKafkaListenerContainerFactoryPostProcessor.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.kafka;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.kafka.v2_7.SpringKafkaTelemetry;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java
similarity index 92%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java
index 1eab4c4e6346..739e0275201c 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.kafka;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.kafkaclients.v2_6.KafkaTelemetry;
@@ -17,6 +17,10 @@
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.KafkaTemplate;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnEnabledInstrumentation(module = "kafka")
@ConditionalOnClass({KafkaTemplate.class, ConcurrentKafkaListenerContainerFactory.class})
@Configuration
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderApplicationListener.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderApplicationListener.java
similarity index 93%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderApplicationListener.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderApplicationListener.java
index 646e8119bc01..442b4715bbd9 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderApplicationListener.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderApplicationListener.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
@@ -13,6 +13,10 @@
import org.springframework.context.event.GenericApplicationListener;
import org.springframework.core.ResolvableType;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
public class LogbackAppenderApplicationListener implements GenericApplicationListener {
private static final Class>[] SOURCE_TYPES = {
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderInstaller.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java
similarity index 99%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderInstaller.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java
index 811dacb31bf7..ceda38ec66c3 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderInstaller.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderInstaller.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/OpenTelemetryAppenderAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/OpenTelemetryAppenderAutoConfiguration.java
similarity index 91%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/OpenTelemetryAppenderAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/OpenTelemetryAppenderAutoConfiguration.java
index b9bb519f61ce..7fae726c9fb8 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/OpenTelemetryAppenderAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/OpenTelemetryAppenderAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
@@ -13,6 +13,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@Configuration
@SuppressWarnings("OtelPrivateConstructorForUtilityClass")
public class OpenTelemetryAppenderAutoConfiguration {
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java
similarity index 91%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java
index 8be9811fa84d..703051d24146 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.micrometer;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.micrometer;
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.MeterRegistry;
@@ -19,6 +19,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnEnabledInstrumentation(module = "micrometer", enabledByDefault = false)
@AutoConfigureAfter(MetricsAutoConfiguration.class)
@AutoConfigureBefore(CompositeMeterRegistryAutoConfiguration.class)
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java
similarity index 89%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java
index 0eee74e37965..1fbfdbfb0178 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/mongo/MongoClientInstrumentationAutoConfiguration.java
@@ -3,13 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.mongo;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.mongo;
import com.mongodb.MongoClientSettings;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.InstrumentationConfigUtil;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -17,6 +17,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnBean(OpenTelemetry.class)
@ConditionalOnClass(MongoClientSettings.class)
@ConditionalOnEnabledInstrumentation(module = "mongo")
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java
similarity index 90%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java
index 5c9a3b62665a..d744b8fe1dc4 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentationAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.r2dbc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
@@ -15,6 +15,10 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnBean(OpenTelemetry.class)
@ConditionalOnClass(ConnectionFactory.class)
@ConditionalOnEnabledInstrumentation(module = "r2dbc")
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java
similarity index 93%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java
index d3bddb3d8055..5d75b28946ef 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2dbcInstrumentingPostProcessor.java
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.r2dbc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc;
import io.opentelemetry.api.OpenTelemetry;
-import io.opentelemetry.instrumentation.r2dbc.v1_0.R2dbcTelemetry;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.InstrumentationConfigUtil;
+import io.opentelemetry.instrumentation.r2dbc.v1_0.internal.shaded.R2dbcTelemetry;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.ConnectionFactoryOptions;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestTemplateBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java
similarity index 97%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestTemplateBeanPostProcessor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java
index 096e97c83061..0cda4b63d686 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestTemplateBeanPostProcessor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateBeanPostProcessor.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestTemplateInstrumentation.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java
similarity index 94%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestTemplateInstrumentation.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java
index deb84cfcc23b..9465c534d0ce 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestTemplateInstrumentation.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestTemplateInstrumentation.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
@@ -24,7 +24,7 @@ static RestTemplate addIfNotPresent(
RestTemplate restTemplate, OpenTelemetry openTelemetry, ConfigProperties config) {
ClientHttpRequestInterceptor instrumentationInterceptor =
- InstrumentationConfigUtil.configureBuilder(
+ InstrumentationConfigUtil.configureClientBuilder(
config,
SpringWebTelemetry.builder(openTelemetry),
WebTelemetryUtil.getBuilderExtractor())
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java
similarity index 91%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java
index 7fed019fe527..c4f692607eff 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
@@ -18,7 +18,10 @@
/**
* Configures {@link RestTemplate} for tracing.
*
- *
Adds Open Telemetry instrumentation to RestTemplate beans after initialization
+ *
Adds Open Telemetry instrumentation to RestTemplate beans after initialization.
+ *
+ *
This class is internal and is hence not for public use. Its APIs are unstable and can change
+ * at any time.
*/
@ConditionalOnEnabledInstrumentation(module = "spring-web")
@ConditionalOnClass(RestTemplate.class)
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java
similarity index 67%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java
index cfd5f5eb5ed7..bdf00acf732b 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfiguration.java
@@ -3,11 +3,11 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
-import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
@@ -18,7 +18,10 @@
/**
* Configures {@link WebClient} for tracing.
*
- *
Adds Open Telemetry instrumentation to WebClient beans after initialization
+ *
Adds Open Telemetry instrumentation to WebClient beans after initialization.
+ *
+ *
This class is internal and is hence not for public use. Its APIs are unstable and can change
+ * at any time.
*/
@ConditionalOnEnabledInstrumentation(module = "spring-webflux")
@ConditionalOnClass(WebClient.class)
@@ -30,14 +33,14 @@ public SpringWebfluxInstrumentationAutoConfiguration() {}
// static to avoid "is not eligible for getting processed by all BeanPostProcessors" warning
@Bean
static WebClientBeanPostProcessor otelWebClientBeanPostProcessor(
- ObjectProvider openTelemetryProvider) {
- return new WebClientBeanPostProcessor(openTelemetryProvider);
+ ObjectProvider openTelemetryProvider,
+ ObjectProvider configPropertiesProvider) {
+ return new WebClientBeanPostProcessor(openTelemetryProvider, configPropertiesProvider);
}
@Bean
- WebFilter telemetryFilter(OpenTelemetry openTelemetry) {
- return SpringWebfluxTelemetry.builder(openTelemetry)
- .build()
+ WebFilter telemetryFilter(OpenTelemetry openTelemetry, ConfigProperties config) {
+ return WebClientBeanPostProcessor.getWebfluxTelemetry(openTelemetry, config)
.createWebFilterAndRegisterReactorHook();
}
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java
similarity index 58%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java
index 1ee2c56c1da0..90dde820c4a9 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessor.java
@@ -3,10 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux;
import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetry;
+import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.SpringWebfluxBuilderUtil;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.web.reactive.function.client.WebClient;
@@ -19,9 +22,23 @@
final class WebClientBeanPostProcessor implements BeanPostProcessor {
private final ObjectProvider openTelemetryProvider;
+ private final ObjectProvider configPropertiesProvider;
- WebClientBeanPostProcessor(ObjectProvider openTelemetryProvider) {
+ WebClientBeanPostProcessor(
+ ObjectProvider openTelemetryProvider,
+ ObjectProvider configPropertiesProvider) {
this.openTelemetryProvider = openTelemetryProvider;
+ this.configPropertiesProvider = configPropertiesProvider;
+ }
+
+ static SpringWebfluxTelemetry getWebfluxTelemetry(
+ OpenTelemetry openTelemetry, ConfigProperties config) {
+ return InstrumentationConfigUtil.configureClientAndServerBuilder(
+ config,
+ SpringWebfluxTelemetry.builder(openTelemetry),
+ SpringWebfluxBuilderUtil.getClientBuilderExtractor(),
+ SpringWebfluxBuilderUtil.getServerBuilderExtractor())
+ .build();
}
@Override
@@ -38,7 +55,8 @@ public Object postProcessAfterInitialization(Object bean, String beanName) {
private WebClient.Builder wrapBuilder(WebClient.Builder webClientBuilder) {
SpringWebfluxTelemetry instrumentation =
- SpringWebfluxTelemetry.create(openTelemetryProvider.getObject());
+ getWebfluxTelemetry(
+ openTelemetryProvider.getObject(), configPropertiesProvider.getObject());
return webClientBuilder.filters(instrumentation::addClientTracingFilter);
}
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java
similarity index 58%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java
index a57d2ab79df5..4d296a675478 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc5InstrumentationAutoConfiguration.java
@@ -3,11 +3,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetry;
+import io.opentelemetry.instrumentation.spring.webmvc.v5_3.internal.SpringMvcBuilderUtil;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import javax.servlet.Filter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
@@ -15,6 +18,10 @@
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.DispatcherServlet;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnEnabledInstrumentation(module = "spring-webmvc")
@ConditionalOnClass({Filter.class, OncePerRequestFilter.class, DispatcherServlet.class})
@Configuration
@@ -22,7 +29,12 @@
public class SpringWebMvc5InstrumentationAutoConfiguration {
@Bean
- Filter otelWebMvcFilter(OpenTelemetry openTelemetry) {
- return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter();
+ Filter otelWebMvcFilter(OpenTelemetry openTelemetry, ConfigProperties config) {
+ return InstrumentationConfigUtil.configureServerBuilder(
+ config,
+ SpringWebMvcTelemetry.builder(openTelemetry),
+ SpringMvcBuilderUtil.getBuilderExtractor())
+ .build()
+ .createServletFilter();
}
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java
index 692f7296b375..747cf33dcb09 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/InstrumentationConfigUtil.java
@@ -7,6 +7,7 @@
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import java.util.function.Function;
@@ -15,15 +16,48 @@
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
-public class InstrumentationConfigUtil {
+public final class InstrumentationConfigUtil {
private InstrumentationConfigUtil() {}
@CanIgnoreReturnValue
- public static T configureBuilder(
+ public static
+ T configureClientAndServerBuilder(
+ ConfigProperties config,
+ T builder,
+ Function>
+ getClientBuilder,
+ Function>
+ getServerBuilder) {
+ CommonConfig commonConfig = getConfig(config);
+ getClientBuilder.apply(builder).configure(commonConfig);
+ getServerBuilder.apply(builder).configure(commonConfig);
+ return builder;
+ }
+
+ @CanIgnoreReturnValue
+ public static T configureClientBuilder(
ConfigProperties config,
T builder,
Function> getBuilder) {
- getBuilder.apply(builder).configure(new CommonConfig(new ConfigPropertiesBridge(config)));
+ getBuilder.apply(builder).configure(getConfig(config));
+ return builder;
+ }
+
+ @CanIgnoreReturnValue
+ public static T configureServerBuilder(
+ ConfigProperties config,
+ T builder,
+ Function> getBuilder) {
+ getBuilder.apply(builder).configure(getConfig(config));
return builder;
}
+
+ private static CommonConfig getConfig(ConfigProperties config) {
+ return new CommonConfig(new ConfigPropertiesBridge(config));
+ }
+
+ public static boolean isStatementSanitizationEnabled(ConfigProperties config, String key) {
+ return config.getBoolean(
+ key, config.getBoolean("otel.instrumentation.common.db-statement-sanitizer.enabled", true));
+ }
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/OpenTelemetryAnnotationsRuntimeHints.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/OpenTelemetryAnnotationsRuntimeHints.java
new file mode 100644
index 000000000000..79a9fad3c069
--- /dev/null
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/OpenTelemetryAnnotationsRuntimeHints.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
+
+import org.springframework.aot.hint.MemberCategory;
+import org.springframework.aot.hint.RuntimeHints;
+import org.springframework.aot.hint.RuntimeHintsRegistrar;
+import org.springframework.aot.hint.TypeReference;
+
+class OpenTelemetryAnnotationsRuntimeHints implements RuntimeHintsRegistrar {
+
+ @Override
+ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
+ hints
+ .reflection()
+ .registerType(
+ TypeReference.of(
+ "io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations.InstrumentationWithSpanAspect"),
+ hint -> hint.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS));
+ }
+}
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientBeanPostProcessor.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java
similarity index 93%
rename from instrumentation/spring/spring-boot-autoconfigure-3/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientBeanPostProcessor.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java
index 469fdfadd741..8ebefdd655f6 100644
--- a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientBeanPostProcessor.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientBeanPostProcessor.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
@@ -15,7 +15,7 @@
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestClient;
-public final class RestClientBeanPostProcessor implements BeanPostProcessor {
+final class RestClientBeanPostProcessor implements BeanPostProcessor {
private final ObjectProvider openTelemetryProvider;
private final ObjectProvider configPropertiesProvider;
@@ -56,7 +56,7 @@ private static RestClient addRestClientInterceptorIfNotPresent(
static ClientHttpRequestInterceptor getInterceptor(
OpenTelemetry openTelemetry, ConfigProperties config) {
- return InstrumentationConfigUtil.configureBuilder(
+ return InstrumentationConfigUtil.configureClientBuilder(
config,
SpringWebTelemetry.builder(openTelemetry),
WebTelemetryUtil.getBuilderExtractor())
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java
similarity index 91%
rename from instrumentation/spring/spring-boot-autoconfigure-3/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientInstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java
index f261dbcd2324..10c8387eecd4 100644
--- a/instrumentation/spring/spring-boot-autoconfigure-3/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientInstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfiguration.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
@@ -20,7 +20,10 @@
/**
* Configures {@link RestClient} for tracing.
*
- * Adds Open Telemetry instrumentation to {@link RestClient} beans after initialization
+ *
Adds Open Telemetry instrumentation to {@link RestClient} beans after initialization.
+ *
+ *
This class is internal and is hence not for public use. Its APIs are unstable and can change
+ * at any time.
*/
@ConditionalOnEnabledInstrumentation(module = "spring-web")
@ConditionalOnClass(RestClient.class)
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java
similarity index 58%
rename from instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java
index ca68d0e90d19..de4007900d5d 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/javaSpring3/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvc6InstrumentationAutoConfiguration.java
@@ -3,11 +3,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.InstrumentationConfigUtil;
import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetry;
+import io.opentelemetry.instrumentation.spring.webmvc.v6_0.internal.SpringMvcBuilderUtil;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import jakarta.servlet.Filter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
@@ -15,6 +18,10 @@
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.DispatcherServlet;
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
@ConditionalOnEnabledInstrumentation(module = "spring-webmvc")
@ConditionalOnClass({Filter.class, OncePerRequestFilter.class, DispatcherServlet.class})
@Configuration
@@ -22,7 +29,12 @@
public class SpringWebMvc6InstrumentationAutoConfiguration {
@Bean
- Filter otelWebMvcFilter(OpenTelemetry openTelemetry) {
- return SpringWebMvcTelemetry.create(openTelemetry).createServletFilter();
+ Filter otelWebMvcFilter(OpenTelemetry openTelemetry, ConfigProperties config) {
+ return InstrumentationConfigUtil.configureServerBuilder(
+ config,
+ SpringWebMvcTelemetry.builder(openTelemetry),
+ SpringMvcBuilderUtil.getBuilderExtractor())
+ .build()
+ .createServletFilter();
}
}
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 1bd1e0c59f07..3b309aae4739 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -279,6 +279,12 @@
"description": "Enables the DB statement sanitization.",
"defaultValue": true
},
+ {
+ "name": "otel.instrumentation.common.default-enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enables all instrumentations. Set to false to disable all instrumentations and then enable specific modules individually, e.g. otel.instrumentation.jdbc.enabled=true.",
+ "defaultValue": true
+ },
{
"name": "otel.instrumentation.common.peer-service-mapping",
"type": "java.util.Map",
@@ -306,6 +312,22 @@
"description": "Configures the instrumentation to recognize an alternative set of HTTP request methods. All other methods will be treated as _OTHER.",
"defaultValue": "CONNECT,DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT,TRACE"
},
+ {
+ "name": "otel.instrumentation.http.server.capture-request-headers",
+ "type": "java.util.List",
+ "description": "List of HTTP request headers to capture in HTTP servers."
+ },
+ {
+ "name": "otel.instrumentation.http.server.capture-response-headers",
+ "type": "java.util.List",
+ "description": "List of HTTP response headers to capture in HTTP servers."
+ },
+ {
+ "name": "otel.instrumentation.http.server.emit-experimental-telemetry",
+ "type": "java.lang.Boolean",
+ "description": "Enable the capture of experimental HTTP server telemetry. Add the http.request.body.size and http.response.body.size attributes to spans, and record the http.server.request.body.size and http.server.response.body.size metrics.",
+ "defaultValue": false
+ },
{
"name": "otel.instrumentation.jdbc.enabled",
"type": "java.lang.Boolean",
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
index 9ad2f41464f5..b389d6a1e381 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
@@ -1,15 +1,15 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations.InstrumentationAnnotationsAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka.KafkaInstrumentationAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging.OpenTelemetryAppenderAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc.JdbcInstrumentationAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.micrometer.MicrometerBridgeAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.r2dbc.R2dbcInstrumentationAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web.SpringWebInstrumentationAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration,\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc.SpringWebMvc5InstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations.InstrumentationAnnotationsAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.kafka.KafkaInstrumentationAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.OpenTelemetryAppenderAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc.JdbcInstrumentationAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.micrometer.MicrometerBridgeAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc.R2dbcInstrumentationAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.SpringWebInstrumentationAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration,\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc.SpringWebMvc5InstrumentationAutoConfiguration
org.springframework.context.ApplicationListener=\
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging.LogbackAppenderApplicationListener
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.LogbackAppenderApplicationListener
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/aot.factories b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/aot.factories
new file mode 100644
index 000000000000..8d199e0f8345
--- /dev/null
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/aot.factories
@@ -0,0 +1,2 @@
+org.springframework.aot.hint.RuntimeHintsRegistrar=\
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations.OpenTelemetryAnnotationsRuntimeHints
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 4d7a3f31c3b4..227a59072e48 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,11 +1,12 @@
io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations.InstrumentationAnnotationsAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka.KafkaInstrumentationAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging.OpenTelemetryAppenderAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.jdbc.JdbcInstrumentationAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.micrometer.MicrometerBridgeAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.r2dbc.R2dbcInstrumentationAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web.SpringWebInstrumentationAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration
-io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc.SpringWebMvc6InstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations.InstrumentationAnnotationsAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.kafka.KafkaInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.OpenTelemetryAppenderAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.jdbc.JdbcInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.micrometer.MicrometerBridgeAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc.R2dbcInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.SpringWebInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web.RestClientInstrumentationAutoConfiguration
+io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc.SpringWebMvc6InstrumentationAutoConfiguration
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationAnnotationsAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationAnnotationsAutoConfigurationTest.java
similarity index 97%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationAnnotationsAutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationAnnotationsAutoConfigurationTest.java
index a625252eacef..f55e5c13f406 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationAnnotationsAutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationAnnotationsAutoConfigurationTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationWithSpanAspectTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspectTest.java
similarity index 99%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationWithSpanAspectTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspectTest.java
index 69f71af6d71b..0b4294895d7c 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/annotations/InstrumentationWithSpanAspectTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/annotations/InstrumentationWithSpanAspectTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.annotations;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.annotations;
import static io.opentelemetry.api.common.AttributeKey.stringKey;
import static io.opentelemetry.api.trace.SpanKind.CLIENT;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/micrometer/MicrometerBridgeAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfigurationTest.java
similarity index 98%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/micrometer/MicrometerBridgeAutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfigurationTest.java
index 753e660bf72e..5a32e2951d98 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/micrometer/MicrometerBridgeAutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/micrometer/MicrometerBridgeAutoConfigurationTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.micrometer;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.micrometer;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java
similarity index 98%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java
index b7bc9a25b997..3c3ec9c0d665 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/r2dbc/R2DbcInstrumentationAutoConfigurationTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.r2dbc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.r2dbc;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/SpringWebInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfigurationTest.java
similarity index 99%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/SpringWebInstrumentationAutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfigurationTest.java
index 9091047c8432..53bbd882a6d2 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/SpringWebInstrumentationAutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/SpringWebInstrumentationAutoConfigurationTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java
similarity index 83%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java
index aeecebf37807..d75814732785 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/SpringWebfluxInstrumentationAutoConfigurationTest.java
@@ -3,11 +3,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
+import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
+import java.util.Collections;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -17,6 +20,9 @@ class SpringWebfluxInstrumentationAutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withBean(OpenTelemetry.class, OpenTelemetry::noop)
+ .withBean(
+ ConfigProperties.class,
+ () -> DefaultConfigProperties.createFromMap(Collections.emptyMap()))
.withConfiguration(
AutoConfigurations.of(SpringWebfluxInstrumentationAutoConfiguration.class));
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessorTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java
similarity index 75%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessorTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java
index 55abca473a01..821f0fbfb647 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webflux/WebClientBeanPostProcessorTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webflux/WebClientBeanPostProcessorTest.java
@@ -3,11 +3,14 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webflux;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
+import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
+import java.util.Collections;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanPostProcessor;
@@ -20,6 +23,8 @@ class WebClientBeanPostProcessorTest {
static {
beanFactory.registerSingleton("openTelemetry", OpenTelemetry.noop());
+ beanFactory.registerSingleton(
+ "configProperties", DefaultConfigProperties.createFromMap(Collections.emptyMap()));
}
@Test
@@ -27,7 +32,9 @@ class WebClientBeanPostProcessorTest {
"when processed bean is NOT of type WebClient or WebClientBuilder should return Object")
void returnsObject() {
BeanPostProcessor underTest =
- new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
+ new WebClientBeanPostProcessor(
+ beanFactory.getBeanProvider(OpenTelemetry.class),
+ beanFactory.getBeanProvider(ConfigProperties.class));
assertThat(underTest.postProcessAfterInitialization(new Object(), "testObject"))
.isExactlyInstanceOf(Object.class);
@@ -37,7 +44,9 @@ void returnsObject() {
@DisplayName("when processed bean is of type WebClient should return WebClient")
void returnsWebClient() {
BeanPostProcessor underTest =
- new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
+ new WebClientBeanPostProcessor(
+ beanFactory.getBeanProvider(OpenTelemetry.class),
+ beanFactory.getBeanProvider(ConfigProperties.class));
assertThat(underTest.postProcessAfterInitialization(WebClient.create(), "testWebClient"))
.isInstanceOf(WebClient.class);
@@ -47,7 +56,9 @@ void returnsWebClient() {
@DisplayName("when processed bean is of type WebClientBuilder should return WebClientBuilder")
void returnsWebClientBuilder() {
BeanPostProcessor underTest =
- new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
+ new WebClientBeanPostProcessor(
+ beanFactory.getBeanProvider(OpenTelemetry.class),
+ beanFactory.getBeanProvider(ConfigProperties.class));
assertThat(
underTest.postProcessAfterInitialization(WebClient.builder(), "testWebClientBuilder"))
@@ -58,7 +69,9 @@ void returnsWebClientBuilder() {
@DisplayName("when processed bean is of type WebClient should add exchange filter to WebClient")
void addsExchangeFilterWebClient() {
BeanPostProcessor underTest =
- new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
+ new WebClientBeanPostProcessor(
+ beanFactory.getBeanProvider(OpenTelemetry.class),
+ beanFactory.getBeanProvider(ConfigProperties.class));
WebClient webClient = WebClient.create();
Object processedWebClient =
@@ -81,7 +94,9 @@ void addsExchangeFilterWebClient() {
"when processed bean is of type WebClientBuilder should add ONE exchange filter to WebClientBuilder")
void addsExchangeFilterWebClientBuilder() {
BeanPostProcessor underTest =
- new WebClientBeanPostProcessor(beanFactory.getBeanProvider(OpenTelemetry.class));
+ new WebClientBeanPostProcessor(
+ beanFactory.getBeanProvider(OpenTelemetry.class),
+ beanFactory.getBeanProvider(ConfigProperties.class));
WebClient.Builder webClientBuilder = WebClient.builder();
underTest.postProcessAfterInitialization(webClientBuilder, "testWebClientBuilder");
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java
similarity index 82%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java
index fffc164eabfd..62112774516e 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation5AutoConfigurationTest.java
@@ -3,12 +3,15 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
+import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
+import java.util.Collections;
import javax.servlet.Filter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -20,6 +23,9 @@ class SpringWebMvcInstrumentation5AutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withBean(OpenTelemetry.class, OpenTelemetry::noop)
+ .withBean(
+ ConfigProperties.class,
+ () -> DefaultConfigProperties.createFromMap(Collections.emptyMap()))
.withConfiguration(
AutoConfigurations.of(SpringWebMvc5InstrumentationAutoConfiguration.class));
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/properties/OtlpExporterPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/OtlpExporterPropertiesTest.java
similarity index 88%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/properties/OtlpExporterPropertiesTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/OtlpExporterPropertiesTest.java
index 4146a76a090f..2fea20afec6e 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/properties/OtlpExporterPropertiesTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/OtlpExporterPropertiesTest.java
@@ -3,16 +3,12 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.properties;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelResourceProperties;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtlpExporterProperties;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.PropagationProperties;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.SpringConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import java.util.Arrays;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/DistroVersionResourceProviderTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProviderTest.java
similarity index 95%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/DistroVersionResourceProviderTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProviderTest.java
index 1454354fdbcf..1c79c06de6f8 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/DistroVersionResourceProviderTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/DistroVersionResourceProviderTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.resources;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringConfigPropertiesTest.java
similarity index 97%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringConfigPropertiesTest.java
index f9488ea49955..97b30652aed5 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringConfigPropertiesTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringConfigPropertiesTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.resources;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringResourceProviderTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java
similarity index 95%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringResourceProviderTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java
index c8187e6040db..614f33b37273 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/resources/SpringResourceProviderTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/resources/SpringResourceProviderTest.java
@@ -3,14 +3,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.resources;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelResourceProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtlpExporterProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.PropagationProperties;
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.SpringConfigProperties;
-import io.opentelemetry.instrumentation.spring.autoconfigure.internal.resources.SpringResourceProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.testing.assertj.AttributesAssert;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java
similarity index 99%
rename from instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java
index 9d1336b67ff6..61200b2c6465 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackAppenderTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackAppender/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackAppenderTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackMissing/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackMissingTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackMissing/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackMissingTest.java
similarity index 96%
rename from instrumentation/spring/spring-boot-autoconfigure/src/testLogbackMissing/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackMissingTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/testLogbackMissing/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackMissingTest.java
index 4afcc33f32aa..c40d881bc94b 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackMissing/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/logging/LogbackMissingTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/testLogbackMissing/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/logging/LogbackMissingTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.logging;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
diff --git a/instrumentation/spring/spring-boot-autoconfigure-3/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java
similarity index 99%
rename from instrumentation/spring/spring-boot-autoconfigure-3/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java
index 58237e0f8fd8..bae340b948ef 100644
--- a/instrumentation/spring/spring-boot-autoconfigure-3/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/web/RestClientInstrumentationAutoConfigurationTest.java
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.web;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.web;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java
similarity index 82%
rename from instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java
rename to instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java
index 4b37d5819b10..d064262095c6 100644
--- a/instrumentation/spring/spring-boot-autoconfigure/src/test/java/io/opentelemetry/instrumentation/spring/autoconfigure/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java
+++ b/instrumentation/spring/spring-boot-autoconfigure/src/testSpring3/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/webmvc/SpringWebMvcInstrumentation6AutoConfigurationTest.java
@@ -3,13 +3,16 @@
* SPDX-License-Identifier: Apache-2.0
*/
-package io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.webmvc;
+package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
+import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import jakarta.servlet.Filter;
+import java.util.Collections;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -20,6 +23,9 @@ class SpringWebMvcInstrumentation6AutoConfigurationTest {
private final ApplicationContextRunner contextRunner =
new ApplicationContextRunner()
.withBean(OpenTelemetry.class, OpenTelemetry::noop)
+ .withBean(
+ ConfigProperties.class,
+ () -> DefaultConfigProperties.createFromMap(Collections.emptyMap()))
.withConfiguration(
AutoConfigurations.of(SpringWebMvc6InstrumentationAutoConfiguration.class));
diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java
index b13e8a67a2e8..99ee1a3f9273 100644
--- a/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java
+++ b/instrumentation/spring/spring-webflux/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/v5_0/client/WebClientHelper.java
@@ -5,17 +5,12 @@
package io.opentelemetry.javaagent.instrumentation.spring.webflux.v5_0.client;
-import static java.util.Collections.singletonList;
-
import io.opentelemetry.api.GlobalOpenTelemetry;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientPeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
-import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.ClientInstrumenterFactory;
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientHttpAttributesGetter;
import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientTracingFilter;
-import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
+import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
import java.util.List;
-import java.util.function.Function;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
@@ -23,20 +18,8 @@
public final class WebClientHelper {
private static final Instrumenter instrumenter =
- ClientInstrumenterFactory.create(
- GlobalOpenTelemetry.get(),
- builder ->
- builder
- .setCapturedRequestHeaders(AgentCommonConfig.get().getClientRequestHeaders())
- .setCapturedResponseHeaders(AgentCommonConfig.get().getClientResponseHeaders())
- .setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()),
- builder -> builder.setKnownMethods(AgentCommonConfig.get().getKnownHttpRequestMethods()),
- Function.identity(),
- singletonList(
- HttpClientPeerServiceAttributesExtractor.create(
- WebClientHttpAttributesGetter.INSTANCE,
- AgentCommonConfig.get().getPeerServiceResolver())),
- AgentCommonConfig.get().shouldEmitExperimentalHttpClientTelemetry());
+ JavaagentHttpClientInstrumenters.create(
+ "io.opentelemetry.spring-webflux-5.0", WebClientHttpAttributesGetter.INSTANCE);
public static void addFilter(List exchangeFilterFunctions) {
for (ExchangeFilterFunction filterFunction : exchangeFilterFunctions) {
diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java
index a24930d01695..e8387880cd32 100644
--- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java
+++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/SpringWebfluxTelemetryBuilder.java
@@ -7,26 +7,16 @@
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics;
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
-import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
-import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
-import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.ClientInstrumenterFactory;
-import java.util.ArrayList;
+import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.SpringWebfluxBuilderUtil;
+import io.opentelemetry.instrumentation.spring.webflux.v5_3.internal.WebClientHttpAttributesGetter;
import java.util.List;
import java.util.Set;
-import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ClientResponse;
@@ -36,38 +26,25 @@
public final class SpringWebfluxTelemetryBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-webflux-5.3";
- private final OpenTelemetry openTelemetry;
+ private final DefaultHttpClientInstrumenterBuilder clientBuilder;
+ private final DefaultHttpServerInstrumenterBuilder
+ serverBuilder;
- private final List>
- clientAdditionalExtractors = new ArrayList<>();
- private final List>
- serverAdditionalExtractors = new ArrayList<>();
-
- private final HttpServerAttributesExtractorBuilder
- httpServerAttributesExtractorBuilder =
- HttpServerAttributesExtractor.builder(WebfluxServerHttpAttributesGetter.INSTANCE);
- private final HttpSpanNameExtractorBuilder httpServerSpanNameExtractorBuilder =
- HttpSpanNameExtractor.builder(WebfluxServerHttpAttributesGetter.INSTANCE);
- private final HttpServerRouteBuilder httpServerRouteBuilder =
- HttpServerRoute.builder(WebfluxServerHttpAttributesGetter.INSTANCE);
-
- private Function<
- SpanNameExtractor, ? extends SpanNameExtractor super ClientRequest>>
- clientSpanNameExtractorTransformer = Function.identity();
- private Function<
- SpanNameExtractor,
- ? extends SpanNameExtractor super ServerWebExchange>>
- serverSpanNameExtractorTransformer = Function.identity();
-
- private Consumer>
- clientExtractorConfigurer = builder -> {};
- private Consumer> clientSpanNameExtractorConfigurer =
- builder -> {};
- private boolean emitExperimentalHttpClientTelemetry = false;
- private boolean emitExperimentalHttpServerTelemetry = false;
+ static {
+ SpringWebfluxBuilderUtil.setClientBuilderExtractor(
+ SpringWebfluxTelemetryBuilder::getClientBuilder);
+ SpringWebfluxBuilderUtil.setServerBuilderExtractor(
+ SpringWebfluxTelemetryBuilder::getServerBuilder);
+ }
SpringWebfluxTelemetryBuilder(OpenTelemetry openTelemetry) {
- this.openTelemetry = openTelemetry;
+ clientBuilder =
+ new DefaultHttpClientInstrumenterBuilder<>(
+ INSTRUMENTATION_NAME, openTelemetry, WebClientHttpAttributesGetter.INSTANCE);
+ serverBuilder =
+ new DefaultHttpServerInstrumenterBuilder<>(
+ INSTRUMENTATION_NAME, openTelemetry, WebfluxServerHttpAttributesGetter.INSTANCE)
+ .setHeaderGetter(WebfluxTextMapGetter.INSTANCE);
}
/**
@@ -77,7 +54,7 @@ public final class SpringWebfluxTelemetryBuilder {
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder addClientAttributesExtractor(
AttributesExtractor attributesExtractor) {
- clientAdditionalExtractors.add(attributesExtractor);
+ clientBuilder.addAttributeExtractor(attributesExtractor);
return this;
}
@@ -89,9 +66,7 @@ public SpringWebfluxTelemetryBuilder addClientAttributesExtractor(
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setCapturedClientRequestHeaders(
List requestHeaders) {
- clientExtractorConfigurer =
- clientExtractorConfigurer.andThen(
- builder -> builder.setCapturedRequestHeaders(requestHeaders));
+ clientBuilder.setCapturedRequestHeaders(requestHeaders);
return this;
}
@@ -103,9 +78,7 @@ public SpringWebfluxTelemetryBuilder setCapturedClientRequestHeaders(
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setCapturedClientResponseHeaders(
List responseHeaders) {
- clientExtractorConfigurer =
- clientExtractorConfigurer.andThen(
- builder -> builder.setCapturedResponseHeaders(responseHeaders));
+ clientBuilder.setCapturedResponseHeaders(responseHeaders);
return this;
}
@@ -116,7 +89,7 @@ public SpringWebfluxTelemetryBuilder setCapturedClientResponseHeaders(
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder addServerAttributesExtractor(
AttributesExtractor attributesExtractor) {
- serverAdditionalExtractors.add(attributesExtractor);
+ serverBuilder.addAttributesExtractor(attributesExtractor);
return this;
}
@@ -129,7 +102,7 @@ public SpringWebfluxTelemetryBuilder addServerAttributesExtractor(
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setCapturedServerRequestHeaders(
List requestHeaders) {
- httpServerAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
+ serverBuilder.setCapturedRequestHeaders(requestHeaders);
return this;
}
@@ -142,7 +115,7 @@ public SpringWebfluxTelemetryBuilder setCapturedServerRequestHeaders(
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setCapturedServerResponseHeaders(
List responseHeaders) {
- httpServerAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
+ serverBuilder.setCapturedResponseHeaders(responseHeaders);
return this;
}
@@ -162,13 +135,8 @@ public SpringWebfluxTelemetryBuilder setCapturedServerResponseHeaders(
*/
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setKnownMethods(Set knownMethods) {
- clientExtractorConfigurer =
- clientExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
- clientSpanNameExtractorConfigurer =
- clientSpanNameExtractorConfigurer.andThen(builder -> builder.setKnownMethods(knownMethods));
- httpServerAttributesExtractorBuilder.setKnownMethods(knownMethods);
- httpServerSpanNameExtractorBuilder.setKnownMethods(knownMethods);
- httpServerRouteBuilder.setKnownMethods(knownMethods);
+ clientBuilder.setKnownMethods(knownMethods);
+ serverBuilder.setKnownMethods(knownMethods);
return this;
}
@@ -181,7 +149,7 @@ public SpringWebfluxTelemetryBuilder setKnownMethods(Set knownMethods) {
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setEmitExperimentalHttpClientTelemetry(
boolean emitExperimentalHttpClientTelemetry) {
- this.emitExperimentalHttpClientTelemetry = emitExperimentalHttpClientTelemetry;
+ clientBuilder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientTelemetry);
return this;
}
@@ -194,7 +162,7 @@ public SpringWebfluxTelemetryBuilder setEmitExperimentalHttpClientTelemetry(
@CanIgnoreReturnValue
public SpringWebfluxTelemetryBuilder setEmitExperimentalHttpServerTelemetry(
boolean emitExperimentalHttpServerTelemetry) {
- this.emitExperimentalHttpServerTelemetry = emitExperimentalHttpServerTelemetry;
+ serverBuilder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerTelemetry);
return this;
}
@@ -203,7 +171,7 @@ public SpringWebfluxTelemetryBuilder setEmitExperimentalHttpServerTelemetry(
public SpringWebfluxTelemetryBuilder setClientSpanNameExtractor(
Function, ? extends SpanNameExtractor super ClientRequest>>
clientSpanNameExtractor) {
- this.clientSpanNameExtractorTransformer = clientSpanNameExtractor;
+ clientBuilder.setSpanNameExtractor(clientSpanNameExtractor);
return this;
}
@@ -214,7 +182,7 @@ public SpringWebfluxTelemetryBuilder setServerSpanNameExtractor(
SpanNameExtractor,
? extends SpanNameExtractor super ServerWebExchange>>
serverSpanNameExtractor) {
- this.serverSpanNameExtractorTransformer = serverSpanNameExtractor;
+ serverBuilder.setSpanNameExtractor(serverSpanNameExtractor);
return this;
}
@@ -223,40 +191,18 @@ public SpringWebfluxTelemetryBuilder setServerSpanNameExtractor(
* SpringWebfluxTelemetryBuilder}.
*/
public SpringWebfluxTelemetry build() {
- Instrumenter clientInstrumenter =
- ClientInstrumenterFactory.create(
- openTelemetry,
- clientExtractorConfigurer,
- clientSpanNameExtractorConfigurer,
- clientSpanNameExtractorTransformer,
- clientAdditionalExtractors,
- emitExperimentalHttpClientTelemetry);
-
- Instrumenter serverInstrumenter =
- buildServerInstrumenter();
-
return new SpringWebfluxTelemetry(
- clientInstrumenter, serverInstrumenter, openTelemetry.getPropagators());
+ clientBuilder.build(),
+ serverBuilder.build(),
+ clientBuilder.getOpenTelemetry().getPropagators());
}
- private Instrumenter buildServerInstrumenter() {
- WebfluxServerHttpAttributesGetter getter = WebfluxServerHttpAttributesGetter.INSTANCE;
- SpanNameExtractor super ServerWebExchange> spanNameExtractor =
- serverSpanNameExtractorTransformer.apply(httpServerSpanNameExtractorBuilder.build());
+ private DefaultHttpClientInstrumenterBuilder getClientBuilder() {
+ return clientBuilder;
+ }
- InstrumenterBuilder builder =
- Instrumenter.builder(
- openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
- .setSpanStatusExtractor(HttpSpanStatusExtractor.create(getter))
- .addAttributesExtractor(httpServerAttributesExtractorBuilder.build())
- .addAttributesExtractors(serverAdditionalExtractors)
- .addContextCustomizer(httpServerRouteBuilder.build())
- .addOperationMetrics(HttpServerMetrics.get());
- if (emitExperimentalHttpServerTelemetry) {
- builder
- .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(getter))
- .addOperationMetrics(HttpServerExperimentalMetrics.get());
- }
- return builder.buildServerInstrumenter(WebfluxTextMapGetter.INSTANCE);
+ private DefaultHttpServerInstrumenterBuilder
+ getServerBuilder() {
+ return serverBuilder;
}
}
diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java
deleted file mode 100644
index bb8217539da3..000000000000
--- a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/ClientInstrumenterFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.instrumentation.spring.webflux.v5_3.internal;
-
-import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient;
-
-import io.opentelemetry.api.OpenTelemetry;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientExperimentalMetrics;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
-import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
-import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
-import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
-import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpClientMetrics;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
-import java.util.List;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import org.springframework.web.reactive.function.client.ClientRequest;
-import org.springframework.web.reactive.function.client.ClientResponse;
-
-/**
- * This class is internal and is hence not for public use. Its APIs are unstable and can change at
- * any time.
- */
-// client builder is separate so that it can be used by javaagent instrumentation
-// which supports 5.0, without triggering the server instrumentation which depends on webflux 5.3
-public final class ClientInstrumenterFactory {
-
- private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-webflux-5.3";
-
- public static Instrumenter create(
- OpenTelemetry openTelemetry,
- Consumer>
- extractorConfigurer,
- Consumer> spanNameExtractorConfigurer,
- Function, ? extends SpanNameExtractor super ClientRequest>>
- spanNameExtractorTransformer,
- List> additionalExtractors,
- boolean emitExperimentalHttpClientTelemetry) {
-
- WebClientHttpAttributesGetter httpAttributesGetter = WebClientHttpAttributesGetter.INSTANCE;
-
- HttpClientAttributesExtractorBuilder extractorBuilder =
- HttpClientAttributesExtractor.builder(httpAttributesGetter);
- extractorConfigurer.accept(extractorBuilder);
-
- HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder =
- HttpSpanNameExtractor.builder(httpAttributesGetter);
- spanNameExtractorConfigurer.accept(httpSpanNameExtractorBuilder);
- SpanNameExtractor super ClientRequest> spanNameExtractor =
- spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
-
- InstrumenterBuilder clientBuilder =
- Instrumenter.builder(
- openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
- .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
- .addAttributesExtractor(extractorBuilder.build())
- .addAttributesExtractors(additionalExtractors)
- .addOperationMetrics(HttpClientMetrics.get());
-
- if (emitExperimentalHttpClientTelemetry) {
- clientBuilder
- .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
- .addOperationMetrics(HttpClientExperimentalMetrics.get());
- }
-
- // headers are injected elsewhere; ClientRequest is immutable
- return clientBuilder.buildInstrumenter(alwaysClient());
- }
-
- private ClientInstrumenterFactory() {}
-}
diff --git a/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/SpringWebfluxBuilderUtil.java b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/SpringWebfluxBuilderUtil.java
new file mode 100644
index 000000000000..ec1d643b1d88
--- /dev/null
+++ b/instrumentation/spring/spring-webflux/spring-webflux-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webflux/v5_3/internal/SpringWebfluxBuilderUtil.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.spring.webflux.v5_3.internal;
+
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
+import io.opentelemetry.instrumentation.spring.webflux.v5_3.SpringWebfluxTelemetryBuilder;
+import java.util.function.Function;
+import org.springframework.web.reactive.function.client.ClientRequest;
+import org.springframework.web.reactive.function.client.ClientResponse;
+import org.springframework.web.server.ServerWebExchange;
+
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
+public final class SpringWebfluxBuilderUtil {
+ private SpringWebfluxBuilderUtil() {}
+
+ // allows access to the private field for the spring starter
+ private static Function<
+ SpringWebfluxTelemetryBuilder,
+ DefaultHttpClientInstrumenterBuilder>
+ clientBuilderExtractor;
+
+ // allows access to the private field for the spring starter
+ private static Function<
+ SpringWebfluxTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ serverBuilderExtractor;
+
+ public static Function<
+ SpringWebfluxTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ getServerBuilderExtractor() {
+ return serverBuilderExtractor;
+ }
+
+ public static void setServerBuilderExtractor(
+ Function<
+ SpringWebfluxTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ serverBuilderExtractor) {
+ SpringWebfluxBuilderUtil.serverBuilderExtractor = serverBuilderExtractor;
+ }
+
+ public static Function<
+ SpringWebfluxTelemetryBuilder,
+ DefaultHttpClientInstrumenterBuilder>
+ getClientBuilderExtractor() {
+ return clientBuilderExtractor;
+ }
+
+ public static void setClientBuilderExtractor(
+ Function<
+ SpringWebfluxTelemetryBuilder,
+ DefaultHttpClientInstrumenterBuilder>
+ clientBuilderExtractor) {
+ SpringWebfluxBuilderUtil.clientBuilderExtractor = clientBuilderExtractor;
+ }
+}
diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java
index 67a3a000b3ae..588263aff6e6 100644
--- a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java
+++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/SpringWebMvcTelemetryBuilder.java
@@ -7,21 +7,11 @@
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics;
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
-import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
-import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
-import java.util.ArrayList;
+import io.opentelemetry.instrumentation.spring.webmvc.v5_3.internal.SpringMvcBuilderUtil;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
@@ -33,24 +23,18 @@ public final class SpringWebMvcTelemetryBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-webmvc-5.3";
- private final OpenTelemetry openTelemetry;
- private final List>
- additionalExtractors = new ArrayList<>();
- private final HttpServerAttributesExtractorBuilder
- httpAttributesExtractorBuilder =
- HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
- private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder =
- HttpSpanNameExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
- private final HttpServerRouteBuilder httpServerRouteBuilder =
- HttpServerRoute.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
- private Function<
- SpanNameExtractor,
- ? extends SpanNameExtractor super HttpServletRequest>>
- spanNameExtractorTransformer = Function.identity();
- private boolean emitExperimentalHttpServerMetrics = false;
+ private final DefaultHttpServerInstrumenterBuilder
+ builder;
+
+ static {
+ SpringMvcBuilderUtil.setBuilderExtractor(SpringWebMvcTelemetryBuilder::getBuilder);
+ }
SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) {
- this.openTelemetry = openTelemetry;
+ builder =
+ new DefaultHttpServerInstrumenterBuilder<>(
+ INSTRUMENTATION_NAME, openTelemetry, SpringWebMvcHttpAttributesGetter.INSTANCE)
+ .setHeaderGetter(JavaxHttpServletRequestGetter.INSTANCE);
}
/**
@@ -60,7 +44,7 @@ public final class SpringWebMvcTelemetryBuilder {
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder addAttributesExtractor(
AttributesExtractor attributesExtractor) {
- additionalExtractors.add(attributesExtractor);
+ builder.addAttributesExtractor(attributesExtractor);
return this;
}
@@ -71,7 +55,7 @@ public SpringWebMvcTelemetryBuilder addAttributesExtractor(
*/
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) {
- httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
+ builder.setCapturedRequestHeaders(requestHeaders);
return this;
}
@@ -82,7 +66,7 @@ public SpringWebMvcTelemetryBuilder setCapturedRequestHeaders(List reque
*/
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) {
- httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
+ builder.setCapturedResponseHeaders(responseHeaders);
return this;
}
@@ -93,7 +77,7 @@ public SpringWebMvcTelemetryBuilder setSpanNameExtractor(
SpanNameExtractor,
? extends SpanNameExtractor super HttpServletRequest>>
spanNameExtractor) {
- this.spanNameExtractorTransformer = spanNameExtractor;
+ builder.setSpanNameExtractor(spanNameExtractor);
return this;
}
@@ -112,9 +96,7 @@ public SpringWebMvcTelemetryBuilder setSpanNameExtractor(
*/
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setKnownMethods(Set knownMethods) {
- httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
- httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
- httpServerRouteBuilder.setKnownMethods(knownMethods);
+ builder.setKnownMethods(knownMethods);
return this;
}
@@ -127,7 +109,7 @@ public SpringWebMvcTelemetryBuilder setKnownMethods(Set knownMethods) {
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setEmitExperimentalHttpServerMetrics(
boolean emitExperimentalHttpServerMetrics) {
- this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics;
+ builder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics);
return this;
}
@@ -136,26 +118,11 @@ public SpringWebMvcTelemetryBuilder setEmitExperimentalHttpServerMetrics(
* SpringWebMvcTelemetryBuilder}.
*/
public SpringWebMvcTelemetry build() {
- SpringWebMvcHttpAttributesGetter httpAttributesGetter =
- SpringWebMvcHttpAttributesGetter.INSTANCE;
- SpanNameExtractor super HttpServletRequest> spanNameExtractor =
- spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
-
- InstrumenterBuilder builder =
- Instrumenter.builder(
- openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
- .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
- .addAttributesExtractor(httpAttributesExtractorBuilder.build())
- .addAttributesExtractors(additionalExtractors)
- .addContextCustomizer(httpServerRouteBuilder.build())
- .addOperationMetrics(HttpServerMetrics.get());
- if (emitExperimentalHttpServerMetrics) {
- builder
- .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
- .addOperationMetrics(HttpServerExperimentalMetrics.get());
- }
+ return new SpringWebMvcTelemetry(builder.build());
+ }
- return new SpringWebMvcTelemetry(
- builder.buildServerInstrumenter(JavaxHttpServletRequestGetter.INSTANCE));
+ public DefaultHttpServerInstrumenterBuilder
+ getBuilder() {
+ return builder;
}
}
diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java
new file mode 100644
index 000000000000..74ac99e33d8a
--- /dev/null
+++ b/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/internal/SpringMvcBuilderUtil.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.spring.webmvc.v5_3.internal;
+
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
+import io.opentelemetry.instrumentation.spring.webmvc.v5_3.SpringWebMvcTelemetryBuilder;
+import java.util.function.Function;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
+public final class SpringMvcBuilderUtil {
+ private SpringMvcBuilderUtil() {}
+
+ // allows access to the private field for the spring starter
+ private static Function<
+ SpringWebMvcTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ builderExtractor;
+
+ public static Function<
+ SpringWebMvcTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ getBuilderExtractor() {
+ return builderExtractor;
+ }
+
+ public static void setBuilderExtractor(
+ Function<
+ SpringWebMvcTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ builderExtractor) {
+ SpringMvcBuilderUtil.builderExtractor = builderExtractor;
+ }
+}
diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java
index 9b3e3b9e4e48..7978664dd053 100644
--- a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java
+++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/SpringWebMvcTelemetryBuilder.java
@@ -7,23 +7,13 @@
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpExperimentalAttributesExtractor;
-import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics;
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
-import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
-import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractorBuilder;
-import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor;
+import io.opentelemetry.instrumentation.spring.webmvc.v6_0.internal.SpringMvcBuilderUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
@@ -32,25 +22,18 @@
public final class SpringWebMvcTelemetryBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-webmvc-6.0";
+ private final DefaultHttpServerInstrumenterBuilder
+ builder;
- private final OpenTelemetry openTelemetry;
- private final List>
- additionalExtractors = new ArrayList<>();
- private final HttpServerAttributesExtractorBuilder
- httpAttributesExtractorBuilder =
- HttpServerAttributesExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
- private final HttpSpanNameExtractorBuilder httpSpanNameExtractorBuilder =
- HttpSpanNameExtractor.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
- private final HttpServerRouteBuilder httpServerRouteBuilder =
- HttpServerRoute.builder(SpringWebMvcHttpAttributesGetter.INSTANCE);
- private Function<
- SpanNameExtractor,
- ? extends SpanNameExtractor super HttpServletRequest>>
- spanNameExtractorTransformer = Function.identity();
- private boolean emitExperimentalHttpServerMetrics = false;
+ static {
+ SpringMvcBuilderUtil.setBuilderExtractor(SpringWebMvcTelemetryBuilder::getBuilder);
+ }
SpringWebMvcTelemetryBuilder(OpenTelemetry openTelemetry) {
- this.openTelemetry = openTelemetry;
+ builder =
+ new DefaultHttpServerInstrumenterBuilder<>(
+ INSTRUMENTATION_NAME, openTelemetry, SpringWebMvcHttpAttributesGetter.INSTANCE)
+ .setHeaderGetter(JakartaHttpServletRequestGetter.INSTANCE);
}
/**
@@ -60,7 +43,7 @@ public final class SpringWebMvcTelemetryBuilder {
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder addAttributesExtractor(
AttributesExtractor attributesExtractor) {
- additionalExtractors.add(attributesExtractor);
+ builder.addAttributesExtractor(attributesExtractor);
return this;
}
@@ -71,7 +54,7 @@ public SpringWebMvcTelemetryBuilder addAttributesExtractor(
*/
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) {
- httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders);
+ builder.setCapturedRequestHeaders(requestHeaders);
return this;
}
@@ -82,7 +65,7 @@ public SpringWebMvcTelemetryBuilder setCapturedRequestHeaders(List reque
*/
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) {
- httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders);
+ builder.setCapturedResponseHeaders(responseHeaders);
return this;
}
@@ -93,7 +76,7 @@ public SpringWebMvcTelemetryBuilder setSpanNameExtractor(
SpanNameExtractor,
? extends SpanNameExtractor super HttpServletRequest>>
spanNameExtractor) {
- this.spanNameExtractorTransformer = spanNameExtractor;
+ builder.setSpanNameExtractor(spanNameExtractor);
return this;
}
@@ -112,9 +95,7 @@ public SpringWebMvcTelemetryBuilder setSpanNameExtractor(
*/
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setKnownMethods(Set knownMethods) {
- httpAttributesExtractorBuilder.setKnownMethods(knownMethods);
- httpSpanNameExtractorBuilder.setKnownMethods(knownMethods);
- httpServerRouteBuilder.setKnownMethods(knownMethods);
+ builder.setKnownMethods(knownMethods);
return this;
}
@@ -127,7 +108,7 @@ public SpringWebMvcTelemetryBuilder setKnownMethods(Set knownMethods) {
@CanIgnoreReturnValue
public SpringWebMvcTelemetryBuilder setEmitExperimentalHttpServerMetrics(
boolean emitExperimentalHttpServerMetrics) {
- this.emitExperimentalHttpServerMetrics = emitExperimentalHttpServerMetrics;
+ builder.setEmitExperimentalHttpServerMetrics(emitExperimentalHttpServerMetrics);
return this;
}
@@ -136,26 +117,11 @@ public SpringWebMvcTelemetryBuilder setEmitExperimentalHttpServerMetrics(
* SpringWebMvcTelemetryBuilder}.
*/
public SpringWebMvcTelemetry build() {
- SpringWebMvcHttpAttributesGetter httpAttributesGetter =
- SpringWebMvcHttpAttributesGetter.INSTANCE;
- SpanNameExtractor super HttpServletRequest> spanNameExtractor =
- spanNameExtractorTransformer.apply(httpSpanNameExtractorBuilder.build());
-
- InstrumenterBuilder builder =
- Instrumenter.builder(
- openTelemetry, INSTRUMENTATION_NAME, spanNameExtractor)
- .setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter))
- .addAttributesExtractor(httpAttributesExtractorBuilder.build())
- .addAttributesExtractors(additionalExtractors)
- .addContextCustomizer(httpServerRouteBuilder.build())
- .addOperationMetrics(HttpServerMetrics.get());
- if (emitExperimentalHttpServerMetrics) {
- builder
- .addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
- .addOperationMetrics(HttpServerExperimentalMetrics.get());
- }
+ return new SpringWebMvcTelemetry(builder.build());
+ }
- return new SpringWebMvcTelemetry(
- builder.buildServerInstrumenter(JakartaHttpServletRequestGetter.INSTANCE));
+ public DefaultHttpServerInstrumenterBuilder
+ getBuilder() {
+ return builder;
}
}
diff --git a/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java
new file mode 100644
index 000000000000..d60102acd19a
--- /dev/null
+++ b/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v6_0/internal/SpringMvcBuilderUtil.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.spring.webmvc.v6_0.internal;
+
+import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerInstrumenterBuilder;
+import io.opentelemetry.instrumentation.spring.webmvc.v6_0.SpringWebMvcTelemetryBuilder;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.function.Function;
+
+/**
+ * This class is internal and is hence not for public use. Its APIs are unstable and can change at
+ * any time.
+ */
+public final class SpringMvcBuilderUtil {
+ private SpringMvcBuilderUtil() {}
+
+ // allows access to the private field for the spring starter
+ private static Function<
+ SpringWebMvcTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ builderExtractor;
+
+ public static Function<
+ SpringWebMvcTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ getBuilderExtractor() {
+ return builderExtractor;
+ }
+
+ public static void setBuilderExtractor(
+ Function<
+ SpringWebMvcTelemetryBuilder,
+ DefaultHttpServerInstrumenterBuilder>
+ builderExtractor) {
+ SpringMvcBuilderUtil.builderExtractor = builderExtractor;
+ }
+}
diff --git a/instrumentation/spring/starters/spring-boot-starter/build.gradle.kts b/instrumentation/spring/starters/spring-boot-starter/build.gradle.kts
index 83bc9b8f7c0b..849d7f26ca69 100644
--- a/instrumentation/spring/starters/spring-boot-starter/build.gradle.kts
+++ b/instrumentation/spring/starters/spring-boot-starter/build.gradle.kts
@@ -1,6 +1,7 @@
plugins {
id("otel.java-conventions")
id("otel.publish-conventions")
+ id("otel.japicmp-conventions")
}
group = "io.opentelemetry.instrumentation"
@@ -11,7 +12,6 @@ dependencies {
compileOnly("org.springframework.boot:spring-boot-starter:$springBootVersion")
compileOnly("org.springframework.boot:spring-boot-starter-aop:$springBootVersion")
api(project(":instrumentation:spring:spring-boot-autoconfigure"))
- api(project(":instrumentation:spring:spring-boot-autoconfigure-3"))
api(project(":instrumentation-annotations"))
implementation(project(":instrumentation:resources:library"))
implementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
@@ -23,4 +23,5 @@ dependencies {
implementation("io.opentelemetry.contrib:opentelemetry-aws-resources")
implementation("io.opentelemetry.contrib:opentelemetry-gcp-resources")
+ implementation("io.opentelemetry.contrib:opentelemetry-baggage-processor")
}
diff --git a/instrumentation/spring/starters/spring-boot-starter/gradle.properties b/instrumentation/spring/starters/spring-boot-starter/gradle.properties
new file mode 100644
index 000000000000..45d64bec279d
--- /dev/null
+++ b/instrumentation/spring/starters/spring-boot-starter/gradle.properties
@@ -0,0 +1 @@
+otel.stable=true
diff --git a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java
index e8863716d47e..651308f9634b 100644
--- a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java
+++ b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.java
@@ -113,10 +113,6 @@ protected void configure(HttpServerTestOptions options) {
options.setExpectedException(new ServletException(EXCEPTION.getBody()));
options.setHasResponseSpan(endpoint -> endpoint == NOT_FOUND || endpoint == REDIRECT);
-
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- options.setMetricsInstrumentationName(() -> "io.opentelemetry.servlet-5.0");
}
@Override
diff --git a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java
index a249300a5689..3e779cd3ef0e 100644
--- a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java
+++ b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.java
@@ -108,10 +108,6 @@ protected void configure(HttpServerTestOptions options) {
options.setExpectedException(new ServletException(EXCEPTION.getBody()));
options.setHasResponseSpan(endpoint -> endpoint == NOT_FOUND || endpoint == REDIRECT);
-
- // with async requests the span is started in one instrumentation (server instrumentation)
- // but ended from another (servlet instrumentation)
- options.setMetricsInstrumentationName(() -> "io.opentelemetry.servlet-3.0");
}
@Override
diff --git a/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java b/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java
index 24f974f4c3ca..b89d70bc77d3 100644
--- a/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java
+++ b/instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java
@@ -10,6 +10,7 @@
import io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpServerExperimentalMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
+import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
@@ -61,6 +62,7 @@ public static Instrumenter create(
.addAttributesExtractor(HttpExperimentalAttributesExtractor.create(httpAttributesGetter))
.addOperationMetrics(HttpServerExperimentalMetrics.get());
}
+ InstrumenterUtil.propagateOperationListenersToOnEnd(builder);
return builder.buildServerInstrumenter(TomcatRequestGetter.INSTANCE);
}
}
diff --git a/javaagent-tooling/build.gradle.kts b/javaagent-tooling/build.gradle.kts
index 6043f1eb0d72..1f318ac0f203 100644
--- a/javaagent-tooling/build.gradle.kts
+++ b/javaagent-tooling/build.gradle.kts
@@ -43,6 +43,7 @@ dependencies {
implementation("io.opentelemetry.contrib:opentelemetry-aws-resources")
implementation("io.opentelemetry.contrib:opentelemetry-gcp-resources")
+ implementation("io.opentelemetry.contrib:opentelemetry-baggage-processor")
api("net.bytebuddy:byte-buddy-dep")
implementation("org.ow2.asm:asm-tree")
diff --git a/licenses/licenses.md b/licenses/licenses.md
index 1ed39a0d3b56..388e6671ed61 100644
--- a/licenses/licenses.md
+++ b/licenses/licenses.md
@@ -1,7 +1,7 @@
# javaagent
## Dependency License Report
-_2024-07-08 16:22:15 PDT_
+_2024-07-19 10:32:38 CEST_
## Apache License, Version 2.0
**1** **Group:** `com.blogspot.mydailyjava` **Name:** `weak-lock-free` **Version:** `0.18`
@@ -37,7 +37,7 @@ _2024-07-08 16:22:15 PDT_
> - **Embedded license files**: [jackson-dataformat-yaml-2.17.2.jar/META-INF/LICENSE](jackson-dataformat-yaml-2.17.2.jar/META-INF/LICENSE)
- [jackson-dataformat-yaml-2.17.2.jar/META-INF/NOTICE](jackson-dataformat-yaml-2.17.2.jar/META-INF/NOTICE)
-**6** **Group:** `com.google.cloud.opentelemetry` **Name:** `detector-resources-support` **Version:** `0.29.0`
+**6** **Group:** `com.google.cloud.opentelemetry` **Name:** `detector-resources-support` **Version:** `0.31.0`
> - **POM Project URL**: [https://github.com/GoogleCloudPlatform/opentelemetry-operations-java](https://github.com/GoogleCloudPlatform/opentelemetry-operations-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
@@ -147,176 +147,180 @@ _2024-07-08 16:22:15 PDT_
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**33** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-aws-resources` **Version:** `1.36.0-alpha`
+**33** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-aws-resources` **Version:** `1.37.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**34** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-aws-xray-propagator` **Version:** `1.36.0-alpha`
+**34** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-aws-xray-propagator` **Version:** `1.37.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**35** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-gcp-resources` **Version:** `1.36.0-alpha`
+**35** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-baggage-processor` **Version:** `1.37.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**36** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv` **Version:** `1.25.0-alpha`
+**36** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-gcp-resources` **Version:** `1.37.0-alpha`
+> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib)
+> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+**37** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv` **Version:** `1.25.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java)
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
-**37** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv-incubating` **Version:** `1.25.0-alpha`
+**38** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv-incubating` **Version:** `1.25.0-alpha`
> - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java)
> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
-**38** **Group:** `io.prometheus` **Name:** `prometheus-metrics-config` **Version:** `1.3.1`
+**39** **Group:** `io.prometheus` **Name:** `prometheus-metrics-config` **Version:** `1.3.1`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**39** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-common` **Version:** `1.3.1`
+**40** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-common` **Version:** `1.3.1`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**40** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-httpserver` **Version:** `1.3.1`
+**41** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exporter-httpserver` **Version:** `1.3.1`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**41** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exposition-formats` **Version:** `1.3.1`
+**42** **Group:** `io.prometheus` **Name:** `prometheus-metrics-exposition-formats` **Version:** `1.3.1`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**42** **Group:** `io.prometheus` **Name:** `prometheus-metrics-model` **Version:** `1.3.1`
+**43** **Group:** `io.prometheus` **Name:** `prometheus-metrics-model` **Version:** `1.3.1`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**43** **Group:** `io.prometheus` **Name:** `prometheus-metrics-shaded-protobuf` **Version:** `1.3.1`
+**44** **Group:** `io.prometheus` **Name:** `prometheus-metrics-shaded-protobuf` **Version:** `1.3.1`
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**44** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-reporter` **Version:** `3.4.0`
+**45** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-reporter` **Version:** `3.4.0`
> - **Manifest Project URL**: [https://zipkin.io/](https://zipkin.io/)
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **Embedded license files**: [zipkin-reporter-3.4.0.jar/META-INF/LICENSE](zipkin-reporter-3.4.0.jar/META-INF/LICENSE)
-**45** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-sender-okhttp3` **Version:** `3.4.0`
+**46** **Group:** `io.zipkin.reporter2` **Name:** `zipkin-sender-okhttp3` **Version:** `3.4.0`
> - **Manifest Project URL**: [https://zipkin.io/](https://zipkin.io/)
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **Embedded license files**: [zipkin-sender-okhttp3-3.4.0.jar/META-INF/LICENSE](zipkin-sender-okhttp3-3.4.0.jar/META-INF/LICENSE)
-**46** **Group:** `io.zipkin.zipkin2` **Name:** `zipkin` **Version:** `2.27.1`
+**47** **Group:** `io.zipkin.zipkin2` **Name:** `zipkin` **Version:** `2.27.1`
> - **Manifest Project URL**: [http://zipkin.io/](http://zipkin.io/)
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **Embedded license files**: [zipkin-2.27.1.jar/META-INF/LICENSE](zipkin-2.27.1.jar/META-INF/LICENSE)
-**47** **Group:** `net.bytebuddy` **Name:** `byte-buddy-dep` **Version:** `1.14.18`
+**48** **Group:** `net.bytebuddy` **Name:** `byte-buddy-dep` **Version:** `1.14.18`
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **Embedded license files**: [byte-buddy-dep-1.14.18.jar/META-INF/LICENSE](byte-buddy-dep-1.14.18.jar/META-INF/LICENSE)
- [byte-buddy-dep-1.14.18.jar/META-INF/NOTICE](byte-buddy-dep-1.14.18.jar/META-INF/NOTICE)
-**48** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0`
+**49** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0`
> - **POM Project URL**: [http://www.jetbrains.org](http://www.jetbrains.org)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**49** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.0.0`
+**50** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.0.0`
> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**50** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.0.0`
+**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.0.0`
> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.0.0`
+**52** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.0.0`
> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**52** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7`
+**53** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**53** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7`
+**54** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**54** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7`
+**55** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**55** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7`
+**56** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**56** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7`
+**57** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**57** **Group:** `org.snakeyaml` **Name:** `snakeyaml-engine` **Version:** `2.7`
+**58** **Group:** `org.snakeyaml` **Name:** `snakeyaml-engine` **Version:** `2.7`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
-**58** **Group:** `org.yaml` **Name:** `snakeyaml` **Version:** `2.2`
+**59** **Group:** `org.yaml` **Name:** `snakeyaml` **Version:** `2.2`
> - **Manifest License**: Apache License, Version 2.0 (Not Packaged)
> - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
## MIT License
-**59** **Group:** `org.slf4j` **Name:** `slf4j-api` **Version:** `2.0.13`
+**60** **Group:** `org.slf4j` **Name:** `slf4j-api` **Version:** `2.0.13`
> - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org)
> - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT)
> - **Embedded license files**: [slf4j-api-2.0.13.jar/META-INF/LICENSE.txt](slf4j-api-2.0.13.jar/META-INF/LICENSE.txt)
-**60** **Group:** `org.slf4j` **Name:** `slf4j-simple` **Version:** `2.0.13`
+**61** **Group:** `org.slf4j` **Name:** `slf4j-simple` **Version:** `2.0.13`
> - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org)
> - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT)
> - **Embedded license files**: [slf4j-simple-2.0.13.jar/META-INF/LICENSE.txt](slf4j-simple-2.0.13.jar/META-INF/LICENSE.txt)
## The 3-Clause BSD License
-**61** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7`
+**62** **Group:** `org.ow2.asm` **Name:** `asm` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**62** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7`
+**63** **Group:** `org.ow2.asm` **Name:** `asm-analysis` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**63** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7`
+**64** **Group:** `org.ow2.asm` **Name:** `asm-commons` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**64** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7`
+**65** **Group:** `org.ow2.asm` **Name:** `asm-tree` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
> - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
> - **POM License**: The 3-Clause BSD License - [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-**65** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7`
+**66** **Group:** `org.ow2.asm` **Name:** `asm-util` **Version:** `9.7`
> - **Manifest Project URL**: [http://asm.ow2.org](http://asm.ow2.org)
> - **Manifest License**: The 3-Clause BSD License (Not Packaged)
> - **POM Project URL**: [http://asm.ow2.io/](http://asm.ow2.io/)
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 85b8498cffa1..06ee5fe6f725 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -12,7 +12,7 @@ pluginManagement {
}
plugins {
- id("com.gradle.develocity") version "3.17.5"
+ id("com.gradle.develocity") version "3.17.6"
id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2"
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
// this can't live in pluginManagement currently due to
@@ -551,7 +551,6 @@ include(":instrumentation:spark-2.3:javaagent")
include(":instrumentation:spring:spring-batch-3.0:javaagent")
include(":instrumentation:spring:spring-boot-actuator-autoconfigure-2.0:javaagent")
include(":instrumentation:spring:spring-boot-autoconfigure")
-include(":instrumentation:spring:spring-boot-autoconfigure-3")
include(":instrumentation:spring:spring-boot-resources:javaagent")
include(":instrumentation:spring:spring-boot-resources:javaagent-unit-tests")
include(":instrumentation:spring:spring-cloud-gateway:spring-cloud-gateway-2.0:javaagent")
diff --git a/smoke-tests-otel-starter/spring-boot-2/build.gradle.kts b/smoke-tests-otel-starter/spring-boot-2/build.gradle.kts
index 7483b76355d2..9fe628dd698b 100644
--- a/smoke-tests-otel-starter/spring-boot-2/build.gradle.kts
+++ b/smoke-tests-otel-starter/spring-boot-2/build.gradle.kts
@@ -12,6 +12,7 @@ dependencies {
implementation("org.apache.commons:commons-dbcp2")
implementation("org.springframework.kafka:spring-kafka")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
+ implementation("org.springframework.boot:spring-boot-starter-aop")
implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
implementation(project(":smoke-tests-otel-starter:spring-boot-common"))
diff --git a/smoke-tests-otel-starter/spring-boot-3.2/build.gradle.kts b/smoke-tests-otel-starter/spring-boot-3.2/build.gradle.kts
index 502de91d64af..8b125966863b 100644
--- a/smoke-tests-otel-starter/spring-boot-3.2/build.gradle.kts
+++ b/smoke-tests-otel-starter/spring-boot-3.2/build.gradle.kts
@@ -17,6 +17,7 @@ dependencies {
implementation("org.apache.commons:commons-dbcp2")
implementation("org.springframework.kafka:spring-kafka")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
+ implementation("org.springframework.boot:spring-boot-starter-aop")
implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
implementation(project(":smoke-tests-otel-starter:spring-boot-common"))
diff --git a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java
index cfb46104aadd..f01bafb6e22e 100644
--- a/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java
+++ b/smoke-tests-otel-starter/spring-boot-3.2/src/test/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTest.java
@@ -51,7 +51,8 @@ void restClient() {
private static void assertClient(TraceAssert traceAssert) {
traceAssert.hasSpansSatisfyingExactly(
- span -> AbstractOtelSpringStarterSmokeTest.assertClientSpan(span, "/ping"),
- span -> span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"));
+ span -> HttpSpanDataAssert.create(span).assertClientGetRequest("/ping"),
+ span -> span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"),
+ span -> withSpanAssert(span));
}
}
diff --git a/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts b/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts
index a9e7e556e4f8..78e01e6685e1 100644
--- a/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts
+++ b/smoke-tests-otel-starter/spring-boot-3/build.gradle.kts
@@ -17,6 +17,7 @@ dependencies {
implementation("org.apache.commons:commons-dbcp2")
implementation("org.springframework.kafka:spring-kafka")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
+ implementation("org.springframework.boot:spring-boot-starter-aop")
implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
implementation(project(":smoke-tests-otel-starter:spring-boot-common"))
diff --git a/smoke-tests-otel-starter/spring-boot-common/build.gradle.kts b/smoke-tests-otel-starter/spring-boot-common/build.gradle.kts
index e32d7771828e..1e4df320a25f 100644
--- a/smoke-tests-otel-starter/spring-boot-common/build.gradle.kts
+++ b/smoke-tests-otel-starter/spring-boot-common/build.gradle.kts
@@ -19,6 +19,7 @@ dependencies {
compileOnly("org.testcontainers:junit-jupiter")
compileOnly("org.testcontainers:kafka")
compileOnly("org.testcontainers:mongodb")
+ compileOnly("org.springframework.boot:spring-boot-starter-aop")
api(project(":smoke-tests-otel-starter:spring-smoke-testing"))
diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmKafkaSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmKafkaSpringStarterSmokeTest.java
index 8be2b86e9539..2662f3a8fbbb 100644
--- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmKafkaSpringStarterSmokeTest.java
+++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmKafkaSpringStarterSmokeTest.java
@@ -7,7 +7,7 @@
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
-import io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.kafka.KafkaInstrumentationAutoConfiguration;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.kafka.KafkaInstrumentationAutoConfiguration;
import java.time.Duration;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmMongodbSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmMongodbSpringStarterSmokeTest.java
index ac213a4b4669..5915f8fca138 100644
--- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmMongodbSpringStarterSmokeTest.java
+++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractJvmMongodbSpringStarterSmokeTest.java
@@ -8,7 +8,7 @@
import com.mongodb.client.MongoClient;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.spring.autoconfigure.OpenTelemetryAutoConfiguration;
-import io.opentelemetry.instrumentation.spring.autoconfigure.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration;
+import io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.mongo.MongoClientInstrumentationAutoConfiguration;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java
index ec9af70ca329..4e802dd3bccb 100644
--- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java
+++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelSpringStarterSmokeTest.java
@@ -21,20 +21,17 @@
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.logs.data.LogRecordData;
import io.opentelemetry.sdk.resources.Resource;
-import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
import io.opentelemetry.semconv.ClientAttributes;
import io.opentelemetry.semconv.HttpAttributes;
import io.opentelemetry.semconv.ServerAttributes;
import io.opentelemetry.semconv.UrlAttributes;
import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes;
import io.opentelemetry.semconv.incubating.DbIncubatingAttributes;
-import io.opentelemetry.semconv.incubating.HttpIncubatingAttributes;
import io.opentelemetry.semconv.incubating.ServiceIncubatingAttributes;
import java.util.Collections;
import java.util.List;
import org.assertj.core.api.AbstractCharSequenceAssert;
import org.assertj.core.api.AbstractIterableAssert;
-import org.assertj.core.api.AbstractLongAssert;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@@ -155,8 +152,8 @@ void shouldSendTelemetry() {
ServerAttributes.SERVER_PORT,
integerAssert -> integerAssert.isNotZero())),
serverSpan ->
- serverSpan
- .hasKind(SpanKind.SERVER)
+ HttpSpanDataAssert.create(serverSpan)
+ .assertServerGetRequest("/ping")
.hasResourceSatisfying(
r ->
r.hasAttribute(
@@ -175,7 +172,8 @@ void shouldSendTelemetry() {
equalTo(ClientAttributes.CLIENT_ADDRESS, "127.0.0.1"),
satisfies(
ServerAttributes.SERVER_PORT,
- integerAssert -> integerAssert.isNotZero()))));
+ integerAssert -> integerAssert.isNotZero())),
+ span -> withSpanAssert(span)));
// Metric
testing.waitAndAssertMetrics(
@@ -234,18 +232,9 @@ void restTemplate() {
testing.waitAndAssertTraces(
traceAssert ->
traceAssert.hasSpansSatisfyingExactly(
- span -> assertClientSpan(span, "/ping"),
+ span -> HttpSpanDataAssert.create(span).assertClientGetRequest("/ping"),
span ->
- span.hasKind(SpanKind.SERVER)
- .hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping")));
- }
-
- public static void assertClientSpan(SpanDataAssert span, String path) {
- span.hasKind(SpanKind.CLIENT)
- .hasAttributesSatisfying(
- satisfies(UrlAttributes.URL_FULL, a -> a.endsWith(path)),
- // this attribute is set by the experimental http instrumentation
- satisfies(
- HttpIncubatingAttributes.HTTP_RESPONSE_BODY_SIZE, AbstractLongAssert::isPositive));
+ span.hasKind(SpanKind.SERVER).hasAttribute(HttpAttributes.HTTP_ROUTE, "/ping"),
+ span -> withSpanAssert(span)));
}
}
diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTestController.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTestController.java
index 891666797bf6..7d02c29d5fc1 100644
--- a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTestController.java
+++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/OtelSpringStarterSmokeTestController.java
@@ -20,15 +20,19 @@ public class OtelSpringStarterSmokeTestController {
public static final String TEST_HISTOGRAM = "histogram-test-otel-spring-starter";
public static final String METER_SCOPE_NAME = "scope";
private final LongHistogram histogram;
+ private final SpringComponent component;
- public OtelSpringStarterSmokeTestController(OpenTelemetry openTelemetry) {
+ public OtelSpringStarterSmokeTestController(
+ OpenTelemetry openTelemetry, SpringComponent springComponent) {
Meter meter = openTelemetry.getMeter(METER_SCOPE_NAME);
histogram = meter.histogramBuilder(TEST_HISTOGRAM).ofLongs().build();
+ this.component = springComponent;
}
@GetMapping(PING)
public String ping() {
histogram.record(10);
+ component.withSpanMethod("from-controller");
return "pong";
}
}
diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/SpringComponent.java b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/SpringComponent.java
new file mode 100644
index 000000000000..072b39393b01
--- /dev/null
+++ b/smoke-tests-otel-starter/spring-boot-common/src/main/java/io/opentelemetry/spring/smoketest/SpringComponent.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.spring.smoketest;
+
+import io.opentelemetry.instrumentation.annotations.SpanAttribute;
+import io.opentelemetry.instrumentation.annotations.WithSpan;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringComponent {
+
+ @SuppressWarnings("MethodCanBeStatic")
+ @WithSpan
+ public void withSpanMethod(@SpanAttribute String paramName) {}
+}
diff --git a/smoke-tests-otel-starter/spring-boot-common/src/main/resources/application.yaml b/smoke-tests-otel-starter/spring-boot-common/src/main/resources/application.yaml
index df0764948302..1995223b3841 100644
--- a/smoke-tests-otel-starter/spring-boot-common/src/main/resources/application.yaml
+++ b/smoke-tests-otel-starter/spring-boot-common/src/main/resources/application.yaml
@@ -11,6 +11,8 @@ otel:
http:
client:
emit-experimental-telemetry: true
+ server:
+ emit-experimental-telemetry: true
propagators:
- b3
resource:
diff --git a/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java
index 7bc32e819fcc..8de8f4fc0ac5 100644
--- a/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java
+++ b/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/java/io/opentelemetry/spring/smoketest/AbstractOtelReactiveSpringStarterSmokeTest.java
@@ -8,8 +8,6 @@
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.trace.SpanKind;
-import io.opentelemetry.semconv.HttpAttributes;
-import io.opentelemetry.semconv.UrlAttributes;
import io.opentelemetry.semconv.incubating.DbIncubatingAttributes;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -52,17 +50,8 @@ void webClientAndWebFluxAndR2dbc() {
trace.hasSpansSatisfyingExactly(span -> span.hasName("CREATE TABLE testdb.player")),
trace ->
trace.hasSpansSatisfyingExactly(
- span ->
- span.hasKind(SpanKind.CLIENT)
- .hasName("GET")
- .hasAttributesSatisfying(
- a -> assertThat(a.get(UrlAttributes.URL_FULL)).endsWith("/webflux")),
- span ->
- span.hasKind(SpanKind.SERVER)
- .hasName("GET /webflux")
- .hasAttribute(HttpAttributes.HTTP_REQUEST_METHOD, "GET")
- .hasAttribute(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L)
- .hasAttribute(HttpAttributes.HTTP_ROUTE, "/webflux"),
+ span -> HttpSpanDataAssert.create(span).assertClientGetRequest("/webflux"),
+ span -> HttpSpanDataAssert.create(span).assertServerGetRequest("/webflux"),
span ->
span.hasKind(SpanKind.CLIENT)
.satisfies(
diff --git a/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/resources/application.yaml b/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/resources/application.yaml
index f0568098a28b..26b301f52d79 100644
--- a/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/resources/application.yaml
+++ b/smoke-tests-otel-starter/spring-boot-reactive-common/src/main/resources/application.yaml
@@ -3,6 +3,11 @@ otel:
common:
db-statement-sanitizer:
enabled: false
+ http:
+ client:
+ emit-experimental-telemetry: true
+ server:
+ emit-experimental-telemetry: true
spring:
r2dbc:
diff --git a/smoke-tests-otel-starter/spring-smoke-testing/build.gradle.kts b/smoke-tests-otel-starter/spring-smoke-testing/build.gradle.kts
index cc34ef0d91bb..6b2eae7f32ab 100644
--- a/smoke-tests-otel-starter/spring-smoke-testing/build.gradle.kts
+++ b/smoke-tests-otel-starter/spring-smoke-testing/build.gradle.kts
@@ -13,7 +13,6 @@ dependencies {
compileOnly("org.springframework.boot:spring-boot-starter")
compileOnly("org.springframework.boot:spring-boot-starter-test")
api(project(":testing-common"))
- api(project(":instrumentation:spring:spring-boot-autoconfigure"))
api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
}
diff --git a/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/AbstractSpringStarterSmokeTest.java b/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/AbstractSpringStarterSmokeTest.java
index d762c78de4d4..7ca5cab29615 100644
--- a/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/AbstractSpringStarterSmokeTest.java
+++ b/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/AbstractSpringStarterSmokeTest.java
@@ -8,6 +8,8 @@
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.common.AttributeKey;
+import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.AfterEach;
@@ -61,4 +63,9 @@ void checkSpringLogs(CapturedOutput output) {
}
});
}
+
+ static SpanDataAssert withSpanAssert(SpanDataAssert span) {
+ return span.hasName("SpringComponent.withSpanMethod")
+ .hasAttribute(AttributeKey.stringKey("paramName"), "from-controller");
+ }
}
diff --git a/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/HttpSpanDataAssert.java b/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/HttpSpanDataAssert.java
new file mode 100644
index 000000000000..4f6018d46167
--- /dev/null
+++ b/smoke-tests-otel-starter/spring-smoke-testing/src/main/java/io/opentelemetry/spring/smoketest/HttpSpanDataAssert.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.spring.smoketest;
+
+import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
+import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
+
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import io.opentelemetry.api.trace.SpanKind;
+import io.opentelemetry.sdk.testing.assertj.ResourceAssert;
+import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
+import io.opentelemetry.semconv.HttpAttributes;
+import io.opentelemetry.semconv.UrlAttributes;
+import io.opentelemetry.semconv.incubating.HttpIncubatingAttributes;
+import java.util.function.Consumer;
+import org.assertj.core.api.AbstractLongAssert;
+
+public final class HttpSpanDataAssert {
+
+ private final SpanDataAssert span;
+
+ private HttpSpanDataAssert(SpanDataAssert span) {
+ this.span = span;
+ }
+
+ public static HttpSpanDataAssert create(SpanDataAssert serverSpan) {
+ return new HttpSpanDataAssert(serverSpan);
+ }
+
+ @CanIgnoreReturnValue
+ public HttpSpanDataAssert assertClientGetRequest(String path) {
+ span.hasKind(SpanKind.CLIENT)
+ .hasAttributesSatisfying(
+ satisfies(UrlAttributes.URL_FULL, a -> a.endsWith(path)),
+ // this attribute is set by the experimental http instrumentation
+ satisfies(
+ HttpIncubatingAttributes.HTTP_RESPONSE_BODY_SIZE,
+ AbstractLongAssert::isNotNegative));
+ return this;
+ }
+
+ @CanIgnoreReturnValue
+ public HttpSpanDataAssert assertServerGetRequest(String route) {
+ span.hasKind(SpanKind.SERVER)
+ .hasAttributesSatisfying(
+ equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "GET"),
+ equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L),
+ equalTo(HttpAttributes.HTTP_ROUTE, route),
+ // this attribute is set by the experimental http instrumentation
+ satisfies(
+ HttpIncubatingAttributes.HTTP_RESPONSE_BODY_SIZE,
+ AbstractLongAssert::isNotNegative));
+ return this;
+ }
+
+ public SpanDataAssert hasResourceSatisfying(Consumer resource) {
+ return span.hasResourceSatisfying(resource);
+ }
+}
diff --git a/smoke-tests/build.gradle.kts b/smoke-tests/build.gradle.kts
index c67b52bf7d98..9a42517d912e 100644
--- a/smoke-tests/build.gradle.kts
+++ b/smoke-tests/build.gradle.kts
@@ -15,7 +15,7 @@ otelJava {
maxJavaVersionForTests.set(JavaVersion.VERSION_11)
}
-val dockerJavaVersion = "3.3.6"
+val dockerJavaVersion = "3.4.0"
dependencies {
testCompileOnly("com.google.auto.value:auto-value-annotations")
testAnnotationProcessor("com.google.auto.value:auto-value")
@@ -23,7 +23,7 @@ dependencies {
api("org.spockframework:spock-core")
api(project(":testing-common"))
- implementation(platform("io.grpc:grpc-bom:1.65.0"))
+ implementation(platform("io.grpc:grpc-bom:1.65.1"))
implementation("org.slf4j:slf4j-api")
implementation("io.opentelemetry:opentelemetry-api")
implementation("io.opentelemetry.proto:opentelemetry-proto")
diff --git a/smoke-tests/images/early-jdk8/Dockerfile b/smoke-tests/images/early-jdk8/Dockerfile
index 02c04ee4ac7e..0476bce8d9ec 100644
--- a/smoke-tests/images/early-jdk8/Dockerfile
+++ b/smoke-tests/images/early-jdk8/Dockerfile
@@ -1,5 +1,5 @@
# https://github.com/zulu-openjdk/zulu-openjdk/blob/master/ubuntu/8u412-8.78/Dockerfile
-FROM ubuntu:jammy
+FROM ubuntu:noble
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
diff --git a/smoke-tests/images/fake-backend/build.gradle.kts b/smoke-tests/images/fake-backend/build.gradle.kts
index e9f778b5f45f..6b5e965d8cd3 100644
--- a/smoke-tests/images/fake-backend/build.gradle.kts
+++ b/smoke-tests/images/fake-backend/build.gradle.kts
@@ -12,7 +12,7 @@ plugins {
}
dependencies {
- implementation("com.linecorp.armeria:armeria-grpc:1.29.1")
+ implementation("com.linecorp.armeria:armeria-grpc:1.29.2")
implementation("io.opentelemetry.proto:opentelemetry-proto")
runtimeOnly("org.slf4j:slf4j-simple")
}
diff --git a/smoke-tests/images/grpc/build.gradle.kts b/smoke-tests/images/grpc/build.gradle.kts
index 0ca89e2414e1..a973ecb5e238 100644
--- a/smoke-tests/images/grpc/build.gradle.kts
+++ b/smoke-tests/images/grpc/build.gradle.kts
@@ -8,7 +8,7 @@ plugins {
}
dependencies {
- implementation(platform("io.grpc:grpc-bom:1.65.0"))
+ implementation(platform("io.grpc:grpc-bom:1.65.1"))
implementation(platform("io.opentelemetry:opentelemetry-bom:1.0.0"))
implementation(platform("io.opentelemetry:opentelemetry-bom-alpha:1.0.0-alpha"))
implementation(platform("org.apache.logging.log4j:log4j-bom:2.23.1"))
diff --git a/smoke-tests/images/quarkus/build.gradle.kts b/smoke-tests/images/quarkus/build.gradle.kts
index 06983310e86b..3938bf1d6d32 100644
--- a/smoke-tests/images/quarkus/build.gradle.kts
+++ b/smoke-tests/images/quarkus/build.gradle.kts
@@ -12,11 +12,11 @@ plugins {
id("otel.java-conventions")
id("com.google.cloud.tools.jib")
- id("io.quarkus") version "3.12.1"
+ id("io.quarkus") version "3.12.3"
}
dependencies {
- implementation(enforcedPlatform("io.quarkus:quarkus-bom:3.12.1"))
+ implementation(enforcedPlatform("io.quarkus:quarkus-bom:3.12.3"))
implementation("io.quarkus:quarkus-resteasy")
}
diff --git a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy
index fdade11a389d..54bcba8bbc26 100644
--- a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy
+++ b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy
@@ -173,10 +173,6 @@ abstract class HttpServerTest extends InstrumentationSpecification imple
return true
}
- String getMetricsInstrumentationName() {
- null
- }
-
/** A list of additional HTTP server span attributes extracted by the instrumentation per URI. */
Set> httpAttributes(ServerEndpoint endpoint) {
[
@@ -237,9 +233,6 @@ abstract class HttpServerTest extends InstrumentationSpecification imple
options.sockPeerAddr = { endpoint ->
HttpServerTest.this.sockPeerAddr(endpoint)
}
- options.metricsInstrumentationName = {
- HttpServerTest.this.getMetricsInstrumentationName()
- }
options.responseCodeOnNonStandardHttpMethod = getResponseCodeOnNonStandardHttpMethod()
options.testRedirect = testRedirect()
diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java
index 3246bad915f7..74c9e6c67af2 100644
--- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java
+++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java
@@ -353,12 +353,8 @@ void httpServerMetrics() {
spanData -> assertServerSpan(assertThat(spanData), method, SUCCESS, SUCCESS.status));
});
- String metricsInstrumentationName = options.metricsInstrumentationName.get();
- if (metricsInstrumentationName == null) {
- metricsInstrumentationName = instrumentationName.get();
- }
testing.waitAndAssertMetrics(
- metricsInstrumentationName,
+ instrumentationName.get(),
"http.server.request.duration",
metrics ->
metrics.anySatisfy(
diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpServerTestOptions.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpServerTestOptions.java
index ad0700b83359..970184967589 100644
--- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpServerTestOptions.java
+++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpServerTestOptions.java
@@ -19,7 +19,6 @@
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
-import java.util.function.Supplier;
import javax.annotation.Nullable;
public final class HttpServerTestOptions {
@@ -42,7 +41,6 @@ public final class HttpServerTestOptions {
Function sockPeerAddr = unused -> "127.0.0.1";
String contextPath = "";
Throwable expectedException = new Exception(EXCEPTION.body);
- Supplier metricsInstrumentationName = () -> null;
// we're calling /success in the test, and most servers respond with 200 anyway
int responseCodeOnNonStandardHttpMethod = ServerEndpoint.SUCCESS.status;
@@ -108,13 +106,6 @@ public HttpServerTestOptions setExpectedException(Throwable expectedException) {
return this;
}
- @CanIgnoreReturnValue
- public HttpServerTestOptions setMetricsInstrumentationName(
- Supplier metricsInstrumentationName) {
- this.metricsInstrumentationName = metricsInstrumentationName;
- return this;
- }
-
@CanIgnoreReturnValue
public HttpServerTestOptions setResponseCodeOnNonStandardHttpMethod(
int responseCodeOnNonStandardHttpMethod) {
diff --git a/testing/armeria-shaded-for-testing/build.gradle.kts b/testing/armeria-shaded-for-testing/build.gradle.kts
index 9b157fdde048..832490f4d7de 100644
--- a/testing/armeria-shaded-for-testing/build.gradle.kts
+++ b/testing/armeria-shaded-for-testing/build.gradle.kts
@@ -5,7 +5,7 @@ plugins {
}
dependencies {
- implementation("com.linecorp.armeria:armeria-junit5:1.29.1")
+ implementation("com.linecorp.armeria:armeria-junit5:1.29.2")
}
tasks {
diff --git a/version.gradle.kts b/version.gradle.kts
index 697e4d8fd978..50f3cd2a28d4 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -1,5 +1,5 @@
-val stableVersion = "2.6.0-SNAPSHOT"
-val alphaVersion = "2.6.0-alpha-SNAPSHOT"
+val stableVersion = "2.7.0-SNAPSHOT"
+val alphaVersion = "2.7.0-alpha-SNAPSHOT"
allprojects {
if (findProperty("otel.stable") != "true") {