Skip to content

Commit 12b6e39

Browse files
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
1 parent fe24538 commit 12b6e39

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

src/EventStore.Client/Common/Diagnostics/ActivitySourceExtensions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public static void TraceSubscriptionEvent(
3232
EventStoreClientSettings settings,
3333
UserCredentials? userCredentials
3434
) {
35+
if (source.HasNoActiveListeners())
36+
return;
37+
3538
var parentContext = resolvedEvent.OriginalEvent.Metadata.ExtractPropagationContext();
3639

3740
if (parentContext is null) return;
@@ -53,6 +56,9 @@ public static void TraceSubscriptionEvent(
5356
this ActivitySource source,
5457
string operationName, ActivityKind activityKind, ActivityTagsCollection? tags = null, ActivityContext? parentContext = null
5558
) {
59+
if (source.HasNoActiveListeners())
60+
return null;
61+
5662
(tags ??= new ActivityTagsCollection())
5763
.WithRequiredTag(TelemetryTags.Database.System, "eventstoredb")
5864
.WithRequiredTag(TelemetryTags.Database.Operation, operationName);
@@ -67,4 +73,6 @@ public static void TraceSubscriptionEvent(
6773
)
6874
?.Start();
6975
}
76+
77+
static bool HasNoActiveListeners(this ActivitySource source) => !source.HasListeners();
7078
}

src/EventStore.Client/Common/Diagnostics/EventMetadataExtensions.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,22 @@ public static ReadOnlySpan<byte> InjectTracingContext(this ReadOnlyMemory<byte>
1717

1818
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1919
public static TracingMetadata ExtractTracingMetadata(this ReadOnlyMemory<byte> eventMetadata) {
20-
try {
21-
using var doc = JsonDocument.Parse(eventMetadata);
20+
if (eventMetadata.IsEmpty)
21+
return TracingMetadata.None;
2222

23-
return new TracingMetadata(
24-
doc.RootElement.GetProperty(TracingConstants.Metadata.TraceId).GetString(),
25-
doc.RootElement.GetProperty(TracingConstants.Metadata.SpanId).GetString()
26-
);
27-
}
28-
catch (Exception) {
23+
var reader = new Utf8JsonReader(eventMetadata.Span);
24+
if (!JsonDocument.TryParseValue(ref reader, out var doc))
2925
return TracingMetadata.None;
26+
27+
using (doc) {
28+
if (!doc.RootElement.TryGetProperty(TracingConstants.Metadata.TraceId, out var traceId)
29+
|| !doc.RootElement.TryGetProperty(TracingConstants.Metadata.SpanId, out var spanId))
30+
return TracingMetadata.None;
31+
32+
return new TracingMetadata(traceId.GetString(), spanId.GetString());
3033
}
3134
}
32-
35+
3336
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3437
static ReadOnlySpan<byte> InjectTracingMetadata(this ReadOnlyMemory<byte> eventMetadata, TracingMetadata tracingMetadata) {
3538
if (tracingMetadata == TracingMetadata.None || !tracingMetadata.IsValid)

0 commit comments

Comments
 (0)