diff --git a/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs b/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs index 8adcafb8f..a440a2cda 100644 --- a/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs +++ b/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs @@ -18,7 +18,7 @@ public static class HealthCheckExtensions /// /// Tag applied to Elsa readiness checks. /// - public const string ReadinessTag = "readiness"; + public const string ReadinessTag = "elsa-readiness"; private static readonly string[] ReadinessTags = [ElsaTag, ReadinessTag]; diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs index 115456c40..fdbaf77ed 100644 --- a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs +++ b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs @@ -31,7 +31,7 @@ public class ElsaDistributedLockHealthCheckTests Assert.Equal(HealthStatus.Healthy, result.Status); Assert.Equal("distributed-locks", result.Data["category"]); - _distributedLockProvider.Received(1).CreateLock(Arg.Is(x => x.StartsWith("elsa-health-check-", StringComparison.Ordinal))); + _distributedLockProvider.Received(1).CreateLock(Arg.Is(x => IsProbeLockName(x))); await _distributedLock.Received(1).TryAcquireAsync(ExpectedLockAcquisitionTimeout, Arg.Any()); } @@ -52,6 +52,7 @@ public class ElsaDistributedLockHealthCheckTests Assert.Equal(2, lockNames.Count); Assert.All(lockNames, x => Assert.DoesNotContain(Environment.MachineName, x, StringComparison.OrdinalIgnoreCase)); Assert.NotEqual(lockNames[0], lockNames[1]); + Assert.All(lockNames, x => Assert.True(IsProbeLockName(x))); } [Fact] @@ -102,4 +103,11 @@ public class ElsaDistributedLockHealthCheckTests { DistributedLockAcquisitionTimeout = ExpectedLockAcquisitionTimeout }); + + private static bool IsProbeLockName(string lockName) + { + const string prefix = "elsa-health-check-"; + return lockName.StartsWith(prefix, StringComparison.Ordinal) + && Guid.TryParseExact(lockName[prefix.Length..], "N", out _); + } } diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/HealthCheckExtensionsTests.cs b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/HealthCheckExtensionsTests.cs index 5bb78efc4..9033fb664 100644 --- a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/HealthCheckExtensionsTests.cs +++ b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/HealthCheckExtensionsTests.cs @@ -1,6 +1,7 @@ using Elsa.Extensions; using Elsa.Workflows.Runtime.Options; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Options; namespace Elsa.Workflows.Runtime.UnitTests.HealthChecks; @@ -20,4 +21,22 @@ public class HealthCheckExtensionsTests Assert.NotNull(serviceProvider.GetRequiredService>()); } + + [Fact] + public void AddElsaReadinessChecksUsesElsaSpecificReadinessTag() + { + var services = new ServiceCollection(); + + services + .AddHealthChecks() + .AddElsaReadinessChecks(includePersistence: false); + + using var serviceProvider = services.BuildServiceProvider(); + var registrations = serviceProvider.GetRequiredService>().Value.Registrations; + + var registration = Assert.Single(registrations); + Assert.Contains("elsa", registration.Tags); + Assert.Contains(HealthCheckExtensions.ReadinessTag, registration.Tags); + Assert.DoesNotContain("readiness", registration.Tags); + } }