diff --git a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs index 87461ce3c0..dd2961f106 100644 --- a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs +++ b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs @@ -121,7 +121,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks { var duration = stopwatch.GetElapsedTime(); entry = new HealthReportEntry( - status: HealthStatus.Unhealthy, + status: registration.FailureStatus, description: "A timeout occurred while running check.", duration: duration, exception: ex, @@ -136,7 +136,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks { var duration = stopwatch.GetElapsedTime(); entry = new HealthReportEntry( - status: HealthStatus.Unhealthy, + status: registration.FailureStatus, description: ex.Message, duration: duration, exception: ex, diff --git a/src/HealthChecks/HealthChecks/test/DefaultHealthCheckServiceTest.cs b/src/HealthChecks/HealthChecks/test/DefaultHealthCheckServiceTest.cs index ad566909c7..e67614cd95 100644 --- a/src/HealthChecks/HealthChecks/test/DefaultHealthCheckServiceTest.cs +++ b/src/HealthChecks/HealthChecks/test/DefaultHealthCheckServiceTest.cs @@ -530,6 +530,40 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks // Assert Assert.False(hangs); } + + [Fact] + public async Task CheckHealthAsync_WithFailureStatus() + { + // Arrange + var service = CreateHealthChecksService(b => + { + b.AddCheck("degraded", HealthStatus.Degraded); + b.AddCheck("healthy", HealthStatus.Healthy); + b.AddCheck("unhealthy", HealthStatus.Unhealthy); + }); + + // Act + var results = await service.CheckHealthAsync(); + + // Assert + Assert.Collection( + results.Entries, + actual => + { + Assert.Equal("degraded", actual.Key); + Assert.Equal(HealthStatus.Degraded, actual.Value.Status); + }, + actual => + { + Assert.Equal("healthy", actual.Key); + Assert.Equal(HealthStatus.Healthy, actual.Value.Status); + }, + actual => + { + Assert.Equal("unhealthy", actual.Key); + Assert.Equal(HealthStatus.Unhealthy, actual.Value.Status); + }); + } private static DefaultHealthCheckService CreateHealthChecksService(Action configure) { @@ -571,5 +605,13 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks return Task.FromResult(HealthCheckResult.Healthy(data: data)); } } + + private class FailCapturingCheck : IHealthCheck + { + public Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) + { + throw new Exception("check failed"); + } + } } }