diff --git a/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs b/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs index 4c95823..cef6476 100644 --- a/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs +++ b/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs @@ -65,5 +65,36 @@ public static HealthCheckBuilder AddMaxValueCheck(this HealthCheckBuilder bui return builder; } + + public static HealthCheckBuilder AddRangeValueCheck(this HealthCheckBuilder builder, string name, (T minValue, T maxValue) range, Func currentValueFunc) where T : IComparable + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddRangeValueCheck(builder, name, range, currentValueFunc, builder.DefaultCacheDuration); + } + + public static HealthCheckBuilder AddRangeValueCheck(this HealthCheckBuilder builder, string name, (T minValue,T maxValue) range, Func currentValueFunc, TimeSpan cacheDuration) + where T : IComparable + { + Guard.ArgumentNotNull(nameof(builder), builder); + Guard.ArgumentNotNullOrEmpty(nameof(name), name); + Guard.ArgumentNotNull(nameof(currentValueFunc), currentValueFunc); + + builder.AddCheck(name, () => + { + var currentValue = currentValueFunc(); + var status = currentValue.CompareTo(range.maxValue) <= 0 && currentValue.CompareTo(range.minValue) >= 0 ? CheckStatus.Healthy : CheckStatus.Unhealthy; + return HealthCheckResult.FromStatus( + status, + $"min={range.minValue},max={range.maxValue}, current={currentValue}", + new Dictionary { { "max", range.maxValue }, { "min", range.minValue }, { "current", currentValue } } + ); + }, cacheDuration); + + + return builder; + } + + } } diff --git a/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj b/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj index 75eef99..e9f5884 100644 --- a/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj +++ b/src/Microsoft.Extensions.HealthChecks/Microsoft.Extensions.HealthChecks.csproj @@ -2,6 +2,7 @@ netstandard1.3 + 7.2 @@ -15,6 +16,7 @@ + diff --git a/test/Microsoft.Extensions.HealthChecks.Test/Checks/NumericChecksTest.cs b/test/Microsoft.Extensions.HealthChecks.Test/Checks/NumericChecksTest.cs index fe4dddd..d575a43 100644 --- a/test/Microsoft.Extensions.HealthChecks.Test/Checks/NumericChecksTest.cs +++ b/test/Microsoft.Extensions.HealthChecks.Test/Checks/NumericChecksTest.cs @@ -88,5 +88,51 @@ public async void RegistersCheck(int monitoredValue, CheckStatus expectedStatus) ); } } + + public class AddRangeValueCheck : NumericChecksTest + { + [Fact] + public void GuardClauses() + { + Assert.Throws("builder", () => HealthCheckBuilderExtensions.AddRangeValueCheck(null, "name",(0,40), () => 2112)); + Assert.Throws("name", () => HealthCheckBuilderExtensions.AddRangeValueCheck(_builder, null, (0, 40), () => 2112)); + Assert.Throws("name", () => HealthCheckBuilderExtensions.AddRangeValueCheck(_builder, "", (0, 40), () => 2112)); + Assert.Throws("currentValueFunc", () => HealthCheckBuilderExtensions.AddRangeValueCheck(_builder, "name", (0, 40), null)); + } + + [Theory] + [InlineData(11, CheckStatus.Unhealthy)] + [InlineData(6, CheckStatus.Healthy)] + public async void RegistersCheck(int monitoredValue, CheckStatus expectedStatus) + { + var minValue = 5; + var maxValue = 10; + + _builder.AddRangeValueCheck("CheckName", (minValue: minValue,maxValue:maxValue), () => monitoredValue); + + var check = _builder.ChecksByName["CheckName"]; + + var result = await check.RunAsync(_serviceProvider); + Assert.Equal(expectedStatus, result.CheckStatus); + Assert.Equal($"min={minValue},max={maxValue}, current={monitoredValue}", result.Description); + Assert.Collection(result.Data.OrderBy(kvp => kvp.Key), + kvp => + { + Assert.Equal("current", kvp.Key); + Assert.Equal(monitoredValue, kvp.Value); + }, + kvp => + { + Assert.Equal("max", kvp.Key); + Assert.Equal(maxValue, kvp.Value); + }, + kvp => + { + Assert.Equal("min", kvp.Key); + Assert.Equal(minValue, kvp.Value); + } + ); + } + } } } diff --git a/test/Microsoft.Extensions.HealthChecks.Test/Microsoft.Extensions.HealthChecks.Test.csproj b/test/Microsoft.Extensions.HealthChecks.Test/Microsoft.Extensions.HealthChecks.Test.csproj index b15a756..ecddcb8 100644 --- a/test/Microsoft.Extensions.HealthChecks.Test/Microsoft.Extensions.HealthChecks.Test.csproj +++ b/test/Microsoft.Extensions.HealthChecks.Test/Microsoft.Extensions.HealthChecks.Test.csproj @@ -5,6 +5,10 @@ Microsoft.Extensions.HealthChecks + + + +