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}")); } }
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()); }
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()); }
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"))); }
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)); } }
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); }
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()); }
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()); }
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()); }