- Published on
ASP.NET Core MVC - 2.2 Health Checks
ASP.NET Core MVC 2.2 有多了一個新功能叫 Health Checks,可以讓我們檢查程式的健康狀態
First Healthy Check
- 在
ConfigureServices
裡面加一個AddHealthChecks
的 Service - 第二個參數基本上就是你要檢查的內容,這裡比較簡單的就直接回傳
Healthy
services.AddHealthChecks()
.AddCheck("check", () => HealthCheckResult.Healthy());
- 在
Configure
裡面去做使用它,傳入 Path 當成參數 - 記得加在第一行,比較不會被其它的給影響
app.UseHealthChecks("/check");
- 打開設定的 Path,就會看到
Healthy
Check Report
- 如果要拿到比較詳細的資料,可以把 report 轉成 json 輸出
app.UseHealthChecks("/check", new HealthCheckOptions
{
ResponseWriter = async (context, report) =>
{
var json = JsonConvert.SerializeObject(report);
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(json);
}
});
- 輸出結果
Check Tag
- 如果有多個 check,可以幫每一個 check 定義一個 tag
services.AddHealthChecks()
.AddCheck("check01", () => HealthCheckResult.Healthy(), new[] { "check01" })
.AddCheck("check02", () => HealthCheckResult.Unhealthy(), new[] { "check02" });
- 為每一個 tag 定義一個 Path
app.UseHealthChecks("/check01", new HealthCheckOptions
{
Predicate = t => t.Tags.Contains("check01"),
ResponseWriter = async (context, report) =>
{
var json = JsonConvert.SerializeObject(report);
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(json);
}
});
app.UseHealthChecks("/check02", new HealthCheckOptions
{
Predicate = t => t.Tags.Contains("check02")
});
- 輸出結果
Check PostgreSQL
有人有寫了 AspNetCore.Diagnostics.HealthChecks 套件,可以讓你方便的檢查一些常見的資源,就不用在自己寫程式,下面就用這個套件來檢查 PostgreSQL
先安裝套件
AspNetCore.HealthChecks.Npgsql
,然後修改 Checks 程式多加一個AddNpgSql
services.AddHealthChecks()
.AddCheck("check01", () => HealthCheckResult.Healthy(), new[] { "check01" })
.AddCheck("check02", () => HealthCheckResult.Unhealthy(), new[] { "check02" });
.AddNpgSql(Configuration.GetConnectionString("DefaultConnection"));
- 多加一個 Path,來看結果,NpgSql 的 tag 就是
npgsql
app.UseHealthChecks("/check03", new HealthCheckOptions
{
Predicate = t => t.Tags.Contains("npgsql"),
ResponseWriter = async (context, report) =>
{
var json = JsonConvert.SerializeObject(report);
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(json);
}
});
- 輸出結果
Health Check UI
每一個 Check 都只能用這種方式來看實在是不優,好在套件也有提供了 UI 的功能,可以比較視覺化的來看所有的 Check
先安裝套件
AspNetCore.HealthChecks.UI
增加 Service 使用 UI
services.AddHealthChecksUI();
- 註解掉之前所有的
UseHealthChecks
,加入一個新的UseHealthChecks
- Predicate 直接回傳
true
(拿所有的tag
) - ResponseWriter 就直接寫到 UIResponseWriter
- Predicate 直接回傳
app.UseHealthChecks("/checkui", new HealthCheckOptions
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
- 加入使用 Health Checks UI,並設定
UIPath
app.UseHealthChecksUI(options =>
{
options.UIPath = "/CashCheckUI";
});
- 加入 UI Config
- Uri 為剛才設定的 HealthCheck Path (不是 UI 的 Path)
- Uri 的 Host 請依自己的狀況修改
{
"HealthChecks-UI": {
"HealthChecks": [
{
"Name": "Cash Check",
"Uri": "http://localhost:5000/checkui"
}
]
}
}
- 來到 UI Path (
/CashCheck
) 就可以看到所有的 Check- 預設每 10 秒畫面會 refresh 一次