Skip to content

Commit 699470d

Browse files
authored
Account for nullable events (#324)
* Account for nullable events * Fix json vulnerability * Upgrade deprecated gh actions * Fix tests * Remove susbcribe_to_stream test
1 parent e37e8ec commit 699470d

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

Diff for: src/EventStore.Client/Common/Diagnostics/ActivitySourceExtensions.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
2+
13
using System.Diagnostics;
24
using EventStore.Diagnostics;
35
using EventStore.Diagnostics.Telemetry;
@@ -32,7 +34,7 @@ public static void TraceSubscriptionEvent(
3234
EventStoreClientSettings settings,
3335
UserCredentials? userCredentials
3436
) {
35-
if (source.HasNoActiveListeners())
37+
if (source.HasNoActiveListeners() || resolvedEvent.Event is null)
3638
return;
3739

3840
var parentContext = resolvedEvent.Event.Metadata.ExtractPropagationContext();

Diff for: test/EventStore.Client.Streams.Tests/Diagnostics/StreamsTracingInstrumentationTests.cs

+47
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// ReSharper disable ConditionalAccessQualifierIsNonNullableAccordingToAPIContract
2+
13
using EventStore.Client.Diagnostics;
24
using EventStore.Diagnostics.Tracing;
35

@@ -171,4 +173,49 @@ async Task Subscribe(IAsyncEnumerator<StreamMessage> internalEnumerator) {
171173
}
172174
}
173175
}
176+
177+
[Fact]
178+
[Trait("Category", "Special cases")]
179+
public async Task should_not_trace_when_event_is_null() {
180+
var category = Guid.NewGuid().ToString("N");
181+
var streamName = category + "-123";
182+
183+
var seedEvents = Fixture.CreateTestEvents(type: $"{category}-{Fixture.GetStreamName()}").ToArray();
184+
await Fixture.Streams.AppendToStreamAsync(streamName, StreamState.NoStream, seedEvents);
185+
186+
await Fixture.Streams.DeleteAsync(streamName, StreamState.StreamExists);
187+
188+
await using var subscription = Fixture.Streams.SubscribeToStream("$ce-" + category, FromStream.Start, resolveLinkTos: true);
189+
190+
await using var enumerator = subscription.Messages.GetAsyncEnumerator();
191+
192+
Assert.True(await enumerator.MoveNextAsync());
193+
194+
Assert.IsType<StreamMessage.SubscriptionConfirmation>(enumerator.Current);
195+
196+
await Subscribe().WithTimeout();
197+
198+
var appendActivities = Fixture
199+
.GetActivitiesForOperation(TracingConstants.Operations.Append, streamName)
200+
.ShouldNotBeNull();
201+
202+
var subscribeActivities = Fixture
203+
.GetActivitiesForOperation(TracingConstants.Operations.Subscribe, "$ce-" + category)
204+
.ToArray();
205+
206+
appendActivities.ShouldHaveSingleItem();
207+
subscribeActivities.ShouldBeEmpty();
208+
209+
return;
210+
211+
async Task Subscribe() {
212+
while (await enumerator.MoveNextAsync()) {
213+
if (enumerator.Current is not StreamMessage.Event(var resolvedEvent))
214+
continue;
215+
216+
if (resolvedEvent.Event?.EventType is "$metadata")
217+
return;
218+
}
219+
}
220+
}
174221
}

Diff for: test/EventStore.Client.Tests.Common/Fixtures/DiagnosticsFixture.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace EventStore.Client.Tests;
1111
public class DiagnosticsFixture : EventStoreFixture {
1212
readonly ConcurrentDictionary<(string Operation, string Stream), List<Activity>> _activities = [];
1313

14-
public DiagnosticsFixture() {
14+
public DiagnosticsFixture() : base(x => x.RunProjections()) {
1515
var diagnosticActivityListener = new ActivityListener {
1616
ShouldListenTo = source => source.Name == EventStoreClientDiagnostics.InstrumentationName,
1717
Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllDataAndRecorded,

0 commit comments

Comments
 (0)