بررسیهای سلامت (Health Checks) در ASP.NET Core برای مانیتورینگ اپلیکیشنهای شما 🩺
همه ما میخواهیم اپلیکیشنهای قوی و قابل اعتماد بسازیم که بتوانند به طور نامحدود مقیاسپذیر باشند و هر تعداد درخواستی را مدیریت کنند.
اما با افزایش پیچیدگی سیستمهای توزیعشده و معماریهای میکروسرویس، مانیتور کردن سلامت اپلیکیشنهای ما به طور فزایندهای دشوارتر میشود.
حیاتی است که شما سیستمی برای دریافت بازخورد سریع از سلامت اپلیکیشن خود داشته باشید.
اینجاست که health checks وارد میشوند.
بررسیهای سلامت راهی برای مانیتور و تأیید سلامت کامپوننتهای مختلف یک اپلیکیشن فراهم میکنند، از جمله:
🔹 دیتابیسها
🔹 APIها
🔹 کشها
🔹 سرویسهای خارجی
در این مقاله به شما نشان خواهم داد:
🔹 Health checks چه هستند
🔹 افزودن یک health check سفارشی
🔹 استفاده از کتابخانههای health check موجود
🔹 سفارشیسازی فرمت پاسخ health checks
بیایید ببینیم چگونه health checks را در ASP.NET Core پیادهسازی کنیم.
Health Checks چه هستند؟ 🤔
یک مکانیزم پیشگیرانه برای مانیتورینگ و تأیید سلامت و در دسترس بودن یک اپلیکیشن در ASP.NET Core هستند.
در اینجا پیکربندی اولیه آمده است که سرویسهای health check را ثبت کرده و HealthCheckMiddleware را برای پاسخگویی در URL مشخص شده اضافه میکند.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
var app = builder.Build();
app.MapHealthChecks("/health");
app.Run();
health check
یک مقدار HealthStatus را برمیگرداند که سلامت سرویس را نشان میدهد.
سه مقدار متمایز HealthStatus وجود دارد:
🟢 HealthStatus.Healthy
🟡 HealthStatus.Degraded
🔴 HealthStatus.Unhealthy
شما میتوانید از HealthStatus برای نشان دادن حالتهای مختلف اپلیکیشن خود استفاده کنید.
برای مثال، اگر اپلیکیشن کندتر از حد انتظار عمل میکند، میتوانید HealthStatus.Degraded را برگردانید.
افزودن Health Checks سفارشی 👨🔧
شما میتوانید health checks سفارشی را با پیادهسازی اینترفیس IHealthCheck ایجاد کنید.
برای مثال، میتوانید یک چک برای بررسی در دسترس بودن دیتابیس SQL خود پیادهسازی کنید.
مهم است که از یک کوئری استفاده کنید که بتواند به سرعت در دیتابیس کامل شود، مانند SELECT 1.
در اینجا یک مثال از پیادهسازی health check سفارشی در کلاس SqlHealthCheck آمده است:
public class SqlHealthCheck : IHealthCheck
{
private readonly string _connectionString;
public SqlHealthCheck(IConfiguration configuration)
{
_connectionString = configuration.GetConnectionString("Database");
}
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
try
{
using var sqlConnection = new SqlConnection(_connectionString);
await sqlConnection.OpenAsync(cancellationToken);
using var command = sqlConnection.CreateCommand();
command.CommandText = "SELECT 1";
await command.ExecuteScalarAsync(cancellationToken);
return HealthCheckResult.Healthy();
}
catch(Exception ex)
{
return HealthCheckResult.Unhealthy(
context.Registration.FailureStatus,
exception: ex);
}
}
}
پس از پیادهسازی health check سفارشی، باید آن را ثبت کنید.
فراخوانی قبلی به AddHealthChecks اکنون به این شکل میشود:
builder.Services.AddHealthChecks()
.AddCheck<SqlHealthCheck>("custom-sql", HealthStatus.Unhealthy);
ما به آن یک نام سفارشی میدهیم و مشخص میکنیم که کدام وضعیت به عنوان نتیجه شکست در
HealthCheckContext.Registration.FailureStatus
استفاده شود.
اما یک لحظه بایستید و فکر کنید.
آیا میخواهید برای هر سرویس خارجی که دارید، یک health check سفارشی را خودتان پیادهسازی کنید؟
البته که نه! یک راه حل بهتر وجود دارد.