クラウドネイティブ アプリケーションに監視を追加する

完了

ここまでで、監視の重要性を理解したので、それをクラウドネイティブ アプリケーションに組み込む方法を確認します。 このステップを行うには、アプリに OpenTelemetry を追加します。

アプリに OpenTelemetry を追加する

.NET には、ログ、メトリック、トレース データを生成する組み込みの監視ツールの豊富なエコシステムが存在します。 これらのツールを使用して、クラウドネイティブ アプリケーションに監視を追加できます。 これらのライブラリは次のとおりです。

  • ログ: Microsoft.Extensions.Logging.ILogger
  • メトリック: System.Diagnostics.Metrics.Meter
  • トレース: System.Diagnostics.Activity および System.Diagnostics.ActivitySource

OpenTelemetry は前に示したすべてのテレメトリを使いますが、最初に、クラウドネイティブ アプリで NuGet パッケージから OpenTelemetry のサポートを追加する必要があります。 これらのパッケージは、次の 3 つのグループに分類できます。

カテゴリ Package 説明
Core API OpenTelemetry OpenTelemetry のコア機能を提供するメイン ライブラリ。
Core API OpenTelemetry.Extensions.Hosting ASP.NET Core ホストで OpenTelemetry トレースを自動的に開始および停止するための拡張メソッドを提供します。
インストルメンテーション OpenTelemetry.Instrumentation.AspNetCore ASP.NET Core アプリケーションのインストルメンテーション。 このパッケージにより、コードを記述しなくても、アプリに関する多数のメトリックが収集されます。
輸出者 OpenTelemetry.Exporter.Console コンソールのエクスポーターを使用すると、アプリからコンソールにテレメトリを書き出すことができます。

クラウドネイティブ アプリに組み込むことができる、さらに多くのインストルメンテーションおよびエクスポーター パッケージがあります。 詳細については、「OpenTelemetry を使用した .NET の監視」を参照してください。 ビルドするアプリの種類に応じて、最も関連性の高いパッケージを追加できます。

このモジュールでは、eShopLite クラウドネイティブ アプリで OpenTelemetry を使用することに重点を置いています。 このアプリは .NET Core と Blazor WebAssembly を使って構築されているため、すべてのコード例が依存関係の挿入を利用することを意味します。

アプリのさまざまな OpenTelemetry コンポーネントを示す図。

マイクロサービス アプリ内の ProductsStore 両方のサービスに、OpenTelemetry のすべてのパッケージを含めることを選択できます。 ただし、実際のアプリでは、さらに多くのサービスがあります。 それぞれにこれらのパッケージをすべて追加すると、不要な重複が発生します。 それよりも良い方法は、任意のマイクロサービスが監視対象として参照できる新しい診断 プロジェクトをソリューションに追加することです。

マイクロサービスが OpenTelemetry を使用するために呼び出すことができるメソッド AddObservability を作成するコード例を次に示します。

using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace Microsoft.Extensions.DependencyInjection;

public static class DiagnosticServiceCollectionExtensions
{
  public static IServiceCollection AddObservability(this IServiceCollection services,
      string serviceName,
      IConfiguration configuration)
  {
    // create the resource that references the service name passed in
    var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");

    // add the OpenTelemetry services
    var otelBuilder = services.AddOpenTelemetry();

    otelBuilder
        // add the metrics providers
        .WithMetrics(metrics =>
        {
          metrics
            .SetResourceBuilder(resource)
            .AddRuntimeInstrumentation()
            .AddAspNetCoreInstrumentation()
            .AddHttpClientInstrumentation()
            .AddEventCountersInstrumentation(c =>
            {
              c.AddEventSources(
                      "Microsoft.AspNetCore.Hosting",
                      "Microsoft-AspNetCore-Server-Kestrel",
                      "System.Net.Http",
                      "System.Net.Sockets");
            })
            .AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
            .AddConsoleExporter();

        })
        // add the tracing providers
        .WithTracing(tracing =>
        {
          tracing.SetResourceBuilder(resource)
                      .AddAspNetCoreInstrumentation()
                      .AddHttpClientInstrumentation()
                      .AddSqlClientInstrumentation();
        });

    return services;
  }

  // Add the Prometheus endpoints to your service, this will expose the metrics at http://service/metrics
  public static void MapObservability(this IEndpointRouteBuilder routes)
  {
    routes.MapPrometheusScrapingEndpoint();
  }
}

このメソッドからは、ASP.NET Core WebApplicationBuilder にサービスとして追加できる IServiceCollection クラスが返されます。

このアクションでは、次に、OpenTelemetry ビルダーを格納する変数 var otelBuilder = services.AddOpenTelemetry() が作成されます。 その後は、コードでメトリックとトレースを otelBuilder に追加できるようになります。

たとえば、この構成では次のインストルメンテーションが追加されます。

  • ASP.NET Core
  • C# ランタイム
  • HttpCLient
  • Kestrel Web サーバー

これらのメトリックはコンソールに表示されます。 .AddConsoleExporter() メソッドにより、ビルダーにエクスポーターを追加されます。

また、以下を対象とするコンソールにトレースが追加されます。

  • ASP.NET Core
  • HttpClient
  • SQL クライアント

最後の行で IServiceCollection クラスが返されます。

診断プロジェクトが完了したら、プロジェクトへの参照と 1 行のコードをサービスに追加するだけの簡単な作業です。 たとえば、OpenTelemetry を Products サービスに含めるには、Product.csproj ファイルにプロジェクト参照を追加します。

<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />

次に、次の行を Program.cs ファイルの builder の宣言の下に追加します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddObservability("Products", builder.Configuration);

このコードを eShopLite アプリの Products サービスに追加してみましょう。