diff --git a/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts b/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts index f658edd1dea6..543cc416e028 100644 --- a/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts +++ b/conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-shadowing.gradle.kts @@ -52,4 +52,11 @@ tasks.withType().configureEach { // this is for instrumentation on java.util.logging (since java.util.logging itself is shaded above) relocate("application.java.util.logging", "java.util.logging") + + // Rename SPI service files to match relocated class names + eachFile { + if (path.startsWith("META-INF/services/io.opentelemetry.instrumentation")) { + path = path.replace("io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation") + } + } } diff --git a/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts b/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts index 9f8936ab7e8b..ef247dd004fd 100644 --- a/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts +++ b/gradle-plugins/src/main/kotlin/io.opentelemetry.instrumentation.muzzle-check.gradle.kts @@ -119,6 +119,13 @@ tasks.withType().configureEach { // this is for instrumentation on java.util.logging (since java.util.logging itself is shaded above) relocate("application.java.util.logging", "java.util.logging") + + // Rename SPI service files to match relocated class names + eachFile { + if (path.startsWith("META-INF/services/io.opentelemetry.instrumentation")) { + path = path.replace("io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation") + } + } } val compileMuzzle by tasks.registering { diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java index 6431b8975808..2dc0e2350012 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-4.8/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v4_8/AbstractRocketMqClientTest.java @@ -252,9 +252,6 @@ void testRocketmqProduceAndConsume() throws Exception { @Test void testRocketmqProduceAndBatchConsume() throws Exception { - // context propagation doesn't work for batch messages in 5.3.4 - Assumptions.assumeFalse(Boolean.getBoolean("testLatestDeps")); - consumer.setConsumeMessageBatchMaxSize(2); // This test assumes that messages are sent and received as a batch. Occasionally it happens // that the messages are not received as a batch, but one by one. This doesn't match what the diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/ReceiveSpanFinishingCallback.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/ReceiveSpanFinishingCallback.java index 733da234b4b9..5c2c925655f9 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/ReceiveSpanFinishingCallback.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmqclient/v5_0/ReceiveSpanFinishingCallback.java @@ -49,8 +49,14 @@ public void onSuccess(ReceiveMessageResult receiveMessageResult) { null, timer.startTime(), timer.now()); + // For batch messages, each message should have its own context that properly + // links to the individual producer spans through context propagation for (MessageView messageView : messageViews) { - VirtualFieldStore.setContextByMessage(messageView, context); + // Extract context from individual message properties (trace headers) + Context messageContext = RocketMqSingletons.propagators() + .getTextMapPropagator() + .extract(context, messageView, MessageMapGetter.INSTANCE); + VirtualFieldStore.setContextByMessage(messageView, messageContext); } } } diff --git a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java index 4df611685733..5a62d28e572e 100644 --- a/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java +++ b/instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/kafka/KafkaInstrumentationAutoConfiguration.java @@ -43,11 +43,12 @@ DefaultKafkaProducerFactoryCustomizer otelKafkaProducerFactoryCustomizer( static SpringKafkaTelemetry getTelemetry( ObjectProvider openTelemetryProvider, ObjectProvider configProvider) { + InstrumentationConfig config = configProvider.getObject(); return SpringKafkaTelemetry.builder(openTelemetryProvider.getObject()) .setCaptureExperimentalSpanAttributes( - configProvider - .getObject() - .getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + config.getBoolean("otel.instrumentation.kafka.experimental-span-attributes", false)) + .setMessagingReceiveInstrumentationEnabled( + config.getBoolean("otel.instrumentation.messaging.experimental.receive-telemetry.enabled", false)) .build(); } diff --git a/javaagent-tooling/src/main/resources/META-INF/services/io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientUrlTemplateCustomizer b/javaagent-tooling/src/main/resources/META-INF/services/io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientUrlTemplateCustomizer new file mode 100644 index 000000000000..2a0701717292 --- /dev/null +++ b/javaagent-tooling/src/main/resources/META-INF/services/io.opentelemetry.instrumentation.api.incubator.semconv.http.HttpClientUrlTemplateCustomizer @@ -0,0 +1 @@ +io.opentelemetry.javaagent.tooling.instrumentation.http.RegexUrlTemplateCustomizer \ No newline at end of file