From 12b6e39fb411ff6c824b7568576598d86e20977b Mon Sep 17 00:00:00 2001 From: Joseph Cummings <38347313+josephcummings@users.noreply.github.com> Date: Thu, 6 Jun 2024 19:07:34 +0100 Subject: [PATCH] Tracing improvements (#311) * Use TryGetProperty when extracting tracing metadata to prevent exception being thrown in absence thereof * Use JsonDocument.TryParseValue * Handle empty metadata case and dispose of JsonDocument if instantiated * Implement short-circuit to improve performance when there are no active diagnostic listeners --- .../Diagnostics/ActivitySourceExtensions.cs | 8 +++++++ .../Diagnostics/EventMetadataExtensions.cs | 21 +++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/EventStore.Client/Common/Diagnostics/ActivitySourceExtensions.cs b/src/EventStore.Client/Common/Diagnostics/ActivitySourceExtensions.cs index 985d6133d..02af67eaa 100644 --- a/src/EventStore.Client/Common/Diagnostics/ActivitySourceExtensions.cs +++ b/src/EventStore.Client/Common/Diagnostics/ActivitySourceExtensions.cs @@ -32,6 +32,9 @@ public static void TraceSubscriptionEvent( EventStoreClientSettings settings, UserCredentials? userCredentials ) { + if (source.HasNoActiveListeners()) + return; + var parentContext = resolvedEvent.OriginalEvent.Metadata.ExtractPropagationContext(); if (parentContext is null) return; @@ -53,6 +56,9 @@ public static void TraceSubscriptionEvent( this ActivitySource source, string operationName, ActivityKind activityKind, ActivityTagsCollection? tags = null, ActivityContext? parentContext = null ) { + if (source.HasNoActiveListeners()) + return null; + (tags ??= new ActivityTagsCollection()) .WithRequiredTag(TelemetryTags.Database.System, "eventstoredb") .WithRequiredTag(TelemetryTags.Database.Operation, operationName); @@ -67,4 +73,6 @@ public static void TraceSubscriptionEvent( ) ?.Start(); } + + static bool HasNoActiveListeners(this ActivitySource source) => !source.HasListeners(); } \ No newline at end of file diff --git a/src/EventStore.Client/Common/Diagnostics/EventMetadataExtensions.cs b/src/EventStore.Client/Common/Diagnostics/EventMetadataExtensions.cs index 19109b538..f5af53005 100644 --- a/src/EventStore.Client/Common/Diagnostics/EventMetadataExtensions.cs +++ b/src/EventStore.Client/Common/Diagnostics/EventMetadataExtensions.cs @@ -17,19 +17,22 @@ public static ReadOnlySpan InjectTracingContext(this ReadOnlyMemory [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TracingMetadata ExtractTracingMetadata(this ReadOnlyMemory eventMetadata) { - try { - using var doc = JsonDocument.Parse(eventMetadata); + if (eventMetadata.IsEmpty) + return TracingMetadata.None; - return new TracingMetadata( - doc.RootElement.GetProperty(TracingConstants.Metadata.TraceId).GetString(), - doc.RootElement.GetProperty(TracingConstants.Metadata.SpanId).GetString() - ); - } - catch (Exception) { + var reader = new Utf8JsonReader(eventMetadata.Span); + if (!JsonDocument.TryParseValue(ref reader, out var doc)) return TracingMetadata.None; + + using (doc) { + if (!doc.RootElement.TryGetProperty(TracingConstants.Metadata.TraceId, out var traceId) + || !doc.RootElement.TryGetProperty(TracingConstants.Metadata.SpanId, out var spanId)) + return TracingMetadata.None; + + return new TracingMetadata(traceId.GetString(), spanId.GetString()); } } - + [MethodImpl(MethodImplOptions.AggressiveInlining)] static ReadOnlySpan InjectTracingMetadata(this ReadOnlyMemory eventMetadata, TracingMetadata tracingMetadata) { if (tracingMetadata == TracingMetadata.None || !tracingMetadata.IsValid)