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 764828ce3..faa813bdd 100644 --- a/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs +++ b/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs @@ -66,7 +66,7 @@ public static bool UseRoutingKeyAsOperationName 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()) @@ -83,7 +83,7 @@ public static bool UseRoutingKeyAsOperationName 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 6591638ce..2784dc711 100644 --- a/projects/Test/SequentialIntegration/TestActivitySource.cs +++ b/projects/Test/SequentialIntegration/TestActivitySource.cs @@ -307,11 +307,15 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn } [Theory] - [InlineData(true, true)] - [InlineData(true, false)] - [InlineData(false, true)] - [InlineData(false, false)] - public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool usePublisherAsParent) + [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; RabbitMQActivitySource.TracingOptions.UsePublisherAsParent = usePublisherAsParent; @@ -321,10 +325,12 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera string queue = $"queue-{Guid.NewGuid()}"; const string msg = "for basic.get"; + var basicProps = useMessageId ? new BasicProperties() { MessageId = Guid.NewGuid().ToString() } : new BasicProperties(); + 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); @@ -332,7 +338,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(0u, ok.MessageCount); await Task.Delay(500); - AssertActivityData(useRoutingKeyAsOperationName, usePublisherAsParent, queue, activities, false); + AssertActivityData(useRoutingKeyAsOperationName, usePublisherAsParent, queue, activities, false, basicProps.MessageId); } finally { @@ -427,7 +433,7 @@ private static ActivityListener StartActivityListener(List activities) } private void AssertActivityData(bool useRoutingKeyAsOperationName, bool usePublisherAsParent, string queueName, - List activityList, bool isDeliver = false) + List activityList, bool isDeliver = false, string messageId = null) { string childName = isDeliver ? "deliver" : "fetch"; Activity[] activities = activityList.ToArray(); @@ -480,6 +486,12 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, bool usePubli AssertIntTagGreaterThanZero(sendActivity, RabbitMQActivitySource.MessagingEnvelopeSize); AssertIntTagGreaterThanZero(sendActivity, RabbitMQActivitySource.MessagingBodySize); AssertIntTagGreaterThanZero(receiveActivity, RabbitMQActivitySource.MessagingBodySize); + + if (messageId is not null) + { + 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 254c310b5..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) + [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() @@ -355,10 +359,12 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera string queue = $"queue-{Guid.NewGuid()}"; const string msg = "for basic.get"; + var basicProps = useMessageId ? new BasicProperties() { MessageId = Guid.NewGuid().ToString() } : new BasicProperties(); + 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); @@ -368,7 +374,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera ok = await _channel.QueueDeclarePassiveAsync(queue); Assert.Equal(0u, ok.MessageCount); await Task.Delay(500); - AssertActivityData(useRoutingKeyAsOperationName, usePublisherAsParent, queue, exportedItems, false); + AssertActivityData(useRoutingKeyAsOperationName, usePublisherAsParent, queue, exportedItems, false, basicProps.MessageId); } finally { @@ -377,7 +383,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera } private void AssertActivityData(bool useRoutingKeyAsOperationName, bool usePublisherAsParent, string queueName, - List activityList, bool isDeliver = false, string baggageGuid = null) + List activityList, bool isDeliver = false, string messageId = null) { string childName = isDeliver ? "deliver" : "fetch"; string childType = isDeliver ? "process" : "receive"; @@ -432,6 +438,11 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, bool usePubli AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessagingOperationType, "send"); AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessagingOperationName, "publish"); + if (messageId is not null) + { + AssertStringTagEquals(sendActivity, RabbitMQActivitySource.MessageId, messageId); + AssertStringTagEquals(receiveActivity, RabbitMQActivitySource.MessageId, messageId); + } } } }