ASP.NET Core の gRPC 正常性チェック

作成者: James Newton-King

gRPC 正常性チェック プロトコルは、gRPC サーバー アプリの正常性を報告するための標準です。

正常性チェックは、アプリによって gRPC サービスとして公開されます。 通常、アプリの状態を確認するために、外部の監視サービスと併用されます。 このサービスは、さまざまなリアルタイム監視シナリオに合わせて構成できます。

  • 正常性プローブは、アプリの状態を確認する目的でコンテナー オーケストレーターとロード バランサーによって使用できます。 たとえば、Kubernetes は gRPC の liveness、readiness、startup の各 probe をサポートしています。 gRPC 正常性チェックの結果に基づいて、トラフィックを再ルーティングしたり、異常なコンテナーを再起動するように Kubernetes を構成できます。
  • メモリ、ディスク、その他の物理サーバー リソースの使用を監視し、正常性の状態を確認できます。
  • 正常性チェックでは、データベースや外部サービス エンドポイントなど、アプリの依存関係をテストし、それらが利用できることと正常に機能していることを確認できます。

gRPC 正常性チェックを設定する

gRPC ASP.NET Core には、Grpc.AspNetCore.HealthChecks パッケージを使った gRPC 正常性チェックのサポートが組み込まれています。 .NET 正常性チェックの結果は呼び出し元に報告されます。

アプリで gRPC 正常性チェックを設定するには:

  • Grpc.AspNetCore.HealthChecks パッケージ参照を追加します。
  • 次の gRPC 正常性チェック サービスを登録します。
    • 正常性チェックを有効にするサービスを登録する AddGrpcHealthChecks
    • 正常性チェック サービス エンドポイントを追加する MapGrpcHealthChecksService
  • 正常性チェックを追加するには、IHealthCheck を実装するか、AddCheck メソッドを使います。
using GrpcServiceHC.Services;
using Microsoft.Extensions.Diagnostics.HealthChecks;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks()
                .AddCheck("Sample", () => HealthCheckResult.Healthy());

var app = builder.Build();

app.MapGrpcService<GreeterService>();
app.MapGrpcHealthChecksService();

// Code removed for brevity.

正常性チェックを設定した場合:

  • サーバー アプリに正常性チェック サービスが追加されます。
  • アプリに登録された .NET 正常性チェックは定期的に実行され、正常性の結果を確認できます。 既定では、アプリの起動後に 5 秒の遅延があり、その後 30 秒ごとに正常性チェックが実行されます。 正常性チェックの実行間隔は、HealthCheckPublisherOptions を使用してカスタマイズできます
  • 正常性の結果によって、gRPC サービスからの報告内容が決まります。
    • 正常性の結果がない場合は、Unknown が報告されます。
    • HealthStatus.Unhealthy の正常性の結果がある場合は、NotServing が報告されます。
    • それ以外の場合は、Serving が報告されます。

Grpc.AspNetCore.HealthChecks を構成する

gRPC 正常性チェック サービスの既定では、登録されているすべての正常性チェックを使って正常性状態が判断されます。 gRPC 正常性チェックは、登録時に正常性チェックのサブセットを使うようにカスタマイズすることができます。 MapService メソッドは、正常性の結果をフィルター処理するための述語と共に、正常性の結果をサービス名にマップするために使われます。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("", r => r.Tags.Contains("public"));
});

var app = builder.Build();

上記のコードでは、既定のサービス ("") をオーバーライドし、"public" タグが指定された正常性の結果のみを使っています。

gRPC 正常性チェックは、正常性チェック時にサービス名引数を指定するクライアントをサポートしています。 サービス名を MapService に指定することで、複数のサービスがサポートされます。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
    o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});

var app = builder.Build();

通常、クライアントが指定するサービス名は、既定値 ("") か、アプリ内のサービスのパッケージ修飾名です。 ただし、クライアントが任意の値を使ってアプリの正常性を確認することを妨げるものはありません。

正常性チェックの実行間隔を構成する

正常性チェックは、Check が呼び出されると直ちに実行されます。 Watch はストリーミング メソッドであり、Check とは動作が異なります。実行時間が長いストリームでは、IHealthCheckPublisher を定期的に実行して正常性の結果を収集することで、正常性チェックの結果が経時的に報告されます。 既定では、パブリッシャーのは次のように動作します。

  • アプリの起動後、正常性チェックを実行する前に 5 秒待機します。
  • 正常性チェックを 30 秒ごとに実行します。

パブリッシャーの間隔は、起動時に HealthCheckPublisherOptions を使って構成できます。

builder.Services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.Zero;
    options.Period = TimeSpan.FromSeconds(10);
});

gRPC 正常性チェック サービスを呼び出す

Grpc.HealthCheck パッケージには、gRPC 正常性チェックのクライアントが含まれています。

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);

var response = await client.CheckAsync(new HealthCheckRequest());
var status = response.Status;

Health サービスには、次の 2 つのメソッドがあります。

  • Check は、現在の正常性状態を取得するための単項メソッドです。 正常性チェックは、Check が呼び出されると直ちに実行されます。 クライアントが不明なサービス名を要求した場合、サーバーは NOT_FOUND エラー応答を返します。 これは、アプリの起動時に、正常性の結果がまだ発行されていない場合に発生する可能性があります。
  • Watch は、時間の経過に伴う正常性状態の変化を報告するストリーミング メソッドです。 IHealthCheckPublisher は、正常性の結果を収集するために定期的に実行されます。 クライアントが不明なサービス名を要求した場合、サーバーは Unknown 状態を返します。

その他のリソース

作成者: James Newton-King

gRPC 正常性チェック プロトコルは、gRPC サーバー アプリの正常性を報告するための標準です。

正常性チェックは、アプリによって gRPC サービスとして公開されます。 通常、アプリの状態を確認するために、外部の監視サービスと併用されます。 このサービスは、さまざまなリアルタイム監視シナリオに合わせて構成できます。

  • 正常性プローブは、アプリの状態を確認する目的でコンテナー オーケストレーターとロード バランサーによって使用できます。 たとえば、Kubernetes は gRPC の liveness、readiness、startup の各 probe をサポートしています。 gRPC 正常性チェックの結果に基づいて、トラフィックを再ルーティングしたり、異常なコンテナーを再起動するように Kubernetes を構成できます。
  • メモリ、ディスク、その他の物理サーバー リソースの使用を監視し、正常性の状態を確認できます。
  • 正常性チェックでは、データベースや外部サービス エンドポイントなど、アプリの依存関係をテストし、それらが利用できることと正常に機能していることを確認できます。

gRPC 正常性チェックを設定する

gRPC ASP.NET Core には、Grpc.AspNetCore.HealthChecks パッケージを使った gRPC 正常性チェックのサポートが組み込まれています。 .NET 正常性チェックの結果は呼び出し元に報告されます。

アプリで gRPC 正常性チェックを設定するには:

  • Grpc.AspNetCore.HealthChecks パッケージ参照を追加します。
  • Startup.cs の gRPC 正常性チェック サービスを登録します。
    • 正常性チェックを有効にするサービスを登録する AddGrpcHealthChecks
    • 正常性チェック サービス エンドポイントを追加する MapGrpcHealthChecksService
  • 正常性チェックを追加するには、IHealthCheck を実装するか、AddCheck メソッドを使います。
public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
    services
        .AddGrpcHealthChecks()
        .AddCheck("Sample", () => HealthCheckResult.Healthy());
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();
        endpoints.MapGrpcHealthChecksService();
    });
}

正常性チェックを設定した場合:

  • サーバー アプリに正常性チェック サービスが追加されます。
  • アプリに登録された .NET 正常性チェックは定期的に実行され、正常性の結果を確認できます。 既定では、アプリの起動後に 5 秒の遅延があり、その後 30 秒ごとに正常性チェックが実行されます。 正常性チェックの実行間隔は、HealthCheckPublisherOptions を使用してカスタマイズできます
  • 正常性の結果によって、gRPC サービスからの報告内容が決まります。
    • 正常性の結果がない場合は、Unknown が報告されます。
    • HealthStatus.Unhealthy の正常性の結果がある場合は、NotServing が報告されます。
    • それ以外の場合は、Serving が報告されます。

Grpc.AspNetCore.HealthChecks を構成する

gRPC 正常性チェック サービスの既定では、登録されているすべての正常性チェックを使って正常性状態が判断されます。 gRPC 正常性チェックは、登録時に正常性チェックのサブセットを使うようにカスタマイズすることができます。 MapService メソッドは、正常性の結果をフィルター処理するための述語と共に、正常性の結果をサービス名にマップするために使われます。

services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("", r => r.Tags.Contains("public"));
});

上記のコードでは、既定のサービス ("") をオーバーライドし、"public" タグが指定された正常性の結果のみを使っています。

gRPC 正常性チェックは、正常性チェック時にサービス名引数を指定するクライアントをサポートしています。 サービス名を MapService に指定することで、複数のサービスがサポートされます。

services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
    o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});

通常、クライアントが指定するサービス名は、既定値 ("") か、アプリ内のサービスのパッケージ修飾名です。 ただし、クライアントが任意の値を使ってアプリの正常性を確認することを妨げるものはありません。

正常性チェックの実行間隔を構成する

正常性チェックは、Check が呼び出されると直ちに実行されます。 Watch はストリーミング メソッドであり、Check とは動作が異なります。実行時間が長いストリームでは、IHealthCheckPublisher を定期的に実行して正常性の結果を収集することで、正常性チェックの結果が経時的に報告されます。 既定では、パブリッシャーのは次のように動作します。

  • アプリの起動後、正常性チェックを実行する前に 5 秒待機します。
  • 正常性チェックを 30 秒ごとに実行します。

パブリッシャーの間隔は、起動時に HealthCheckPublisherOptions を使って構成できます。

services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.Zero;
    options.Period = TimeSpan.FromSeconds(10);
});

gRPC 正常性チェック サービスを呼び出す

Grpc.HealthCheck パッケージには、gRPC 正常性チェックのクライアントが含まれています。

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);

var response = client.CheckAsync(new HealthCheckRequest());
var status = response.Status;

Health サービスには、次の 2 つのメソッドがあります。

  • Check は、現在の正常性状態を取得するための単項メソッドです。 正常性チェックは、Check が呼び出されると直ちに実行されます。 クライアントが不明なサービス名を要求した場合、サーバーは NOT_FOUND エラー応答を返します。 これは、アプリの起動時に、正常性の結果がまだ発行されていない場合に発生する可能性があります。
  • Watch は、時間の経過に伴う正常性状態の変化を報告するストリーミング メソッドです。 IHealthCheckPublisher は、正常性の結果を収集するために定期的に実行されます。 クライアントが不明なサービス名を要求した場合、サーバーは Unknown 状態を返します。

その他のリソース