From 8c1618b5d47c2e6d297e3d25db51c5395c41d3ea Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 20 May 2026 23:39:21 +0000
Subject: [PATCH] Address latest health check review feedback
Agent-Logs-Url: https://github.com/elsa-workflows/elsa-core/sessions/6a652ca4-f0c8-4284-938d-6de0eb7a2bea
Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
---
doc/wiki/health-checks.md | 2 +-
src/apps/Elsa.Server.Web/Program.cs | 9 ++-------
.../Extensions/HealthCheckExtensions.cs | 7 ++++++-
.../ElsaDistributedLockHealthCheck.cs | 2 +-
.../ElsaWorkflowPersistenceHealthCheck.cs | 20 +++++++++++++++----
.../ElsaDistributedLockHealthCheckTests.cs | 1 +
6 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/doc/wiki/health-checks.md b/doc/wiki/health-checks.md
index e8d9f5fca..db2a68d88 100644
--- a/doc/wiki/health-checks.md
+++ b/doc/wiki/health-checks.md
@@ -40,7 +40,7 @@ app.MapHealthChecks("/health/live", new()
app.MapHealthChecks("/health/ready", new()
{
- Predicate = check => check.Tags.Contains(HealthCheckExtensions.ReadinessTag),
+ Predicate = check => check.Tags.Contains(HealthCheckExtensions.ElsaTag) && check.Tags.Contains(HealthCheckExtensions.ReadinessTag),
ResultStatusCodes =
{
[HealthStatus.Degraded] = StatusCodes.Status503ServiceUnavailable,
diff --git a/src/apps/Elsa.Server.Web/Program.cs b/src/apps/Elsa.Server.Web/Program.cs
index 0623e9103..e61770819 100644
--- a/src/apps/Elsa.Server.Web/Program.cs
+++ b/src/apps/Elsa.Server.Web/Program.cs
@@ -177,7 +177,7 @@ app.MapHealthChecks("/health/live", new()
});
app.MapHealthChecks("/health/ready", new()
{
- Predicate = check => check.Tags.Contains(HealthCheckExtensions.ReadinessTag),
+ Predicate = check => check.Tags.Contains(HealthCheckExtensions.ElsaTag) && check.Tags.Contains(HealthCheckExtensions.ReadinessTag),
ResultStatusCodes =
{
[HealthStatus.Degraded] = StatusCodes.Status503ServiceUnavailable,
@@ -186,12 +186,7 @@ app.MapHealthChecks("/health/ready", new()
});
app.MapHealthChecks("/", new()
{
- Predicate = _ => false,
- ResultStatusCodes =
- {
- [HealthStatus.Degraded] = StatusCodes.Status503ServiceUnavailable,
- [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
- }
+ Predicate = _ => false
});
// Routing used for SignalR.
diff --git a/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs b/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs
index 8d636d417..8adcafb8f 100644
--- a/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs
+++ b/src/modules/Elsa.Workflows.Runtime/Extensions/HealthCheckExtensions.cs
@@ -10,12 +10,17 @@ namespace Elsa.Extensions;
///
public static class HealthCheckExtensions
{
+ ///
+ /// Tag applied to Elsa health checks.
+ ///
+ public const string ElsaTag = "elsa";
+
///
/// Tag applied to Elsa readiness checks.
///
public const string ReadinessTag = "readiness";
- private static readonly string[] ReadinessTags = ["elsa", ReadinessTag];
+ private static readonly string[] ReadinessTags = [ElsaTag, ReadinessTag];
///
/// Adds conservative Elsa-specific readiness probes for the workflow runtime and its core stores.
diff --git a/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs b/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs
index 3d1a4b1a2..5d5b32655 100644
--- a/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs
+++ b/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs
@@ -30,7 +30,7 @@ public class ElsaDistributedLockHealthCheck(
});
}
- var lockName = $"elsa-health-check-{Environment.MachineName}-{Guid.NewGuid():N}";
+ var lockName = $"elsa-health-check-{Guid.NewGuid():N}";
await using var handle = await distributedLockProvider.TryAcquireLockAsync(lockName, options.Value.DistributedLockAcquisitionTimeout, cancellationToken);
if (handle == null)
{
diff --git a/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaWorkflowPersistenceHealthCheck.cs b/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaWorkflowPersistenceHealthCheck.cs
index 3c6dca7fb..529f54547 100644
--- a/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaWorkflowPersistenceHealthCheck.cs
+++ b/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaWorkflowPersistenceHealthCheck.cs
@@ -20,10 +20,22 @@ public class ElsaWorkflowPersistenceHealthCheck(IServiceProvider serviceProvider
{
var probeResults = new List
{
- await ProbeAsync("workflow-definitions", serviceProvider.GetService(), async (store, ct) => await store.FindAsync(new WorkflowDefinitionFilter { Id = ProbeId }, ct)),
- await ProbeAsync("workflow-instances", serviceProvider.GetService(), async (store, ct) => await store.CountAsync(new WorkflowInstanceFilter { Id = ProbeId }, ct)),
- await ProbeAsync("triggers", serviceProvider.GetService(), async (store, ct) => await store.FindAsync(new TriggerFilter { Id = ProbeId }, ct)),
- await ProbeAsync("bookmark-queue", serviceProvider.GetService(), async (store, ct) => await store.FindAsync(new BookmarkQueueFilter { Id = ProbeId }, ct))
+ await ProbeAsync("workflow-definitions", serviceProvider.GetService(), async (store, ct) =>
+ {
+ await store.FindAsync(new WorkflowDefinitionFilter { Id = ProbeId }, ct);
+ }),
+ await ProbeAsync("workflow-instances", serviceProvider.GetService(), async (store, ct) =>
+ {
+ await store.CountAsync(new WorkflowInstanceFilter { Id = ProbeId }, ct);
+ }),
+ await ProbeAsync("triggers", serviceProvider.GetService(), async (store, ct) =>
+ {
+ await store.FindAsync(new TriggerFilter { Id = ProbeId }, ct);
+ }),
+ await ProbeAsync("bookmark-queue", serviceProvider.GetService(), async (store, ct) =>
+ {
+ await store.FindAsync(new BookmarkQueueFilter { Id = ProbeId }, ct);
+ })
};
var attemptedProbes = probeResults.Where(x => !x.Skipped).Select(x => x.StoreName).ToList();
diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs
index ee7400b6a..d4e8e888a 100644
--- a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs
+++ b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs
@@ -50,6 +50,7 @@ public class ElsaDistributedLockHealthCheckTests
await sut.CheckHealthAsync(new HealthCheckContext());
Assert.Equal(2, lockNames.Count);
+ Assert.All(lockNames, x => Assert.DoesNotContain(Environment.MachineName, x, StringComparison.Ordinal));
Assert.NotEqual(lockNames[0], lockNames[1]);
}