diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/CapturedMessageHeadersUtil.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/CapturedMessageHeadersUtil.java index 83f55f7c4663..614cd8b3e761 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/CapturedMessageHeadersUtil.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/CapturedMessageHeadersUtil.java @@ -12,17 +12,29 @@ final class CapturedMessageHeadersUtil { - private static final ConcurrentMap>> attributeKeysCache = - new ConcurrentHashMap<>(); + private static final ConcurrentMap>> + oldSemconvAttributeKeysCache = new ConcurrentHashMap<>(); + private static final ConcurrentMap>> + stableSemconvAttributeKeysCache = new ConcurrentHashMap<>(); - static AttributeKey> attributeKey(String headerName) { - return attributeKeysCache.computeIfAbsent(headerName, n -> createKey(n)); + static AttributeKey> oldSemconvAttributeKey(String headerName) { + return oldSemconvAttributeKeysCache.computeIfAbsent(headerName, n -> createOldSemconvKey(n)); } - private static AttributeKey> createKey(String headerName) { + static AttributeKey> stableSemconvAttributeKey(String headerName) { + return stableSemconvAttributeKeysCache.computeIfAbsent( + headerName, n -> createStableSemconvKey(n)); + } + + private static AttributeKey> createOldSemconvKey(String headerName) { String key = "messaging.header." + headerName.replace('-', '_'); return AttributeKey.stringArrayKey(key); } + private static AttributeKey> createStableSemconvKey(String headerName) { + String key = "messaging.header." + headerName; + return AttributeKey.stringArrayKey(key); + } + private CapturedMessageHeadersUtil() {} } diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java index 4efce367e1a1..1dc3b0514bfb 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/messaging/MessagingAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider; import java.util.ArrayList; @@ -131,7 +132,13 @@ public void onEnd( for (String name : capturedHeaders) { List values = getter.getMessageHeader(request, name); if (!values.isEmpty()) { - internalSet(attributes, CapturedMessageHeadersUtil.attributeKey(name), values); + if (SemconvStability.isEmitOldMessageSemconv()) { + internalSet(attributes, CapturedMessageHeadersUtil.oldSemconvAttributeKey(name), values); + } + if (SemconvStability.isEmitStableMessageSemconv()) { + internalSet( + attributes, CapturedMessageHeadersUtil.stableSemconvAttributeKey(name), values); + } } } } diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java index e54a62530b67..1c2aec80bd18 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/SemconvStability.java @@ -24,6 +24,9 @@ public final class SemconvStability { private static final boolean emitOldCodeSemconv; private static final boolean emitStableCodeSemconv; + private static final boolean emitOldMessageSemconv; + private static final boolean emitStableMessageSemconv; + static { boolean oldDatabase = true; boolean stableDatabase = false; @@ -31,6 +34,9 @@ public final class SemconvStability { boolean oldCode = true; boolean stableCode = false; + boolean oldMessage = true; + boolean stableMessage = false; + String value = ConfigPropertiesUtil.getString("otel.semconv-stability.opt-in"); if (value != null) { Set values = new HashSet<>(asList(value.split(","))); @@ -55,6 +61,15 @@ public final class SemconvStability { oldCode = true; stableCode = true; } + + if (values.contains("message")) { + oldMessage = false; + stableMessage = true; + } + if (values.contains("message/dup")) { + oldMessage = true; + stableMessage = true; + } } emitOldDatabaseSemconv = oldDatabase; @@ -62,6 +77,9 @@ public final class SemconvStability { emitOldCodeSemconv = oldCode; emitStableCodeSemconv = stableCode; + + emitOldMessageSemconv = oldMessage; + emitStableMessageSemconv = stableMessage; } public static boolean emitOldDatabaseSemconv() { @@ -105,5 +123,13 @@ public static boolean isEmitStableCodeSemconv() { return emitStableCodeSemconv; } + public static boolean isEmitOldMessageSemconv() { + return emitOldMessageSemconv; + } + + public static boolean isEmitStableMessageSemconv() { + return emitStableMessageSemconv; + } + private SemconvStability() {} } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java index 284559753f2c..83806f87135b 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java @@ -5,7 +5,6 @@ package io.opentelemetry.instrumentation.awssdk.v1_11; -import static io.opentelemetry.api.common.AttributeKey.stringArrayKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -42,6 +41,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; @@ -182,7 +182,8 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead if (testCaptureHeaders) { attributes.add( satisfies( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), val -> val.isEqualTo(singletonList("test")))); } @@ -222,7 +223,8 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead if (testCaptureHeaders) { attributes.add( satisfies( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), val -> val.isEqualTo(singletonList("test")))); } @@ -261,7 +263,8 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead if (testCaptureHeaders) { attributes.add( satisfies( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), val -> val.isEqualTo(singletonList("test")))); } span.hasName("testSdkSqs process") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java index 426cd60f7263..a25669a84f5a 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java @@ -5,7 +5,6 @@ package io.opentelemetry.instrumentation.awssdk.v2_2; -import static io.opentelemetry.api.common.AttributeKey.stringArrayKey; import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -29,6 +28,7 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.trace.data.SpanData; @@ -93,7 +93,8 @@ protected void assertSqsTraces(boolean withParent, boolean captureHeaders) { if (captureHeaders) { attributes.add( satisfies( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), v -> v.isEqualTo(ImmutableList.of("test")))); } span.hasName("testSdkSqs publish") @@ -163,7 +164,8 @@ protected void assertSqsTraces(boolean withParent, boolean captureHeaders) { if (captureHeaders) { attributes.add( satisfies( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), v -> v.isEqualTo(ImmutableList.of("test")))); } @@ -201,7 +203,8 @@ protected void assertSqsTraces(boolean withParent, boolean captureHeaders) { if (captureHeaders) { attributes.add( satisfies( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), v -> v.isEqualTo(singletonList("test")))); } diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafkaclients/common/v0_11/internal/KafkaClientBaseTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafkaclients/common/v0_11/internal/KafkaClientBaseTest.java index 6c7a334a48ec..987cc9c64dd1 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafkaclients/common/v0_11/internal/KafkaClientBaseTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-0.11/testing/src/main/java/io/opentelemetry/instrumentation/kafkaclients/common/v0_11/internal/KafkaClientBaseTest.java @@ -19,6 +19,7 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -188,7 +189,7 @@ protected static List sendAttributes( if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; @@ -211,7 +212,7 @@ protected static List receiveAttributes(boolean testHeaders) if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; @@ -249,7 +250,7 @@ protected static List processAttributes( if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java index f8003095032d..b8794ea9acc5 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/InterceptorsTest.java @@ -5,7 +5,6 @@ package io.opentelemetry.instrumentation.kafkaclients.v2_6; -import static io.opentelemetry.api.common.AttributeKey.stringArrayKey; import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -22,6 +21,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.trace.data.LinkData; import java.nio.charset.StandardCharsets; import java.util.concurrent.atomic.AtomicReference; @@ -45,7 +45,7 @@ void assertTraces() { .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( equalTo( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), singletonList("test")), equalTo(MESSAGING_SYSTEM, "kafka"), equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), @@ -70,7 +70,8 @@ void assertTraces() { .hasLinksSatisfying(links -> assertThat(links).isEmpty()) .hasAttributesSatisfyingExactly( equalTo( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), singletonList("test")), equalTo(MESSAGING_SYSTEM, "kafka"), equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), @@ -87,7 +88,8 @@ void assertTraces() { .hasLinks(LinkData.create(producerSpanContext.get())) .hasAttributesSatisfyingExactly( equalTo( - stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), singletonList("test")), equalTo(MESSAGING_SYSTEM, "kafka"), equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java index b3cd095d09e4..eb1b5373a1a0 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperSuppressReceiveSpansTest.java @@ -17,6 +17,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -73,7 +74,7 @@ protected static List sendAttributes(boolean testHeaders) { if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; @@ -100,7 +101,7 @@ private static List processAttributes(String greeting, boole if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; diff --git a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java index 85ddd5aa4cad..59be7ed246bc 100644 --- a/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java +++ b/instrumentation/kafka/kafka-clients/kafka-clients-2.6/library/src/test/java/io/opentelemetry/instrumentation/kafkaclients/v2_6/WrapperTest.java @@ -20,6 +20,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; import java.nio.charset.StandardCharsets; @@ -96,7 +97,7 @@ protected static List sendAttributes(boolean testHeaders) { if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; @@ -123,7 +124,7 @@ private static List processAttributes(String greeting, boole if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; @@ -143,7 +144,7 @@ protected static List receiveAttributes(boolean testHeaders) if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java index 4adcbfd4c081..5d22808f32e3 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/AbstractPulsarClientTest.java @@ -22,6 +22,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; @@ -363,7 +364,7 @@ static List sendAttributes( if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } int partitionIndex = TopicName.getPartitionIndex(destination); @@ -399,7 +400,7 @@ static List receiveAttributes( if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } if (isBatch) { @@ -426,7 +427,7 @@ static List processAttributes( if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } int partitionIndex = TopicName.getPartitionIndex(destination); 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 d1a40a16f6ff..49a32c371d6d 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 @@ -22,6 +22,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.rocketmqclient.v4_8.base.BaseConf; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.trace.data.LinkData; import java.nio.charset.Charset; import java.util.ArrayList; @@ -408,8 +409,8 @@ void captureMessageHeaderAsSpanAttributes() throws Exception { AttributeKey.stringKey("messaging.rocketmq.send_result"), "SEND_OK"), equalTo( - AttributeKey.stringArrayKey( - "messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), singletonList("test"))), span -> span.hasName(sharedTopic + " process") @@ -435,8 +436,8 @@ void captureMessageHeaderAsSpanAttributes() throws Exception { AttributeKey.longKey("messaging.rocketmq.queue_offset"), val -> val.isInstanceOf(Long.class)), equalTo( - AttributeKey.stringArrayKey( - "messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), singletonList("test"))), span -> span.hasName("messageListener") diff --git a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java index e036d98ef91c..55436370a241 100644 --- a/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java +++ b/instrumentation/rocketmq/rocketmq-client/rocketmq-client-5.0/testing/src/main/java/io/opentelemetry/instrumentation/rocketmqclient/v5_0/AbstractRocketMqClientTest.java @@ -20,9 +20,9 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_ROCKETMQ_MESSAGE_TYPE; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; @@ -371,8 +371,8 @@ public void testCapturedMessageHeaders() throws Throwable { body, sendReceipt, equalTo( - AttributeKey.stringArrayKey( - "messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), Collections.singletonList("test"))) .hasParent(trace.getSpan(0))); sendSpanData.set(trace.getSpan(1)); @@ -391,8 +391,8 @@ public void testCapturedMessageHeaders() throws Throwable { body, sendReceipt, equalTo( - AttributeKey.stringArrayKey( - "messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey( + "Test-Message-Header"), Collections.singletonList("test"))) // As the child of receive span. .hasParent(trace.getSpan(0)), diff --git a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java index 9dcf62864caf..aa1ece8ff63f 100644 --- a/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java +++ b/instrumentation/spring/spring-rabbit-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/rabbit/v1_0/SpringRabbitMqTest.java @@ -19,11 +19,11 @@ import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.message.SemconvMessageStabilityUtil; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; @@ -130,7 +130,7 @@ private static List getAssertions( if (testHeaders) { assertions.add( equalTo( - AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), + SemconvMessageStabilityUtil.headerAttributeKey("Test-Message-Header"), Collections.singletonList("test"))); } return assertions; diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/message/SemconvMessageStabilityUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/message/SemconvMessageStabilityUtil.java new file mode 100644 index 000000000000..3f8e2e380900 --- /dev/null +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/message/SemconvMessageStabilityUtil.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.testing.junit.message; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import java.util.List; + +// until old message semconv are dropped in 3.0 +public class SemconvMessageStabilityUtil { + + public static AttributeKey> headerAttributeKey(String headerName) { + String key; + if (SemconvStability.isEmitOldMessageSemconv()) { + key = "messaging.header." + headerName.replace('-', '_'); + } else { + key = "messaging.header." + headerName; + } + return AttributeKey.stringArrayKey(key); + } + + private SemconvMessageStabilityUtil() {} +}