ASP.NET Core MVC - 2.2 Health Checks

Posted on 2018-12-19

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
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 一次