From 8772cd5df823a93db876ce7639c1069b604c4beb Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 3 Jul 2026 17:52:35 +0200 Subject: [PATCH] feat(events): trace event publishing at verbose level with listener counts --- .../Services/EventBusService.cs | 6 +++ .../Services/Core/EventBusServiceTests.cs | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/SquidStd.Services.Core/Services/EventBusService.cs b/src/SquidStd.Services.Core/Services/EventBusService.cs index 2b1ea54..cb95a23 100644 --- a/src/SquidStd.Services.Core/Services/EventBusService.cs +++ b/src/SquidStd.Services.Core/Services/EventBusService.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.Diagnostics; using Serilog; +using Serilog.Events; using SquidStd.Core.Data.Events; using SquidStd.Core.Interfaces.Events; using SquidStd.Services.Core.Services.Internal; @@ -48,6 +49,11 @@ public async Task PublishAsync(TEvent eventData, CancellationToken cance var total = (typed?.Length ?? 0) + (global?.Length ?? 0); + if (_logger.IsEnabled(LogEventLevel.Verbose)) + { + _logger.Verbose("Publishing {EventType} to {ListenerCount} listener(s)", typeof(TEvent).Name, total); + } + if (total == 0) { return; diff --git a/tests/SquidStd.Tests/Services/Core/EventBusServiceTests.cs b/tests/SquidStd.Tests/Services/Core/EventBusServiceTests.cs index 4d74712..de58207 100644 --- a/tests/SquidStd.Tests/Services/Core/EventBusServiceTests.cs +++ b/tests/SquidStd.Tests/Services/Core/EventBusServiceTests.cs @@ -256,6 +256,48 @@ public async Task HandleAsync(TestEvent eventData, CancellationToken cancellatio [Collection(SerilogEventSinkCollection.Name)] public class Telemetry { + [Fact] + public async Task PublishAsync_AtVerbose_TracesEventFlow() + { + var sink = new CapturingLogSink(); + var original = Log.Logger; + Log.Logger = new LoggerConfiguration() + .MinimumLevel + .Verbose() + .WriteTo + .Sink(sink) + .CreateLogger(); + + try + { + using var eventBus = new EventBusService(new()); + IEventBus bus = eventBus; + bus.Subscribe((_, _) => Task.CompletedTask); + + await bus.PublishAsync(new TestEvent("payload"), CancellationToken.None); + await bus.PublishAsync(new OtherEvent(), CancellationToken.None); // zero listeners + + Assert.Contains( + sink.Events, + e => e.Level == LogEventLevel.Verbose + && e.RenderMessage().Contains("TestEvent", StringComparison.Ordinal) + && e.RenderMessage().Contains("1 listener", StringComparison.Ordinal) + ); + Assert.Contains( + sink.Events, + e => e.Level == LogEventLevel.Verbose + && e.RenderMessage().Contains("OtherEvent", StringComparison.Ordinal) + && e.RenderMessage().Contains("0 listener", StringComparison.Ordinal) + ); + } + finally + { + Log.Logger = original; + } + } + + private sealed record OtherEvent : IEvent; + [Fact] public async Task PublishAsync_SlowListener_LogsWarning() {