예제 #1
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var serverAddress = _server.Features.Get <IServerAddressesFeature>();
                var localServer   = serverAddress.Addresses.First();

                var result = await _client.GetAsync(localServer + $"/home/fakestatus/?statusCode={_statusCode}");

                if (result.StatusCode == HttpStatusCode.OK)
                {
                    return(HealthCheckResult.Passed("Everything is OK"));
                }
                else if (result.StatusCode == HttpStatusCode.BadRequest)
                {
                    context.Registration.FailureStatus = HealthStatus.Degraded;
                    return(HealthCheckResult.Failed($"Degraded: Http Status returns {result.StatusCode}"));
                }
                else
                {
                    return(HealthCheckResult.Failed($"Fails: Http Status returns {result.StatusCode}"));
                }
            }
            catch (Exception ex)
            {
                return(HealthCheckResult.Failed($"Exception {ex.Message} : {ex.StackTrace}"));
            }
        }
예제 #2
0
        public async Task NoResponseWriterReturnsEmptyBody()
        {
            var builder = new WebHostBuilder()
                          .Configure(app =>
            {
                app.UseHealthChecks("/health", new HealthCheckOptions()
                {
                    ResponseWriter = null,
                });
            })
                          .ConfigureServices(services =>
            {
                services.AddHealthChecks()
                .AddAsyncCheck("Foo", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")))
                .AddAsyncCheck("Bar", () => Task.FromResult(HealthCheckResult.Failed("Pretty bad.")))
                .AddAsyncCheck("Baz", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")));
            });
            var server = new TestServer(builder);
            var client = server.CreateClient();

            var response = await client.GetAsync("/health");

            Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode);
            Assert.Equal(string.Empty, await response.Content.ReadAsStringAsync());
        }
예제 #3
0
        public async Task CanFilterChecks()
        {
            var builder = new WebHostBuilder()
                          .Configure(app =>
            {
                app.UseHealthChecks("/health", new HealthCheckOptions()
                {
                    Predicate = (check) => check.Name == "Foo" || check.Name == "Baz",
                });
            })
                          .ConfigureServices(services =>
            {
                services.AddHealthChecks()
                .AddAsyncCheck("Foo", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")))
                // Will get filtered out
                .AddAsyncCheck("Bar", () => Task.FromResult(HealthCheckResult.Failed("A-ok!")))
                .AddAsyncCheck("Baz", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")));
            });
            var server = new TestServer(builder);
            var client = server.CreateClient();

            var response = await client.GetAsync("/health");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal("text/plain", response.Content.Headers.ContentType.ToString());
            Assert.Equal("Healthy", await response.Content.ReadAsStringAsync());
        }
예제 #4
0
        public Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (_task.IsCompleted)
            {
                return(Task.FromResult(HealthCheckResult.Passed("Dependency is ready")));
            }

            return(Task.FromResult(HealthCheckResult.Failed("Dependency is still initializing")));
        }
예제 #5
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            using (var connection = new SqlConnection(_connectionString))
            {
                try
                {
                    await connection.OpenAsync(cancellationToken);
                }
                catch (SqlException)
                {
                    return(HealthCheckResult.Failed());
                }
            }

            return(HealthCheckResult.Passed());
        }
        protected override async Task <HealthCheckResult> ExecuteHealthCheckAsync(HealthCheckContext context, QueueHealthCheckOptions options, IServiceBusNamespace client, CancellationToken cancellationToken)
        {
            try
            {
                var queue = await client.Queues.GetByNameAsync(options.QueueName, cancellationToken);

                IReadOnlyDictionary <string, object> errors = _queueRules.SelectMany(x => x.ValidateResource(queue, options)).ToDictionary(x => x.Key, x => (object)x.Error);

                if (errors.Count > 0)
                {
                    return(HealthCheckResult.Failed($"Resource '{options.QueueName}' was found but failed to validate. See the data properties for the list of errors.", data: errors));
                }

                return(HealthCheckResult.Passed($"Resource '{options.QueueName}' was found and validated successfully"));
            }
            catch (Exception ex)
            {
                // TODO :: exception handling
                return(HealthCheckResult.Failed(ex.Message, ex));
            }
        }
예제 #7
0
        public async Task CanUseCustomWriter()
        {
            var expectedJson = JsonConvert.SerializeObject(new
            {
                status = "Unhealthy",
            });

            var builder = new WebHostBuilder()
                          .Configure(app =>
            {
                app.UseHealthChecks("/health", new HealthCheckOptions()
                {
                    ResponseWriter = (c, r) =>
                    {
                        var json = JsonConvert.SerializeObject(new { status = r.Status.ToString(), });
                        c.Response.ContentType = "application/json";
                        return(c.Response.WriteAsync(json));
                    },
                });
            })
                          .ConfigureServices(services =>
            {
                services.AddHealthChecks()
                .AddAsyncCheck("Foo", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")))
                .AddAsyncCheck("Bar", () => Task.FromResult(HealthCheckResult.Failed("Pretty bad.")))
                .AddAsyncCheck("Baz", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")));
            });
            var server = new TestServer(builder);
            var client = server.CreateClient();

            var response = await client.GetAsync("/health");

            Assert.Equal("application/json", response.Content.Headers.ContentType.ToString());

            var result = await response.Content.ReadAsStringAsync();

            Assert.Equal(expectedJson, result);
        }
예제 #8
0
        public async Task StatusCodeIs503IfCheckIsUnhealthy()
        {
            var builder = new WebHostBuilder()
                          .Configure(app =>
            {
                app.UseHealthChecks("/health");
            })
                          .ConfigureServices(services =>
            {
                services.AddHealthChecks()
                .AddAsyncCheck("Foo", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")))
                .AddAsyncCheck("Bar", () => Task.FromResult(HealthCheckResult.Failed("Pretty bad.")))
                .AddAsyncCheck("Baz", () => Task.FromResult(HealthCheckResult.Passed("A-ok!")));
            });
            var server = new TestServer(builder);
            var client = server.CreateClient();

            var response = await client.GetAsync("/health");

            Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode);
            Assert.Equal("text/plain", response.Content.Headers.ContentType.ToString());
            Assert.Equal("Unhealthy", await response.Content.ReadAsStringAsync());
        }
예제 #9
0
        public async Task StatusCodeIs200IfCheckIsDegraded()
        {
            var builder = new WebHostBuilder()
                          .Configure(app =>
            {
                app.UseHealthChecks("/health");
            })
                          .ConfigureServices(services =>
            {
                services.AddHealthChecks()
                .AddCheck("Foo", () => HealthCheckResult.Passed("A-ok!"))
                .AddCheck("Bar", () => HealthCheckResult.Failed("Not so great."), failureStatus: HealthStatus.Degraded)
                .AddCheck("Baz", () => HealthCheckResult.Passed("A-ok!"));
            });
            var server = new TestServer(builder);
            var client = server.CreateClient();

            var response = await client.GetAsync("/health");

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal("text/plain", response.Content.Headers.ContentType.ToString());
            Assert.Equal("Degraded", await response.Content.ReadAsStringAsync());
        }
예제 #10
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            using (var connection = CreateConnection(ConnectionString))
            {
                try
                {
                    await connection.OpenAsync(cancellationToken);

                    if (TestQuery != null)
                    {
                        var command = connection.CreateCommand();
                        command.CommandText = TestQuery;

                        await command.ExecuteNonQueryAsync(cancellationToken);
                    }
                }
                catch (DbException ex)
                {
                    return(HealthCheckResult.Failed(exception: ex));
                }
            }

            return(HealthCheckResult.Passed());
        }