Ejemplo n.º 1
0
 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));
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
            }
        }