Skip to content

AdamHawkinsa/AspNetCore.Diagnostics.HealthChecks

Repository files navigation

HealthChecks Application Status CI ArangoDb Build status Aws S3 Build status Aws SecretsManager Build status Aws Sns Build status Aws Sqs Build status Aws SystemsManager Build status Azure IoTHub Build status Azure DigitalTwin Build status Azure KeyVault Build status Azure ServiceBus Build status Azure Storage Build status Consul Build status CosmosDb Build status DocumentDb Build status DynamoDb Build status ElasticSearch Build status Gcp CloudFirstore Build status GremlinDb Build status Hangfire Build status IbmMQ Build status Kafka Build status MongoDb Build status MySql Build status Nats Build status NpgSql Build status Network Build status OpenIdConnect Build status Oracle Build status Prometheus Metrics Build status Publisher ApplicationInsights Build status Publisher Datadog Build status Publisher Prometheus Build status Publisher Seq status RabbitMQ Build status RavenDb Build status Redis Build status SqlServer Build status SendGrid Build status SignalR Build status SolR Build status SqlLite Build status System Build status UI Build status Uris Build status

ui version ui pulls

k8s version k8s pulls

AspNetCore.Diagnostics.HealthChecks

This repository offers a wide collection of ASP.NET Core Health Check packages for widely used services and platforms.

ASP.NET Core versions supported: 6.0, 5.0, 3.1, 3.0 and 2.2

Sections

Previous versions documentation

HealthChecks

HealthChecks UI

HealthChecks UI and Kubernetes

HealthChecks and Devops

HealthChecks Tutorials

Health Checks

HealthChecks packages include health checks for:

Package Downloads Notes
ApplicationStatus Nuget
ArangoDB Nuget
Amazon S3 Nuget
Amazon Secrets Manager Nuget
Amazon SNS Nuget
Amazon SQS Nuget
Amazon Systems Manager Nuget
Azure IoT Hub Nuget
Azure DigitalTwin Nuget Subscription status, models and instances
Azure Key Vault Nuget
Azure Service Bus Nuget EventHub, Queue and Topics
Azure Storage Nuget Blob, File, Queue and Table
Consul Nuget
CosmosDb Nuget
Azure DocumentDb Nuget
Amazon DynamoDb Nuget
Elasticsearch Nuget
EventStore Nuget
Google Cloud Firestore Nuget
Gremlin Nuget
Hangfire Nuget
IbmMQ Nuget
Kafka Nuget
Kubernetes Nuget
MongoDB Nuget
MySql Nuget
Nats Nuget NATS, messaging, message-bus, pubsub
Network Nuget Ftp, SFtp, Dns, Tcp port, Smtp, Imap, Ssl
Postgres Nuget
Identity Server Nuget
Oracle Nuget
RabbitMQ Nuget
RavenDB Nuget
Redis Nuget
SendGrid Nuget
SignalR Nuget
Solr Nuget
Sqlite Nuget
Sql Server Nuget
System Nuget Disk Storage, Folder, Private Memory, Virtual Memory, Process, Windows Service
Uri Nuget Single uri and uri groups

We support netcoreapp 2.2, 3.0 and 3.1. Please use package versions 2.2.X, 3.0.X and 3.1.X to target different versions.

Install-Package AspNetCore.HealthChecks.ApplicationStatus
Install-Package AspNetCore.HealthChecks.ArangoDb
Install-Package AspNetCore.HealthChecks.Aws.S3
Install-Package AspNetCore.HealthChecks.Aws.SecretsManager
Install-Package AspNetCore.HealthChecks.Aws.Sns
Install-Package AspNetCore.HealthChecks.Aws.Sqs
Install-Package AspNetCore.HealthChecks.Aws.SystemsManager
Install-Package AspNetCore.HealthChecks.Azure.IoTHub
Install-Package AspNetCore.HealthChecks.AzureDigitalTwin
Install-Package AspNetCore.HealthChecks.AzureKeyVault
Install-Package AspNetCore.HealthChecks.AzureServiceBus
Install-Package AspNetCore.HealthChecks.AzureStorage
Install-Package AspNetCore.HealthChecks.Consul
Install-Package AspNetCore.HealthChecks.CosmosDb
Install-Package AspNetCore.HealthChecks.DocumentDb
Install-Package AspNetCore.HealthChecks.DynamoDB
Install-Package AspNetCore.HealthChecks.Elasticsearch
Install-Package AspNetCore.HealthChecks.EventStore
Install-Package AspNetCore.HealthChecks.Gcp.CloudFirestore
Install-Package AspNetCore.HealthChecks.Gremlin
Install-Package AspNetCore.HealthChecks.Hangfire
Install-Package AspNetCore.HealthChecks.IbmMQ
Install-Package AspNetCore.HealthChecks.Kafka
Install-Package AspNetCore.HealthChecks.Kubernetes
Install-Package AspNetCore.HealthChecks.MongoDb
Install-Package AspNetCore.HealthChecks.MySql
Install-Package AspNetCore.HealthChecks.Nats
Install-Package AspNetCore.HealthChecks.Network
Install-Package AspNetCore.HealthChecks.Npgsql
Install-Package AspNetCore.HealthChecks.OpenIdConnectServer
Install-Package AspNetCore.HealthChecks.Oracle
Install-Package AspNetCore.HealthChecks.RabbitMQ
Install-Package AspNetCore.HealthChecks.RavenDB
Install-Package AspNetCore.HealthChecks.Redis
Install-Package AspNetCore.HealthChecks.SendGrid
Install-Package AspNetCore.HealthChecks.SignalR
Install-Package AspNetCore.HealthChecks.Solr
Install-Package AspNetCore.HealthChecks.SqLite
Install-Package AspNetCore.HealthChecks.SqlServer
Install-Package AspNetCore.HealthChecks.System
Install-Package AspNetCore.HealthChecks.Uris

Once the package is installed you can add the HealthCheck using the AddXXX IServiceCollection extension methods.

We use MyGet feed for preview versions of HealthChecks packages.

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks()
        .AddSqlServer(Configuration["Data:ConnectionStrings:Sql"])
        .AddRedis(Configuration["Data:ConnectionStrings:Redis"]);
}

Each HealthCheck registration supports also name, tags, failure status and other optional parameters.

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddHealthChecks()
        .AddSqlServer(
            connectionString: Configuration["Data:ConnectionStrings:Sql"],
            healthQuery: "SELECT 1;",
            name: "sql",
            failureStatus: HealthStatus.Degraded,
            tags: new string[] { "db", "sql", "sqlserver" });
}

HealthCheck push results

HealthChecks include a push model to send HealthCheckReport results into configured consumers. The project AspNetCore.HealthChecks.Publisher.ApplicationInsights, AspNetCore.HealthChecks.Publisher.Datadog, AspNetCore.HealthChecks.Publisher.Prometheus or AspNetCore.HealthChecks.Publisher.Seq define a consumers to send report results to Application Insights, Datadog, Prometheus or Seq.

Package Downloads Notes
Application Insights Nuget
Datadog Nuget
Prometheus Gateway Nuget DEPRECATED
Seq Nuget

Include the package in your project:

install-package AspNetcore.HealthChecks.Publisher.ApplicationInsights
install-package AspNetcore.HealthChecks.Publisher.Datadog
install-package AspNetcore.HealthChecks.Publisher.Prometheus
install-package AspNetcore.HealthChecks.Publisher.Seq

Add publisher[s] into the IHealthCheckBuilder:

services
    .AddHealthChecks()
    .AddSqlServer(connectionString: Configuration["Data:ConnectionStrings:Sample"])
    .AddCheck<RandomHealthCheck>("random")
    .AddApplicationInsightsPublisher()
    .AddDatadogPublisher("myservice.healthchecks")
    .AddPrometheusGatewayPublisher();

HealthChecks Prometheus Exporter

If you need an endpoint to consume from prometheus instead of using Prometheus Gateway you could install AspNetCore.HealthChecks.Prometheus.Metrics.

install-package AspNetCore.HealthChecks.Prometheus.Metrics

Use the ApplicationBuilder extension method to add the endpoint with the metrics:

// default endpoint: /healthmetrics
app.UseHealthChecksPrometheusExporter();

// You could customize the endpoint
app.UseHealthChecksPrometheusExporter("/my-health-metrics");

// Customize HTTP status code returned(prometheus will not read health metrics when a default HTTP 503 is returned)
app.UseHealthChecksPrometheusExporter("/my-health-metrics", options => options.ResultStatusCodes[HealthStatus.Unhealthy] = (int)HttpStatusCode.OK);

HealthCheckUI

HealthChecksUI

UI Changelog

The project HealthChecks.UI is a minimal UI interface that stores and shows the health checks results from the configured HealthChecks uris.

To integrate HealthChecks.UI in your project you just need to add the HealthChecks.UI services and middlewares available in the package: AspNetCore.HealthChecks.UI

using HealthChecks.UI.Core;
using HealthChecks.UI.InMemory.Storage;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddHealthChecksUI()
            .AddInMemoryStorage();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app
            .UseRouting()
            .UseEndpoints(config => config.MapHealthChecksUI());
    }
}

This automatically registers a new interface on /healthchecks-ui where the SPA will be served.

Optionally, MapHealthChecksUI can be configured to serve its health api, webhooks api and the front-end resources in different endpoints using the MapHealthChecksUI(setup => { }) method overload. Default configured urls for this endpoints can be found here

Important note: It is important to understand that the API endpoint that the UI serves is used by the frontend SPA to receive the result of all processed checks. The health reports are collected by a background hosted service and the API endpoint served at /healthchecks-api by default is the url that the SPA queries.

Do not confuse this UI api endpoint with the endpoints we have to configure to declare the target apis to be checked on the UI project in the appsettings HealthChecks configuration section

When we target applications to be tested and shown on the UI interface, those endpoints have to register the UIResponseWriter that is present on the AspNetCore.HealthChecks.UI.Client as their ResponseWriter in the HealthChecksOptions when configuring MapHealthChecks method.

UI Polling interval

You can configure the polling interval in seconds for the UI inside the setup method. Default value is 10 seconds:

.AddHealthChecksUI(setupSettings: setup =>
{
    setup.SetEvaluationTimeInSeconds(5); // Configures the UI to poll for healthchecks updates every 5 seconds
});

UI API max active requests

You can configure max active requests to the HealthChecks UI backend api using the setup method. Default value is 3 active requests:

.AddHealthChecksUI(setupSettings: setup =>
{
    setup.SetApiMaxActiveRequests(1);
    //Only one active request will be executed at a time.
    //All the excedent requests will result in 429 (Too many requests)
});

UI Storage Providers

HealthChecks UI offers several storage providers, available as different nuget packages.

The current supported databases are:

Package Downloads
InMemory Nuget
SqlServer Nuget
SQLite Nuget
PostgreSQL Nuget
MySql Nuget

All the storage providers are extensions of HealthChecksUIBuilder:

InMemory

services
    .AddHealthChecksUI()
    .AddInMemoryStorage();

Sql Server

services
    .AddHealthChecksUI()
    .AddSqlServerStorage("connectionString");

Postgre SQL

services
    .AddHealthChecksUI()
    .AddPostgreSqlStorage("connectionString");

MySql

services
    .AddHealthChecksUI()
    .AddMySqlStorage("connectionString");

Sqlite

services
    .AddHealthChecksUI()
    .AddSqliteStorage($"Data Source=sqlite.db");

UI Database Migrations

Database Migrations are enabled by default, if you need to disable migrations you can use the AddHealthChecksUI setup:

services
    .AddHealthChecksUI(setup => setup.DisableDatabaseMigrations())
    .AddInMemoryStorage();

Or you can use IConfiguration providers, like json file or environment variables:

"HealthChecksUI": {
  "DisableMigrations": true
}

Health status history timeline

By clicking details button in the healthcheck row you can preview the health status history timeline:

Timeline

Note: HealthChecks UI saves an execution history entry in the database whenever a HealthCheck status changes from Healthy to Unhealthy and viceversa.

This information is displayed in the status history timeline but we do not perform purge or cleanup tasks in users databases. In order to limit the maximum history entries that are sent by the UI Api middleware to the frontend you can do a database cleanup or set the maximum history entries served by endpoint using:

services.AddHealthChecksUI(setup =>
{
    // Set the maximum history entries by endpoint that will be served by the UI api middleware
    setup.MaximumHistoryEntriesPerEndpoint(50);
});

HealthChecksUI is also available as a docker image You can read more about HealthChecks UI Docker image.

Configuration

By default HealthChecks returns a simple Status Code (200 or 503) without the HealthReport data. If you want that HealthCheck-UI shows the HealthReport data from your HealthCheck you can enable it adding an specific ResponseWriter.

app
    .UseRouting()
    .UseEndpoints(config =>
    {
        config.MapHealthChecks("/healthz", new HealthCheckOptions
        {
            Predicate = _ => true,
            ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
        });
    });

WriteHealthCheckUIResponse is defined on HealthChecks.UI.Client nuget package.

To show these HealthChecks in HealthCheck-UI they have to be configured through the HealthCheck-UI settings.

You can configure these Healthchecks and webhooks by using IConfiguration providers (appsettings, user secrets, env variables) or the AddHealthChecksUI(setupSettings: setup => { }) method can be used too.

Sample 2: Configuration using appsettings.json

{
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "HTTP-Api-Basic",
        "Uri": "http://localhost:6457/healthz"
      }
    ],
    "Webhooks": [
      {
        "Name": "",
        "Uri": "",
        "Payload": "",
        "RestoredPayload": ""
      }
    ],
    "EvaluationTimeInSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60
  }
}

Sample 2: Configuration using setupSettings method:

services
    .AddHealthChecksUI(setupSettings: setup =>
    {
       setup.AddHealthCheckEndpoint("endpoint1", "http://localhost:8001/healthz");
       setup.AddHealthCheckEndpoint("endpoint2", "http://remoteendpoint:9000/healthz");
       setup.AddWebhookNotification("webhook1", uri: "http://httpbin.org/status/200?code=ax3rt56s", payload: "{...}");
    })
    .AddSqlServer("connectionString");

Note: The previous configuration section was HealthChecks-UI, but due to incompatibilies with Azure Web App environment variables the section has been moved to HealthChecksUI. The UI is retro compatible and it will check the new section first, and fallback to the old section if the new section has not been declared.

1.- HealthChecks: The collection of health checks uris to evaluate.
2.- EvaluationTimeInSeconds: Number of elapsed seconds between health checks.
3.- Webhooks: If any health check returns a *Failure* result, this collections will be used to notify the error status. (Payload is the json payload and must be escaped. For more information see the notifications documentation section)
4.- MinimumSecondsBetweenFailureNotifications: The minimum seconds between failure notifications to avoid receiver flooding.
{
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "HTTP-Api-Basic",
        "Uri": "http://localhost:6457/healthz"
      }
    ],
    "Webhooks": [
      {
        "Name": "",
        "Uri": "",
        "Payload": "",
        "RestoredPayload": ""
      }
    ],
    "EvaluationTimeInSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60
  }
}

Using relative urls in Health Checks and Webhooks configurations (UI 3.0.5 onwards)

If you are configuring the UI in the same process where the HealthChecks and Webhooks are listening, from version 3.0.5 onwards the UI can use relative urls and it will automatically discover the listening endpoints by using server IServerAddressesFeature.

Sample:

//Configuration sample with relative url health checks and webhooks
services
    .AddHealthChecksUI(setupSettings: setup =>
    {
       setup.AddHealthCheckEndpoint("endpoint1", "/health-databases");
       setup.AddHealthCheckEndpoint("endpoint2", "health-messagebrokers");
       setup.AddWebhookNotification("webhook1", uri: "/notify", payload: "{...}");
    })
    .AddSqlServer("connectionString");

You can also use relative urls when using IConfiguration providers like appsettings.json.

Webhooks and Failure Notifications

If the WebHooks section is configured, HealthCheck-UI automatically posts a new notification into the webhook collection. HealthCheckUI uses a simple replace method for values in the webhook's Payload and RestorePayload properties. At this moment we support two bookmarks:

[[LIVENESS]] The name of the liveness that returns Down.

[[FAILURE]] A detail message with the failure.

[[DESCRIPTIONS]] Failure descriptions

Webhooks can be configured with configuration providers and also by code. Using code allows greater customization as you can setup you own user functions to customize output messages or configuring if a payload should be sent to a given webhook endpoint.

The web hooks section contains more information and webhooks samples for Microsoft Teams, Azure Functions, Slack and more.

UI Style and branding customization

Sample of dotnet styled UI

HealthChecksUIBranding

Since version 2.2.34, UI supports custom styles and branding by using a custom style sheet and css variables. To add your custom styles sheet, use the UI setup method:

app
    .UseRouting()
    .UseEndpoints(config =>
    {
        config.MapHealthChecksUI(setup =>
        {
            setup.AddCustomStylesheet("dotnet.css");
        });
    });

You can visit the section custom styles and branding to find source samples and get further information about custom css properties.

UI Configure HttpClient and HttpMessageHandler for Api and Webhooks endpoints

If you need to configure a proxy, or set an authentication header, the UI allows you to configure the HttpMessageHandler and the HttpClient for the webhooks and healtheck api endpoints. You can also register custom delegating handlers for the API and WebHooks HTTP clients.

services.AddHealthChecksUI(setupSettings: setup =>
{
    setup.ConfigureApiEndpointHttpclient((sp, client) =>
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "supertoken");
    })
    .UseApiEndpointHttpMessageHandler(sp =>
    {
        return new HttpClientHandler
        {
            Proxy = new WebProxy("http://proxy:8080")
        };
    })
    .UseApiEndpointDelegatingHandler<CustomDelegatingHandler>()
    .ConfigureWebhooksEndpointHttpclient((sp, client) =>
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "sampletoken");
    })
    .UseWebhookEndpointHttpMessageHandler(sp =>
    {
        return new HttpClientHandler()
        {
            Properties =
            {
                ["prop"] = "value"
            }
        };
    })
    .UseWebHooksEndpointDelegatingHandler<CustomDelegatingHandler2>();
})
.AddInMemoryStorage();

UI Kubernetes Operator

If you are running your workloads in kubernetes, you can benefit from it and have your healthchecks environment ready and monitoring in seconds.

You can get for information in our HealthChecks Operator docs

UI Kubernetes automatic services discovery

HealthChecks UI supports automatic discovery of k8s services exposing pods that have health checks endpoints. This means, you can benefit from it and avoid registering all the endpoints you want to check and let the UI discover them using the k8s api.

You can get more information here

HealthChecks as Release Gates for Azure DevOps Pipelines

HealthChecks can be used as Release Gates for Azure DevOps using this Visual Studio Market place Extension.

Check this README on how to configure it.

Protected HealthChecks.UI with OpendId Connect

There are some scenarios where you can find useful to restrict access for users on HealthChecks UI, maybe for users who belong to some role, based on some claim value etc.

We can leverage the ASP.NET Core Authentication/Authorization features to easily implement it. You can see a fully functional example using IdentityServer4 here but you can use Azure AD, Auth0, Okta, etc.

Check this README on how to configure it.

Tutorials, demos and walkthroughs on ASP.NET Core HealthChecks

Contributing

AspNetCore.Diagnostics.HealthChecks wouldn't be possible without the time and effort of its contributors. The team is made up of Unai Zorrilla Castro @unaizorrilla, Luis Ruiz Pavón @lurumad, Carlos Landeras @carloslanderas, Eduard Tomás @eiximenis and Eva Crespo @evacrespob

Our valued committers are: Hugo Biarge @hbiarge, Matt Channer @mattchanner, Luis Fraile @lfraile, Bradley Grainger @bgrainger, Simon Birrer @SbiCA, Mahamadou Camara @poumup, Jonathan Berube @joncloud, Daniel Edwards @dantheman999301, Mike McFarland @roketworks, Matteo @Franklin89, Miňo Martiniak @Burgyn, Peter Winkler @pajzo, @mikevanoo,Alexandru Rus @AlexandruRus23,Volker Thiel @riker09, Ahmad Magdy @Ahmad-Magdy, Marcel Lambacher @Marcel-Lambacher, Ivan Maximov @sungam3r, David Bottiau @odonno,ZeWizard @zeWizard, Ruslan Popovych @rpopovych, @jnovick, Marcos Palacios @mpcmarcos, Gerard Godone-Maresca @ggmaresca, Facundo @fglaeser, Daniel Nordström @SpaceOgre, @mphelt

If you want to contribute to the project and make it better, your help is very welcome. You can contribute with helpful bug reports, features requests and also submitting new features with pull requests.

  1. Read and follow the Don't push your pull requests
  2. Follow the code guidelines and conventions.
  3. New features are not only code, tests and documentation are also mandatory.