Skip to content

Instantly share code, notes, and snippets.

@rodolfofadino
Created January 6, 2019 19:43
Show Gist options
  • Save rodolfofadino/5bab2d62baf9aeb0c5a828d2dd4e4f80 to your computer and use it in GitHub Desktop.
Save rodolfofadino/5bab2d62baf9aeb0c5a828d2dd4e4f80 to your computer and use it in GitHub Desktop.
DbConnectionHealthCheck.cs
using Microsoft.Extensions.Diagnostics.HealthChecks;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace WebApplication19.Checks
{
public abstract class DbConnectionHealthCheck : IHealthCheck
{
protected DbConnectionHealthCheck(string connectionString)
: this(connectionString, testQuery: null)
{
}
protected DbConnectionHealthCheck(string connectionString, string testQuery)
{
ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
TestQuery = testQuery;
}
protected string ConnectionString { get; }
// This sample supports specifying a query to run as a boolean test of whether the database
// is responding. It is important to choose a query that will return quickly or you risk
// overloading the database.
//
// In most cases this is not necessary, but if you find it necessary, choose a simple query such as 'SELECT 1'.
protected string TestQuery { get; }
protected abstract DbConnection CreateConnection(string connectionString);
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 new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex);
}
}
return HealthCheckResult.Healthy();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment