From 20a71f46dc7cd6f94d9a2699c9289c853b61c439 Mon Sep 17 00:00:00 2001 From: timmy-cca Date: Wed, 25 Jun 2025 13:27:01 -0400 Subject: [PATCH 1/3] Pass basic props to RabbitMQActivitySource.BasicPublish to allow messageid tag to be included in trace span --- .../Impl/Channel.BasicPublish.cs | 4 ++-- .../Impl/RabbitMQActivitySource.cs | 4 ++-- .../TestActivitySource.cs | 22 ++++++++++++++----- .../TestOpenTelemetry.cs | 22 ++++++++++++++----- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/projects/RabbitMQ.Client/Impl/Channel.BasicPublish.cs b/projects/RabbitMQ.Client/Impl/Channel.BasicPublish.cs index c0d68f690..1b44f6844 100644 --- a/projects/RabbitMQ.Client/Impl/Channel.BasicPublish.cs +++ b/projects/RabbitMQ.Client/Impl/Channel.BasicPublish.cs @@ -61,7 +61,7 @@ await MaybeEnforceFlowControlAsync(cancellationToken) var cmd = new BasicPublish(exchange, routingKey, mandatory, default); using Activity? sendActivity = RabbitMQActivitySource.PublisherHasListeners - ? RabbitMQActivitySource.BasicPublish(routingKey, exchange, body.Length) + ? RabbitMQActivitySource.BasicPublish(routingKey, exchange, body.Length, basicProperties) : default; ulong publishSequenceNumber = 0; @@ -116,7 +116,7 @@ await MaybeEnforceFlowControlAsync(cancellationToken) var cmd = new BasicPublishMemory(exchange.Bytes, routingKey.Bytes, mandatory, default); using Activity? sendActivity = RabbitMQActivitySource.PublisherHasListeners - ? RabbitMQActivitySource.BasicPublish(routingKey.Value, exchange.Value, body.Length) + ? RabbitMQActivitySource.BasicPublish(routingKey.Value, exchange.Value, body.Length, basicProperties) : default; ulong publishSequenceNumber = 0; diff --git a/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs b/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs index 31d076cbd..5457667a8 100644 --- a/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs +++ b/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs @@ -61,7 +61,7 @@ public static class RabbitMQActivitySource new KeyValuePair(ProtocolVersion, "0.9.1") }; - internal static Activity? BasicPublish(string routingKey, string exchange, int bodySize, + internal static Activity? BasicPublish(string routingKey, string exchange, int bodySize, IReadOnlyBasicProperties basicProperties, ActivityContext linkedContext = default) { if (!s_publisherSource.HasListeners()) @@ -78,7 +78,7 @@ public static class RabbitMQActivitySource ActivityKind.Producer, linkedContext); if (activity != null && activity.IsAllDataRequested) { - PopulateMessagingTags(MessagingOperationTypeSend, MessagingOperationNameBasicPublish, routingKey, exchange, 0, bodySize, activity); + PopulateMessagingTags(MessagingOperationTypeSend, MessagingOperationNameBasicPublish, routingKey, exchange, 0, basicProperties, bodySize, activity); } return activity; diff --git a/projects/Test/SequentialIntegration/TestActivitySource.cs b/projects/Test/SequentialIntegration/TestActivitySource.cs index af84b39e7..ce2a2b16a 100644 --- a/projects/Test/SequentialIntegration/TestActivitySource.cs +++ b/projects/Test/SequentialIntegration/TestActivitySource.cs @@ -289,9 +289,11 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn } [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName) + [InlineData(true, true)] + [InlineData(false, true)] + [InlineData(true, false)] + [InlineData(false, false)] + public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool verifyMessageIdTag) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; var activities = new List(); @@ -300,10 +302,12 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera string queue = $"queue-{Guid.NewGuid()}"; const string msg = "for basic.get"; + var basicProps = new BasicProperties() { MessageId = Guid.NewGuid().ToString() }; + try { await _channel.QueueDeclareAsync(queue, false, false, false, null); - await _channel.BasicPublishAsync("", queue, true, Encoding.UTF8.GetBytes(msg)); + await _channel.BasicPublishAsync("", queue, true, basicProps, Encoding.UTF8.GetBytes(msg)); QueueDeclareOk ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(1u, ok.MessageCount); BasicGetResult res = await _channel.BasicGetAsync(queue, true); @@ -311,7 +315,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(0u, ok.MessageCount); await Task.Delay(500); - AssertActivityData(useRoutingKeyAsOperationName, queue, activities, false); + AssertActivityData(useRoutingKeyAsOperationName, queue, activities, false, verifyMessageIdTag); } finally { @@ -400,7 +404,7 @@ private static ActivityListener StartActivityListener(List activities) } private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueName, - List activityList, bool isDeliver = false) + List activityList, bool isDeliver = false, bool verifyMessageIdTag = false) { string childName = isDeliver ? "deliver" : "fetch"; Activity[] activities = activityList.ToArray(); @@ -444,6 +448,12 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueN AssertIntTagGreaterThanZero(sendActivity, RabbitMQActivitySource.MessagingEnvelopeSize); AssertIntTagGreaterThanZero(sendActivity, RabbitMQActivitySource.MessagingBodySize); AssertIntTagGreaterThanZero(receiveActivity, RabbitMQActivitySource.MessagingBodySize); + + if (verifyMessageIdTag) + { + AssertStringTagNotNullOrEmpty(sendActivity, RabbitMQActivitySource.MessageId); + AssertStringTagNotNullOrEmpty(receiveActivity, RabbitMQActivitySource.MessageId); + } } } } diff --git a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs index 020c4ffd2..9f67aa557 100644 --- a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs +++ b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs @@ -301,9 +301,11 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo } [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName) + [InlineData(true, true)] + [InlineData(false, true)] + [InlineData(true, false)] + [InlineData(false, false)] + public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool verifyMessageIdTag) { var exportedItems = new List(); using var tracer = Sdk.CreateTracerProviderBuilder() @@ -318,10 +320,12 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera string queue = $"queue-{Guid.NewGuid()}"; const string msg = "for basic.get"; + var basicProps = new BasicProperties() { MessageId = Guid.NewGuid().ToString() }; + try { await _channel.QueueDeclareAsync(queue, false, false, false, null); - await _channel.BasicPublishAsync("", queue, true, Encoding.UTF8.GetBytes(msg)); + await _channel.BasicPublishAsync("", queue, true, basicProps, Encoding.UTF8.GetBytes(msg)); Baggage.ClearBaggage(); Assert.Null(Baggage.GetBaggage("TestItem")); QueueDeclareOk ok = await _channel.QueueDeclarePassiveAsync(queue); @@ -331,7 +335,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(0u, ok.MessageCount); await Task.Delay(500); - AssertActivityData(useRoutingKeyAsOperationName, queue, exportedItems, false); + AssertActivityData(useRoutingKeyAsOperationName, queue, exportedItems, false, verifyMessageIdTag); } finally { @@ -340,7 +344,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera } private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueName, - List activityList, bool isDeliver = false, string baggageGuid = null) + List activityList, bool isDeliver = false, bool verifyMessageIdTag = false) { string childName = isDeliver ? "deliver" : "fetch"; string childType = isDeliver ? "process" : "receive"; @@ -385,6 +389,12 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueN AssertStringTagEquals(receiveActivity, RabbitMQActivitySource.MessagingOperationName, childName); AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessagingOperationType, "send"); AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessagingOperationName, "publish"); + + if (verifyMessageIdTag) + { + AssertStringTagNotNullOrEmpty(sendActivity, RabbitMQActivitySource.MessageId); + AssertStringTagNotNullOrEmpty(receiveActivity, RabbitMQActivitySource.MessageId); + } } } } From 64f1ac40f01e7c4677c24553ffcd565d6fdfd088 Mon Sep 17 00:00:00 2001 From: timmy-cca Date: Mon, 30 Jun 2025 09:17:05 -0400 Subject: [PATCH 2/3] updated tests for messageid tag --- .../SequentialIntegration/TestActivitySource.cs | 14 +++++++------- .../SequentialIntegration/TestOpenTelemetry.cs | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/projects/Test/SequentialIntegration/TestActivitySource.cs b/projects/Test/SequentialIntegration/TestActivitySource.cs index ce2a2b16a..294ef10b3 100644 --- a/projects/Test/SequentialIntegration/TestActivitySource.cs +++ b/projects/Test/SequentialIntegration/TestActivitySource.cs @@ -293,7 +293,7 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn [InlineData(false, true)] [InlineData(true, false)] [InlineData(false, false)] - public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool verifyMessageIdTag) + public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool useMessageId) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; var activities = new List(); @@ -302,7 +302,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera string queue = $"queue-{Guid.NewGuid()}"; const string msg = "for basic.get"; - var basicProps = new BasicProperties() { MessageId = Guid.NewGuid().ToString() }; + var basicProps = useMessageId ? new BasicProperties() { MessageId = Guid.NewGuid().ToString() } : new BasicProperties(); try { @@ -315,7 +315,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(0u, ok.MessageCount); await Task.Delay(500); - AssertActivityData(useRoutingKeyAsOperationName, queue, activities, false, verifyMessageIdTag); + AssertActivityData(useRoutingKeyAsOperationName, queue, activities, false, basicProps.MessageId); } finally { @@ -404,7 +404,7 @@ private static ActivityListener StartActivityListener(List activities) } private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueName, - List activityList, bool isDeliver = false, bool verifyMessageIdTag = false) + List activityList, bool isDeliver = false, string messageId = null) { string childName = isDeliver ? "deliver" : "fetch"; Activity[] activities = activityList.ToArray(); @@ -449,10 +449,10 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueN AssertIntTagGreaterThanZero(sendActivity, RabbitMQActivitySource.MessagingBodySize); AssertIntTagGreaterThanZero(receiveActivity, RabbitMQActivitySource.MessagingBodySize); - if (verifyMessageIdTag) + if (messageId is not null) { - AssertStringTagNotNullOrEmpty(sendActivity, RabbitMQActivitySource.MessageId); - AssertStringTagNotNullOrEmpty(receiveActivity, RabbitMQActivitySource.MessageId); + AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessageId, messageId); + AssertStringTagEquals(receiveActivity, RabbitMQActivitySource.MessageId, messageId); } } } diff --git a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs index 9f67aa557..41696056f 100644 --- a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs +++ b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs @@ -305,7 +305,7 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo [InlineData(false, true)] [InlineData(true, false)] [InlineData(false, false)] - public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool verifyMessageIdTag) + public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool useMessageId) { var exportedItems = new List(); using var tracer = Sdk.CreateTracerProviderBuilder() @@ -320,7 +320,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera string queue = $"queue-{Guid.NewGuid()}"; const string msg = "for basic.get"; - var basicProps = new BasicProperties() { MessageId = Guid.NewGuid().ToString() }; + var basicProps = useMessageId ? new BasicProperties() { MessageId = Guid.NewGuid().ToString() } : new BasicProperties(); try { @@ -335,7 +335,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(0u, ok.MessageCount); await Task.Delay(500); - AssertActivityData(useRoutingKeyAsOperationName, queue, exportedItems, false, verifyMessageIdTag); + AssertActivityData(useRoutingKeyAsOperationName, queue, exportedItems, false, basicProps.MessageId); } finally { @@ -344,7 +344,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera } private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueName, - List activityList, bool isDeliver = false, bool verifyMessageIdTag = false) + List activityList, bool isDeliver = false, string messageId = null) { string childName = isDeliver ? "deliver" : "fetch"; string childType = isDeliver ? "process" : "receive"; @@ -390,10 +390,10 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueN AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessagingOperationType, "send"); AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessagingOperationName, "publish"); - if (verifyMessageIdTag) + if (messageId is not null) { - AssertStringTagNotNullOrEmpty(sendActivity, RabbitMQActivitySource.MessageId); - AssertStringTagNotNullOrEmpty(receiveActivity, RabbitMQActivitySource.MessageId); + AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessageId, messageId); + AssertStringTagEquals(receiveActivity, RabbitMQActivitySource.MessageId, messageId); } } } From c2d75113e47350bf04687ed80dad8e0731b9ca67 Mon Sep 17 00:00:00 2001 From: timmy-cca Date: Mon, 14 Jul 2025 09:23:46 -0400 Subject: [PATCH 3/3] corrected broken tests after bad conflict resolution from merging main into feature branch --- .../SequentialIntegration/TestActivitySource.cs | 12 ++++++++---- .../SequentialIntegration/TestOpenTelemetry.cs | 14 +++++++++----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/projects/Test/SequentialIntegration/TestActivitySource.cs b/projects/Test/SequentialIntegration/TestActivitySource.cs index aae73ea17..2784dc711 100644 --- a/projects/Test/SequentialIntegration/TestActivitySource.cs +++ b/projects/Test/SequentialIntegration/TestActivitySource.cs @@ -307,10 +307,14 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn } [Theory] - [InlineData(true, true)] - [InlineData(true, false)] - [InlineData(false, true)] - [InlineData(false, false)] + [InlineData(true, true, true)] + [InlineData(true, true, false)] + [InlineData(true, false, true)] + [InlineData(true, false, false)] + [InlineData(false, true, true)] + [InlineData(false, true, false)] + [InlineData(false, false, true)] + [InlineData(false, false, false)] public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool usePublisherAsParent, bool useMessageId) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; diff --git a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs index 2865f2cb0..ed767b26a 100644 --- a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs +++ b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs @@ -333,11 +333,15 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo } [Theory] - [InlineData(true, true)] - [InlineData(true, false)] - [InlineData(false, true)] - [InlineData(false, false)] - public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool usePublisherAsParent, basicProps.MessageId) + [InlineData(true, true, true)] + [InlineData(true, true, false)] + [InlineData(true, false, true)] + [InlineData(true, false, false)] + [InlineData(false, true, true)] + [InlineData(false, true, false)] + [InlineData(false, false, true)] + [InlineData(false, false, false)] + public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool usePublisherAsParent, bool useMessageId) { var exportedItems = new List(); using var tracer = Sdk.CreateTracerProviderBuilder()