From 263bb18099a43bbb2519b7653d00942a0dd217c1 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 17 May 2026 08:42:23 +0200 Subject: [PATCH] Fix structured log diagnostics registration --- ...ructuredLogsServiceCollectionExtensions.cs | 6 +-- ...ucturedLogWriteBufferStorageDiagnostics.cs | 9 ++++ ...uredLogServiceCollectionExtensionsTests.cs | 51 +++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Services/StructuredLogWriteBufferStorageDiagnostics.cs create mode 100644 test/unit/Elsa.Diagnostics.StructuredLogs.Persistence.Relational.UnitTests/RelationalStructuredLogServiceCollectionExtensionsTests.cs diff --git a/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Extensions/RelationalStructuredLogsServiceCollectionExtensions.cs b/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Extensions/RelationalStructuredLogsServiceCollectionExtensions.cs index 1cccfe199..8382ef170 100644 --- a/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Extensions/RelationalStructuredLogsServiceCollectionExtensions.cs +++ b/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Extensions/RelationalStructuredLogsServiceCollectionExtensions.cs @@ -21,9 +21,9 @@ public static class RelationalStructuredLogsServiceCollectionExtensions services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => sp.GetRequiredService()); + services.Replace(ServiceDescriptor.Singleton(sp => sp.GetRequiredService())); + services.Replace(ServiceDescriptor.Singleton(sp => sp.GetRequiredService())); + services.TryAddEnumerable(ServiceDescriptor.Singleton()); services.AddHostedService(sp => sp.GetRequiredService()); return services; diff --git a/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Services/StructuredLogWriteBufferStorageDiagnostics.cs b/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Services/StructuredLogWriteBufferStorageDiagnostics.cs new file mode 100644 index 000000000..b55107068 --- /dev/null +++ b/src/modules/Elsa.Diagnostics.StructuredLogs.Persistence.Relational/Services/StructuredLogWriteBufferStorageDiagnostics.cs @@ -0,0 +1,9 @@ +using Elsa.Diagnostics.StructuredLogs.Contracts; +using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Contracts; + +namespace Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Services; + +public class StructuredLogWriteBufferStorageDiagnostics(IStructuredLogWriteBuffer writeBuffer) : IStructuredLogStorageDiagnostics +{ + public long DroppedWriteCount => writeBuffer.DroppedWriteCount; +} diff --git a/test/unit/Elsa.Diagnostics.StructuredLogs.Persistence.Relational.UnitTests/RelationalStructuredLogServiceCollectionExtensionsTests.cs b/test/unit/Elsa.Diagnostics.StructuredLogs.Persistence.Relational.UnitTests/RelationalStructuredLogServiceCollectionExtensionsTests.cs new file mode 100644 index 000000000..9917e173a --- /dev/null +++ b/test/unit/Elsa.Diagnostics.StructuredLogs.Persistence.Relational.UnitTests/RelationalStructuredLogServiceCollectionExtensionsTests.cs @@ -0,0 +1,51 @@ +using System.Data.Common; +using Elsa.Diagnostics.StructuredLogs.Contracts; +using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Contracts; +using Elsa.Diagnostics.StructuredLogs.Persistence.Relational.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Diagnostics.StructuredLogs.Persistence.Relational.UnitTests; + +public class RelationalStructuredLogServiceCollectionExtensionsTests +{ + [Fact] + public async Task AddRelationalStructuredLogPersistence_WhenCalledTwice_DoesNotDuplicateRelationalRegistrations() + { + var services = new ServiceCollection(); + services.AddSingleton(); + services.AddSingleton(); + + services.AddRelationalStructuredLogPersistence(); + var diagnosticsCount = Count(services); + var storeCount = Count(services); + var writeBufferCount = Count(services); + + services.AddRelationalStructuredLogPersistence(); + + Assert.Equal(diagnosticsCount, Count(services)); + Assert.Equal(storeCount, Count(services)); + Assert.Equal(writeBufferCount, Count(services)); + + await using var serviceProvider = services.BuildServiceProvider(); + Assert.NotNull(serviceProvider.GetRequiredService()); + } + + private static int Count(IEnumerable services) => services.Count(x => x.ServiceType == typeof(T)); + + private class FakeConnectionFactory : IRelationalStructuredLogConnectionFactory + { + public ValueTask OpenConnectionAsync(CancellationToken cancellationToken = default) + { + throw new NotSupportedException(); + } + } + + private class FakeDialect : IRelationalStructuredLogDialect + { + public string ProviderName => "Fake"; + public string ParameterPrefix => "@"; + public string QuoteIdentifier(string identifier) => identifier; + public string ApplyLimit(string sql, int limit) => sql; + public string ApplyOffset(string sql, int offset) => sql; + } +}