public static IHealthBuilder AddSqlCheck( this IHealthCheckBuilder healthCheckBuilder, string name, string connectionString, TimeSpan timeout, HealthCheck.QuiteTime quiteTime, bool degradedOnError = false) { return(healthCheckBuilder.AddSqlQuiteTimeCheck(name, () => new SqlConnection(connectionString), timeout, quiteTime, degradedOnError)); }
public async Task When_outside_quite_time_health_check_should_not_be_ignored() { var oneHourAgo = DateTime.UtcNow.Add(TimeSpan.FromHours(-1)); var halfAnHourAgo = DateTime.UtcNow.Add(TimeSpan.FromMinutes(-30)); var quiteTime = new HealthCheck.QuiteTime(oneHourAgo.TimeOfDay, halfAnHourAgo.TimeOfDay, shouldCheck: false); var check = new HealthCheck("test", () => new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy()), quiteTime); var result = await check.ExecuteAsync(); result.Check.Status.Should().Be(HealthCheckStatus.Healthy); }
public async Task During_quite_time_health_check_should_be_ignored() { var oneHourAgo = DateTime.UtcNow.Add(TimeSpan.FromHours(-1)); var oneHourFromNow = DateTime.UtcNow.Add(TimeSpan.FromHours(1)); var quiteTime = new HealthCheck.QuiteTime(oneHourAgo.TimeOfDay, oneHourFromNow.TimeOfDay, shouldCheck: false); var check = new HealthCheck("test", () => new ValueTask <HealthCheckResult>(HealthCheckResult.Unhealthy()), quiteTime); var result = await check.ExecuteAsync(); result.Check.Status.Should().Be(HealthCheckStatus.Ignored); }
public async Task During_quite_time_health_check_when_day_not_excluded_should_ignore_check() { var oneHourAgo = DateTime.UtcNow.Add(TimeSpan.FromHours(-1)); var oneHourFromNow = DateTime.UtcNow.Add(TimeSpan.FromHours(1)); var today = DateTime.UtcNow.AddDays(-1).DayOfWeek; var quiteTime = new HealthCheck.QuiteTime(oneHourAgo.TimeOfDay, oneHourFromNow.TimeOfDay, shouldCheck: false, excludeDays: new[] { today }); var check = new HealthCheck("test", () => new ValueTask <HealthCheckResult>(HealthCheckResult.Unhealthy()), quiteTime); var result = await check.ExecuteAsync(); result.Check.Status.Should().Be(HealthCheckStatus.Ignored); }
public static IHealthBuilder AddSqlQuiteTimeCheck( this IHealthCheckBuilder healthCheckBuilder, string name, Func <IDbConnection> newDbConnection, TimeSpan timeout, HealthCheck.QuiteTime quiteTime, bool degradedOnError = false) { EnsureValidTimeout(timeout); healthCheckBuilder.AddQuiteTimeCheck( name, cancellationToken => ExecuteSqlCheckAsync(name, newDbConnection, timeout, degradedOnError, cancellationToken), quiteTime); return(healthCheckBuilder.Builder); }
private static void Init() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); Configuration = builder.Build(); Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.LiterateConsole() .WriteTo.Seq("http://localhost:5341") .CreateLogger(); var oneHourAgo = DateTime.UtcNow.AddHours(-1); var oneHourFromNow = DateTime.UtcNow.AddHours(1); var quiteAt = new HealthCheck.QuiteTime(oneHourAgo.TimeOfDay, oneHourFromNow.TimeOfDay, false, new[] { DayOfWeek.Monday }); var healthOptionsDictionary = Configuration.GetSection(nameof(HealthOptions)).GetChildren().ToDictionary(x => $"{nameof(HealthOptions)}:{x.Key}", x => x.Value); Metrics = AppMetrics.CreateDefaultBuilder().Build(); Health = AppMetricsHealth.CreateDefaultBuilder() .Configuration.Configure(healthOptionsDictionary) .Report.ToSlack( options => { options.Channel = SlackChannel; options.WebhookUrl = SlackWebhookUrl; options.ReportInterval = TimeSpan.FromSeconds(30); }) .Report.ToMetrics(Metrics) .HealthChecks.AddCheck(new SampleHealthCheck()) .HealthChecks.AddCheck(new SampleCachedHealthCheck()) .HealthChecks.AddCheck(new SampleQuiteTimeHealthCheck()) .HealthChecks.AddProcessPrivateMemorySizeCheck("Private Memory Size", 200) .HealthChecks.AddProcessVirtualMemorySizeCheck("Virtual Memory Size", 200) .HealthChecks.AddProcessPhysicalMemoryCheck("Working Set", 200) .HealthChecks.AddPingCheck("google ping", "google.com", TimeSpan.FromSeconds(10)) .HealthChecks.AddPingCheck("google ping cached", "google.com", TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(1)) .HealthChecks.AddHttpGetCheck( "invalid http cached", new Uri("https://invalid-asdfadsf-cached.com/"), 3, TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1), TimeSpan.FromMinutes(1)) .HealthChecks.AddHttpGetCheck( "invalid http", new Uri("https://invalid-asdfadsf.com/"), 3, TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)) .HealthChecks.AddHttpGetCheck( "github", new Uri("https://github.com/"), retries: 3, delayBetweenRetries: TimeSpan.FromMilliseconds(100), timeoutPerRequest: TimeSpan.FromSeconds(5)) .HealthChecks.AddHttpGetCheck("google", new Uri("https://google.com/"), TimeSpan.FromSeconds(1)) .HealthChecks.AddCheck( "DatabaseConnected", () => new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy("Database Connection OK"))) .HealthChecks.AddCachedCheck( "DiskSpace Cached", () => { var freeDiskSpace = GetFreeDiskSpace(); return(new ValueTask <HealthCheckResult>( freeDiskSpace <= 512 ? HealthCheckResult.Unhealthy("Not enough disk space: {0}", freeDiskSpace) : HealthCheckResult.Unhealthy("Disk space ok: {0}", freeDiskSpace))); }, cacheDuration: TimeSpan.FromMinutes(1)) .HealthChecks.AddQuiteTimeCheck( "DiskSpace Quite Time", () => { var freeDiskSpace = GetFreeDiskSpace(); return(new ValueTask <HealthCheckResult>( freeDiskSpace <= 512 ? HealthCheckResult.Unhealthy("Not enough disk space: {0}", freeDiskSpace) : HealthCheckResult.Unhealthy("Disk space ok: {0}", freeDiskSpace))); }, quiteTime: quiteAt) .HealthChecks.AddSqlCheck("DB Connection", () => new SqliteConnection(ConnectionString), TimeSpan.FromSeconds(10)) .HealthChecks.AddSqlCachedCheck("DB Connection Cached", () => new SqliteConnection(ConnectionString), TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(1)) .Report.Using <SampleHealthStatusReporter>() .Build(); int GetFreeDiskSpace() { return(1024); } }