public async Task failed_if_action_throws()
        {
            var name    = "test";
            var check1  = new HealthCheck(name, () => ThrowException());
            var result1 = await check1.ExecuteAsync(CancellationToken.None);

            result1.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check2 = new HealthCheck(
                name,
                () =>
            {
                ThrowException();
                return(Task.FromResult("string"));
            });
            var result2 = await check2.ExecuteAsync();

            result2.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check3 = new HealthCheck(
                name,
                () =>
            {
                ThrowException();
                return(AppMetricsTaskCache.CompletedHealthyTask);
            });
            var result3 = await check3.ExecuteAsync();

            result3.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);
        }
        public async Task failed_if_result_is_unhealthy()
        {
            var check  = new HealthCheck("test", () => Task.FromResult(HealthCheckResult.Unhealthy()));
            var result = await check.ExecuteAsync();

            result.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);
        }
Example #3
0
        public async Task Failed_if_action_throws()
        {
            var name    = "test";
            var check1  = new HealthCheck(name, () => ThrowException());
            var result1 = await check1.ExecuteAsync(CancellationToken.None);

            result1.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check2 = new HealthCheck(
                name,
                () =>
            {
                ThrowException();
                return(new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy("string")));
            });
            var result2 = await check2.ExecuteAsync();

            result2.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check3 = new HealthCheck(
                name,
                () =>
            {
                ThrowException();
                return(new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy()));
            });
            var result3 = await check3.ExecuteAsync();

            result3.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);
        }
        public async Task failed_and_does_not_throw_unhandled_exception_if_action_throws_exception_with_brackets_in_message()
        {
            var name = "test";

            var check1  = new HealthCheck(name, () => ThrowExceptionWithBracketsInMessage());
            var result1 = await check1.ExecuteAsync(CancellationToken.None);

            result1.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check2 = new HealthCheck(
                name,
                () =>
            {
                ThrowExceptionWithBracketsInMessage();
                return(Task.FromResult("string"));
            });
            var result2 = await check2.ExecuteAsync(CancellationToken.None);

            result2.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check3 = new HealthCheck(
                name,
                () =>
            {
                ThrowExceptionWithBracketsInMessage();
                return(AppMetricsTaskCache.CompletedHealthyTask);
            });
            var result3 = await check3.ExecuteAsync(CancellationToken.None);

            result3.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);
        }
Example #5
0
        public async Task Failed_and_does_not_throw_unhandled_exception_if_action_throws_exception_with_brackets_in_message()
        {
            var name = "test";

            var check1  = new HealthCheck(name, () => ThrowExceptionWithBracketsInMessage());
            var result1 = await check1.ExecuteAsync(CancellationToken.None);

            result1.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check2 = new HealthCheck(
                name,
                () =>
            {
                ThrowExceptionWithBracketsInMessage();
                return(new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy("string")));
            });
            var result2 = await check2.ExecuteAsync(CancellationToken.None);

            result2.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);

            var check3 = new HealthCheck(
                name,
                () =>
            {
                ThrowExceptionWithBracketsInMessage();
                return(new ValueTask <HealthCheckResult>(HealthCheckResult.Healthy()));
            });
            var result3 = await check3.ExecuteAsync(CancellationToken.None);

            result3.Check.Status.Should().Be(HealthCheckStatus.Unhealthy);
        }
Example #6
0
        public async Task Can_cache_results()
        {
            var cacheDuration = TimeSpan.FromMilliseconds(50);
            var check         = new HealthCheck("test", () => new ValueTask <HealthCheckResult>(HealthCheckResult.Unhealthy()), cacheDuration);
            var result        = await check.ExecuteAsync();

            result.IsFromCache.Should().BeFalse();

            result = await check.ExecuteAsync();

            result.IsFromCache.Should().BeTrue();

            await Task.Delay(cacheDuration);

            result = await check.ExecuteAsync();

            result.IsFromCache.Should().BeFalse();
        }
Example #7
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);
        }
Example #8
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);
        }
Example #9
0
        public void Cache_duration_when_specified_should_be_greater_than_zero()
        {
            var         cacheDuration = TimeSpan.Zero;
            Func <Task> sut           = async() =>
            {
                var check  = new HealthCheck("test", () => new ValueTask <HealthCheckResult>(HealthCheckResult.Unhealthy()), cacheDuration);
                var unused = await check.ExecuteAsync();
            };

            sut.Should().Throw <ArgumentException>();
        }
Example #10
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);
        }
        public async Task success_if_action_does_not_throw()
        {
            var name    = "test";
            var check1  = new HealthCheck(name, () => Task.FromResult(HealthCheckResult.Healthy()));
            var result1 = await check1.ExecuteAsync();

            result1.Check.Status.Should().Be(HealthCheckStatus.Healthy);

            var check2  = new HealthCheck(name, () => Task.FromResult("string"));
            var result2 = await check2.ExecuteAsync();

            result2.Check.Status.Should().Be(HealthCheckStatus.Healthy);

            var check3  = new HealthCheck(name, () => Task.FromResult(HealthCheckResult.Healthy()));
            var result3 = await check3.ExecuteAsync();

            result3.Check.Status.Should().Be(HealthCheckStatus.Healthy);
        }
        public async Task returns_result_with_correct_name()
        {
            var name    = "test";
            var check1  = new HealthCheck(name, () => Task.FromResult(HealthCheckResult.Healthy()));
            var result1 = await check1.ExecuteAsync();

            result1.Name.Should().Be(name);

            var check2  = new HealthCheck(name, () => Task.FromResult("string"));
            var result2 = await check2.ExecuteAsync();

            result2.Name.Should().Be(name);

            var check3  = new HealthCheck(name, () => Task.FromResult(HealthCheckResult.Healthy()));
            var result3 = await check3.ExecuteAsync();

            result3.Name.Should().Be(name);
        }
Example #13
0
        protected async override ValueTask <HealthCheckResult> CheckAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            if (healthCheck == null)
            {
                var addresses = server.Features.Get <IServerAddressesFeature>().Addresses;
                if (!addresses.Any())
                {
                    return(HealthCheckResult.Unhealthy());
                }
                healthCheck = AppMetricsHealth.CreateDefaultBuilder()
                              .HealthChecks.AddHttpGetCheck("local", new Uri(addresses
                                                                             .First()
                                                                             .Replace("[::]", "localhost")
                                                                             ), TimeSpan.FromSeconds(5), degradedOnError: true)
                              .Build()
                              .Checks.First();
            }

            return((await healthCheck.ExecuteAsync(cancellationToken)).Check);
        }
        public async Task returns_correct_message()
        {
            var message = "message";
            var check1  = new HealthCheck("test", () => Task.FromResult(HealthCheckResult.Unhealthy(message)));
            var result1 = await check1.ExecuteAsync();

            result1.Check.Message.Should().Be(message);

            var check2  = new HealthCheck("test", () => Task.FromResult(HealthCheckResult.Healthy(message)));
            var result2 = await check2.ExecuteAsync();

            result2.Check.Message.Should().Be(message);

            var check3  = new HealthCheck("test", () => Task.FromResult(message));
            var result3 = await check3.ExecuteAsync();

            result3.Check.Message.Should().Be(message);

            var check4  = new HealthCheck("test", () => Task.FromResult(HealthCheckResult.Degraded(message)));
            var result4 = await check4.ExecuteAsync();

            result4.Check.Message.Should().Be(message);
        }