Google Cloud Platform

ASP.NET Core アプリの診断機能を提供する Stackdriver ライブラリを GA リリース

google-cloud-diagnostics-3.png

アプリケーションの障害を把握するうえで、そのログやエラー、レイテンシを調べることはとても重要ですが、そのような診断機能を正しく実装することは容易ではなく、時間もかかります。

そこで私たちは、ASP.NET Core アプリケーション対応の Stackdriver Diagnostics 統合ライブラリを一般リリース(GA)しました。これを使えば、最小限の労力とコードで、Stackdriver の LoggingError Reporting、および Trace の各機能を ASP.NET Core アプリケーションに組み込むことができます。

GA に至るまでの過程で、私たちはバグをフィックスし、お客様からのフィードバックを反映させ、徹底的なテストを行って、本番ワークロードに耐えられるように改良を行ってきました。

Google.Cloud.Diagnostics.AspNetCore パッケージは NuGet から入手できます。ASP.NET Classic も Google.Cloud.Diagnostics.AspNet パッケージでサポートされます。

この投稿では、このリリースに組み込まれたさまざまな Google Cloud Platform(GCP)コンポーネントと、それを使った ASP.NET Core アプリケーションのトラブルシューティングの方法を紹介します。

Stackdriver Logging

Stackdriver Logging は、GCP と AWS から送られてきたログ データとイベントを格納、分析、監視し、それに基づいてアラートを生成します。Stackdriver へのロギングは、Google.Cloud.Diagnostics.AspNetCore パッケージを使えば簡単です。

このパッケージは、ASP.NET Core の組み込みロギング API を使用します。Stackdriver のプロバイダを追加し、通常どおりロガーを作成して利用すると、Google Cloud ConsoleStackdriver Logging セクションにログが表示されます。ほんの数行のコードを追加するだけで、Stackdriver Logging を初期化してログを送ることができます。

  public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    // Initialize Stackdriver Logging
    loggerFactory.AddGoogle("YOUR-GOOGLE-PROJECT-ID");
    ...
}
public void LogMessage(ILoggerFactory loggerFactory)
{
    // Send a log to Stackdriver Logging
    var logger = loggerFactory.CreateLogger("NetworkLog");
    logger.LogInformation("This is a log message.");
}

以下は Cloud Console に表示された Stackdriver のログです。

X_G57BdO_EfVEHiMEGnt8_u3KFcyc6BLaod7W1mwU0z0-oy3TVAkwi1snklNxSJWHWe_jbGRAj7rHP_cVMig0jeYxpV3Qe2vLPXANxOFw3XszLmzwWQK1wfpWckuqONcxiLI3C0Mq7m3.PNG

上の画面には、Stackdriver に送られた 2 つの異なるログが表示されています。拡張ログは、重大度、タイムスタンプ、ペイロード、その他の有用な情報を示します。

Stackdriver Error Reporting

ミドルウェア フローの冒頭に Stackdriver Error Reporting のミドルウェアを追加すると、すべての未処理例外が Stackdriver Error Reporting に表示されます。例外はグループにまとめられ、Cloud Console の Stackdriver Error Reporting セクションに表示されます。ASP.NET Core アプリケーションに次のコードを追加すると、Stackdriver Error Reporting を初期化できます。

  public void ConfigureServices(IServiceCollection services)
{
    services.AddGoogleExceptionLogging(options =>
    {
        options.ProjectId = "YOUR-GOOGLE-PROJECT-ID";
        options.ServiceName = "ImageGenerator";
        options.Version = "1.0.2";
    });
    ...
}
public void Configure(IApplicationBuilder app)
{
    // Use before handling any requests to ensure all unhandled exceptions are reported.
    app.UseGoogleExceptionLogging();
    ...
}

IExceptionLogger インターフェースを使用すれば、キャッチされた例外や処理された例外もレポートできます。

  public void ReadFile(IExceptionLogger exceptionLogger)
{
    try
    {
        string scores = File.ReadAllText(@"C:\Scores.txt");
        Console.WriteLine(scores);
    }
    catch (IOException e)
    {
        exceptionLogger.Log(e);
    }
}

以下は Cloud Console に表示された Stackdriver のエラー レポートです。

mtYCvcpDL-WYb1NO2ttqvGs4O9cbmIheA4noJFNCqEKLy4oyZjH3fyz66nXqBwE28v1iHM-51tuDySZoOmAXV-90s9AbVFJ9c1qdh7mS2x1P3dHHRXMlEtmOuu8QzmmumQQP2q8a0zhj.PNG

上の画面は、特定のアプリケーションの特定のバージョンで起きたエラーを時間の経過とともに示しています。エラーの詳細は画面下部に表示されます。

Stackdriver Trace

Stackdriver Trace はすべてのアプリケーションのレイテンシ情報を取得します。たとえば、Stackdriver Trace のインテグレーション ポイントを使用すると、時間がかかりすぎている HTTP リクエストを診断できます。Error Reporting と同様に、Trace もミドルウェア フローにフックされるため、ミドルウェア フローの冒頭に追加する必要があります。初期化方法についても、Error Reporting での方法とよく似ています。

  public void ConfigureServices(IServiceCollection services)
{
    string projectId = "YOUR-GOOGLE-PROJECT-ID";
    services.AddGoogleTrace(options =>
    {
        options.ProjectId = projectId;
    });
    ...
}
public void Configure(IApplicationBuilder app)
{
    // Use at the start of the request pipeline to ensure the entire request is traced.
    app.UseGoogleTrace();
    ...
}

現在の要求に対応するコード セクションを手動でトレースすることもできます。

  public void TraceHelloWorld(IManagedTracer tracer)
{
    using (tracer.StartSpan(nameof(TraceHelloWorld)))
    {
        Console.Out.WriteLine("Hello, World!");
    }
}

以下は Cloud Console に表示された複数のサーバーのトレースです。

wBrW9Il-OxoQVLt6iWhxJUjaveyYw8sUubzXkU5aIy1uAXgysbrgqNPo4XXS3kaSyxboObP-aJ8vpqpQ4wedNotP-Ktx63KIfKusIWqjan5hohOlxTt7I7K-TEm_DGAqiROy8NPYt7ub.PNG

この画面は、HTTP リクエストの各部に費やされた時間を示しています。タイムラインには、フロントエンドとバックエンドの両方に費やされた時間が表示されます。

ASP.NET Core をまだ使っていない場合は?

まだ ASP.NET Core に切り替えていないにもかかわらず Stackdriver の診断ツールを使いたいという方のために、ASP.NET 用の Google.Cloud.Diagnostics.AspNet パッケージも用意されています。このパッケージは、ASP.NET アプリケーションに統合できるシンプルな Stackdriver 診断機能を提供します。

このパッケージを使って ASP.NET アプリケーションに 1 行のコードを追加すると、MVC と Web API に Error ReportingTracing を追加できます。また、ASP.NET はロギング API を持っていませんが、Google.Cloud.Logging.Log4Net パッケージの log4net は Stackdriver Logging と統合されています。

私たちは、ASP.NET および ASP.NET Core アプリケーションを構築、実行する場所として GCP を相応しいものにすることを目標としており、パフォーマンスやエラーのトラブルシューティング機能はそのための重要なパーツです。ぜひ、このライブラリの感想をお知らせください。そして GitHub にフィードバックを残してください。

* この投稿は米国時間 8 月 28 日、Software Engineer である Ian Talarico によって投稿されたもの(投稿はこちら)の抄訳です。

- By Ian Talarico, Software Engineer