62 строки
2.2 KiB
C#
62 строки
2.2 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Data.Common;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
|
|
|
namespace HealthChecksSample
|
|
{
|
|
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 HealthCheckResult.Failed(exception: ex);
|
|
}
|
|
}
|
|
|
|
return HealthCheckResult.Passed();
|
|
}
|
|
}
|
|
}
|