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)