diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/HealthCheckBuilderSqlServerExtensions.cs b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/HealthCheckBuilderSqlServerExtensions.cs index 4998c91ed..1837d9638 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/HealthCheckBuilderSqlServerExtensions.cs +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks.SqlServer/HealthCheckBuilderSqlServerExtensions.cs @@ -7,9 +7,18 @@ using System.Data.SqlClient; namespace Microsoft.Extensions.HealthChecks { + // REVIEW: What are the appropriate guards for these functions? + public static class HealthCheckBuilderSqlServerExtensions { public static HealthCheckBuilder AddSqlCheck(this HealthCheckBuilder builder, string name, string connectionString) + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddSqlCheck(builder, name, connectionString, builder.DefaultCacheDuration); + } + + public static HealthCheckBuilder AddSqlCheck(this HealthCheckBuilder builder, string name, string connectionString, TimeSpan cacheDuration) { builder.AddCheck($"SqlCheck({name})", async () => { @@ -37,7 +46,7 @@ namespace Microsoft.Extensions.HealthChecks { return HealthCheckResult.Unhealthy($"SqlCheck({name}): Exception during check: {ex.GetType().FullName}"); } - }); + }, cacheDuration); return builder; } diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs index f3c795629..4c958234e 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/NumericChecks.cs @@ -10,7 +10,14 @@ namespace Microsoft.Extensions.HealthChecks { // Numeric checks - public static HealthCheckBuilder AddMinValueCheck(this HealthCheckBuilder builder, string name, T minValue, Func currentValueFunc) + public static HealthCheckBuilder AddMinValueCheck(this HealthCheckBuilder builder, string name, T minValue, Func currentValueFunc) where T : IComparable + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddMinValueCheck(builder, name, minValue, currentValueFunc, builder.DefaultCacheDuration); + } + + public static HealthCheckBuilder AddMinValueCheck(this HealthCheckBuilder builder, string name, T minValue, Func currentValueFunc, TimeSpan cacheDuration) where T : IComparable { Guard.ArgumentNotNull(nameof(builder), builder); @@ -26,12 +33,19 @@ namespace Microsoft.Extensions.HealthChecks $"min={minValue}, current={currentValue}", new Dictionary { { "min", minValue }, { "current", currentValue } } ); - }); + }, cacheDuration); return builder; } - public static HealthCheckBuilder AddMaxValueCheck(this HealthCheckBuilder builder, string name, T maxValue, Func currentValueFunc) + public static HealthCheckBuilder AddMaxValueCheck(this HealthCheckBuilder builder, string name, T maxValue, Func currentValueFunc) where T : IComparable + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddMaxValueCheck(builder, name, maxValue, currentValueFunc, builder.DefaultCacheDuration); + } + + public static HealthCheckBuilder AddMaxValueCheck(this HealthCheckBuilder builder, string name, T maxValue, Func currentValueFunc, TimeSpan cacheDuration) where T : IComparable { Guard.ArgumentNotNull(nameof(builder), builder); @@ -47,7 +61,7 @@ namespace Microsoft.Extensions.HealthChecks $"max={maxValue}, current={currentValue}", new Dictionary { { "max", maxValue }, { "current", currentValue } } ); - }); + }, cacheDuration); return builder; } diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/SystemChecks.cs b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/SystemChecks.cs index d4491fda4..dbd9feff2 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/SystemChecks.cs +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/SystemChecks.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Diagnostics; namespace Microsoft.Extensions.HealthChecks @@ -12,10 +13,19 @@ namespace Microsoft.Extensions.HealthChecks public static HealthCheckBuilder AddPrivateMemorySizeCheck(this HealthCheckBuilder builder, long maxSize) => AddMaxValueCheck(builder, $"PrivateMemorySize({maxSize})", maxSize, () => Process.GetCurrentProcess().PrivateMemorySize64); + public static HealthCheckBuilder AddPrivateMemorySizeCheck(this HealthCheckBuilder builder, long maxSize, TimeSpan cacheDuration) + => AddMaxValueCheck(builder, $"PrivateMemorySize({maxSize})", maxSize, () => Process.GetCurrentProcess().PrivateMemorySize64, cacheDuration); + public static HealthCheckBuilder AddVirtualMemorySizeCheck(this HealthCheckBuilder builder, long maxSize) => AddMaxValueCheck(builder, $"VirtualMemorySize({maxSize})", maxSize, () => Process.GetCurrentProcess().VirtualMemorySize64); + public static HealthCheckBuilder AddVirtualMemorySizeCheck(this HealthCheckBuilder builder, long maxSize, TimeSpan cacheDuration) + => AddMaxValueCheck(builder, $"VirtualMemorySize({maxSize})", maxSize, () => Process.GetCurrentProcess().VirtualMemorySize64, cacheDuration); + public static HealthCheckBuilder AddWorkingSetCheck(this HealthCheckBuilder builder, long maxSize) => AddMaxValueCheck(builder, $"WorkingSet({maxSize})", maxSize, () => Process.GetCurrentProcess().WorkingSet64); + + public static HealthCheckBuilder AddWorkingSetCheck(this HealthCheckBuilder builder, long maxSize, TimeSpan cacheDuration) + => AddMaxValueCheck(builder, $"WorkingSet({maxSize})", maxSize, () => Process.GetCurrentProcess().WorkingSet64, cacheDuration); } } diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/UrlChecks.cs b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/UrlChecks.cs index d7df58def..2a6cfe908 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/UrlChecks.cs +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/Checks/UrlChecks.cs @@ -10,36 +10,73 @@ namespace Microsoft.Extensions.HealthChecks { public static partial class HealthCheckBuilderExtensions { - // URL checks + // Default URL check public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url) - => AddUrlCheck(builder, url, response => UrlChecker.DefaultUrlCheck(response)); + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddUrlCheck(builder, url, builder.DefaultCacheDuration); + } + + public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, TimeSpan cacheDuration) + => AddUrlCheck(builder, url, response => UrlChecker.DefaultUrlCheck(response), cacheDuration); + + // Func returning IHealthCheckResult + + public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, Func checkFunc) + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddUrlCheck(builder, url, checkFunc, builder.DefaultCacheDuration); + } public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, - Func checkFunc) + Func checkFunc, + TimeSpan cacheDuration) { Guard.ArgumentNotNull(nameof(checkFunc), checkFunc); - return AddUrlCheck(builder, url, response => new ValueTask(checkFunc(response))); + return AddUrlCheck(builder, url, response => new ValueTask(checkFunc(response)), cacheDuration); + } + + // Func returning Task + + public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, Func> checkFunc) + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddUrlCheck(builder, url, checkFunc, builder.DefaultCacheDuration); } public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, - Func> checkFunc) + Func> checkFunc, + TimeSpan cacheDuration) { Guard.ArgumentNotNull(nameof(checkFunc), checkFunc); - return AddUrlCheck(builder, url, response => new ValueTask(checkFunc(response))); + return AddUrlCheck(builder, url, response => new ValueTask(checkFunc(response)), cacheDuration); + } + + // Func returning ValueTask + + public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, Func> checkFunc) + { + Guard.ArgumentNotNull(nameof(builder), builder); + + return AddUrlCheck(builder, url, checkFunc, builder.DefaultCacheDuration); } public static HealthCheckBuilder AddUrlCheck(this HealthCheckBuilder builder, string url, - Func> checkFunc) + Func> checkFunc, + TimeSpan cacheDuration) { Guard.ArgumentNotNull(nameof(builder), builder); Guard.ArgumentNotNullOrEmpty(nameof(url), url); Guard.ArgumentNotNull(nameof(checkFunc), checkFunc); var urlCheck = new UrlChecker(checkFunc, url); - builder.AddCheck($"UrlCheck({url})", () => urlCheck.CheckAsync()); + builder.AddCheck($"UrlCheck({url})", () => urlCheck.CheckAsync(), cacheDuration); return builder; } } diff --git a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/HealthCheckBuilder.cs b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/HealthCheckBuilder.cs index 4e1c6e4c9..006e4a6ef 100644 --- a/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/HealthCheckBuilder.cs +++ b/src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks/HealthCheckBuilder.cs @@ -21,7 +21,7 @@ namespace Microsoft.Extensions.HealthChecks [string.Empty] = _currentGroup }; - DefaultCacheDuration = TimeSpan.FromMinutes(1); + DefaultCacheDuration = TimeSpan.FromMinutes(5); } ///