From 13ed57d5b0d0a874191f97e01b2fe3c7a0092cec Mon Sep 17 00:00:00 2001 From: Thomas Meum Date: Wed, 29 Jan 2025 09:01:50 +0100 Subject: [PATCH] Change to always link, optionally parent/child --- .../Impl/RabbitMQActivitySource.cs | 14 ++++++------- .../Impl/RabbitMQOpenTelemetryOptions.cs | 2 +- .../RabbitMQ.Client/PublicAPI.Unshipped.txt | 2 +- .../TestActivitySource.cs | 21 +++++++++---------- .../TestOpenTelemetry.cs | 13 ++++++------ 5 files changed, 24 insertions(+), 28 deletions(-) diff --git a/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs b/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs index cab593b6c..3c6d4eb43 100644 --- a/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs +++ b/projects/RabbitMQ.Client/Impl/RabbitMQActivitySource.cs @@ -116,10 +116,9 @@ public static class RabbitMQActivitySource } // Extract the PropagationContext of the upstream parent from the message headers. - ActivityContext linkedContext = LinkType == OpenTelemetryLinkType.AlwaysLink - ? ContextExtractor(readOnlyBasicProperties) : default; - ActivityContext parentContext = LinkType == OpenTelemetryLinkType.AlwaysParentChild - ? ContextExtractor(readOnlyBasicProperties) : default; + ActivityContext linkedContext = ContextExtractor(readOnlyBasicProperties); + ActivityContext parentContext = LinkType == OpenTelemetryLinkType.AlwaysParentChildAndLink + ? linkedContext : default; Activity? activity = s_subscriberSource.StartLinkedRabbitMQActivity( UseRoutingKeyAsOperationName ? $"{MessagingOperationNameBasicGet} {routingKey}" : MessagingOperationNameBasicGet, ActivityKind.Consumer, @@ -144,10 +143,9 @@ public static class RabbitMQActivitySource } // Extract the PropagationContext of the upstream parent from the message headers. - ActivityContext linkedContext = LinkType == OpenTelemetryLinkType.AlwaysLink - ? ContextExtractor(readOnlyBasicProperties) : default; - ActivityContext parentContext = LinkType == OpenTelemetryLinkType.AlwaysParentChild - ? ContextExtractor(readOnlyBasicProperties) : default; + ActivityContext linkedContext = ContextExtractor(readOnlyBasicProperties); + ActivityContext parentContext = LinkType == OpenTelemetryLinkType.AlwaysParentChildAndLink + ? linkedContext : default; Activity? activity = s_subscriberSource.StartLinkedRabbitMQActivity( UseRoutingKeyAsOperationName ? $"{MessagingOperationNameBasicDeliver} {routingKey}" : MessagingOperationNameBasicDeliver, diff --git a/projects/RabbitMQ.Client/Impl/RabbitMQOpenTelemetryOptions.cs b/projects/RabbitMQ.Client/Impl/RabbitMQOpenTelemetryOptions.cs index 88c314c5e..a261cf00e 100644 --- a/projects/RabbitMQ.Client/Impl/RabbitMQOpenTelemetryOptions.cs +++ b/projects/RabbitMQ.Client/Impl/RabbitMQOpenTelemetryOptions.cs @@ -3,7 +3,7 @@ public enum OpenTelemetryLinkType { AlwaysLink, - AlwaysParentChild + AlwaysParentChildAndLink } public class RabbitMQOpenTelemetryOptions diff --git a/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt b/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt index 401e1317e..19c73b0ad 100644 --- a/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt +++ b/projects/RabbitMQ.Client/PublicAPI.Unshipped.txt @@ -1,6 +1,6 @@ RabbitMQ.Client.OpenTelemetryLinkType RabbitMQ.Client.OpenTelemetryLinkType.AlwaysLink = 0 -> RabbitMQ.Client.OpenTelemetryLinkType -RabbitMQ.Client.OpenTelemetryLinkType.AlwaysParentChild = 1 -> RabbitMQ.Client.OpenTelemetryLinkType +RabbitMQ.Client.OpenTelemetryLinkType.AlwaysParentChildAndLink = 1 -> RabbitMQ.Client.OpenTelemetryLinkType RabbitMQ.Client.RabbitMQOpenTelemetryOptions RabbitMQ.Client.RabbitMQOpenTelemetryOptions.LinkType.get -> RabbitMQ.Client.OpenTelemetryLinkType RabbitMQ.Client.RabbitMQOpenTelemetryOptions.LinkType.set -> void diff --git a/projects/Test/SequentialIntegration/TestActivitySource.cs b/projects/Test/SequentialIntegration/TestActivitySource.cs index 3111ceb13..0da263523 100644 --- a/projects/Test/SequentialIntegration/TestActivitySource.cs +++ b/projects/Test/SequentialIntegration/TestActivitySource.cs @@ -83,7 +83,7 @@ void AssertIntTagGreaterThanZero(Activity activity, string name) public async Task TestPublisherAndConsumerActivityTags(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var _activities = new List(); using ActivityListener activityListener = StartActivityListener(_activities); await Task.Delay(500); @@ -120,7 +120,7 @@ public async Task TestPublisherAndConsumerActivityTags(bool useRoutingKeyAsOpera public async Task TestPublisherWithCachedStringsAndConsumerActivityTags(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var _activities = new List(); using ActivityListener activityListener = StartActivityListener(_activities); await Task.Delay(500); @@ -159,7 +159,7 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTags(bool use public async Task TestPublisherWithPublicationAddressAndConsumerActivityTags(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var _activities = new List(); using ActivityListener activityListener = StartActivityListener(_activities); await Task.Delay(500); @@ -197,7 +197,7 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTags(boo public async Task TestPublisherAndConsumerActivityTagsAsync(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var activities = new List(); using ActivityListener activityListener = StartActivityListener(activities); await Task.Delay(500); @@ -235,7 +235,7 @@ public async Task TestPublisherAndConsumerActivityTagsAsync(bool useRoutingKeyAs public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var activities = new List(); using ActivityListener activityListener = StartActivityListener(activities); await Task.Delay(500); @@ -275,7 +275,7 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsync(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var activities = new List(); using ActivityListener activityListener = StartActivityListener(activities); await Task.Delay(500); @@ -314,7 +314,7 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var activities = new List(); using ActivityListener activityListener = StartActivityListener(activities); await Task.Delay(500); @@ -348,7 +348,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera public async Task TestPublisherWithCachedStringsAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var activities = new List(); using ActivityListener activityListener = StartActivityListener(activities); await Task.Delay(500); @@ -384,7 +384,7 @@ public async Task TestPublisherWithCachedStringsAndBasicGetActivityTags(bool use public async Task TestPublisherWithPublicationAddressAndBasicGetActivityTags(bool useRoutingKeyAsOperationName, bool useParentChildLinking) { RabbitMQActivitySource.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + RabbitMQActivitySource.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; var activities = new List(); using ActivityListener activityListener = StartActivityListener(activities); await Task.Delay(500); @@ -452,15 +452,14 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, bool useParen x.OperationName == (useRoutingKeyAsOperationName ? $"{childName} {queueName}" : childName)); Assert.Equal(ActivityKind.Producer, sendActivity.Kind); Assert.Equal(ActivityKind.Consumer, receiveActivity.Kind); + Assert.Equal(sendActivity.TraceId, receiveActivity.Links.Single().Context.TraceId); if (useParentChildLinking) { - Assert.Empty(receiveActivity.Links); Assert.Equal(sendActivity.Id, receiveActivity.ParentId); Assert.Equal(sendActivity.TraceId, receiveActivity.TraceId); } else { - Assert.Equal(sendActivity.TraceId, receiveActivity.Links.Single().Context.TraceId); Assert.Null(receiveActivity.ParentId); Assert.NotEqual(sendActivity.TraceId, receiveActivity.TraceId); } diff --git a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs index 8fe04905d..c082796a3 100644 --- a/projects/Test/SequentialIntegration/TestOpenTelemetry.cs +++ b/projects/Test/SequentialIntegration/TestOpenTelemetry.cs @@ -94,7 +94,7 @@ public async Task TestPublisherAndConsumerActivityTags(bool useRoutingKeyAsOpera .AddRabbitMQInstrumentation(options => { options.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; }) .AddInMemoryExporter(exportedItems) .Build(); @@ -152,7 +152,7 @@ public async Task TestPublisherAndConsumerActivityTagsAsync(bool useRoutingKeyAs .AddRabbitMQInstrumentation(options => { options.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; }) .AddInMemoryExporter(exportedItems) .Build(); @@ -211,7 +211,7 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn .AddRabbitMQInstrumentation(options => { options.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; }) .AddInMemoryExporter(exportedItems) .Build(); @@ -271,7 +271,7 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo .AddRabbitMQInstrumentation(options => { options.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; }) .AddInMemoryExporter(exportedItems) .Build(); @@ -332,7 +332,7 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera .AddRabbitMQInstrumentation(options => { options.UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName; - options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChild : OpenTelemetryLinkType.AlwaysLink; + options.LinkType = useParentChildLinking ? OpenTelemetryLinkType.AlwaysParentChildAndLink : OpenTelemetryLinkType.AlwaysLink; }) .AddInMemoryExporter(exportedItems) .Build(); @@ -387,15 +387,14 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, bool useParen x.OperationName == (useRoutingKeyAsOperationName ? $"{childName} {queueName}" : childName)); Assert.Equal(ActivityKind.Producer, sendActivity.Kind); Assert.Equal(ActivityKind.Consumer, receiveActivity.Kind); + Assert.Equal(sendActivity.TraceId, receiveActivity.Links.Single().Context.TraceId); if (useParentChildLinking) { - Assert.Empty(receiveActivity.Links); Assert.Equal(sendActivity.Id, receiveActivity.ParentId); Assert.Equal(sendActivity.TraceId, receiveActivity.TraceId); } else { - Assert.Equal(sendActivity.TraceId, receiveActivity.Links.Single().Context.TraceId); Assert.Null(receiveActivity.ParentId); Assert.NotEqual(sendActivity.TraceId, receiveActivity.TraceId); }