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

完了

監視の重要性を理解したら、クラウドネイティブ アプリケーションに含める方法について説明します。 この手順を実行するには、OpenTelemetry をアプリに追加します。

アプリに OpenTelemetry を追加する

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

  • ログ記録: Microsoft.Extensions.Logging.ILogger
  • メトリック:System.Diagnostics.Metrics.Meter
  • トレース: System.Diagnostics.ActivitySystem.Diagnostics.ActivitySource

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

カテゴリ パッケージ 説明
コア API OpenTelemetry OpenTelemetry のコア機能を提供するメイン ライブラリ。
コア 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 コンポーネントを示す図。

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

マイクロサービスが 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 IServiceCollectionにサービスとして追加できるWebApplicationBuilder クラスを返します。

次に、OpenTelemetry ビルダーを格納する変数 var otelBuilder = services.AddOpenTelemetry() を作成します。 その後、コードはメトリックとトレースを otelBuilderに追加できます。

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

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

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

また、次の目的でコンソールにトレースを追加します。

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

最後の行は、 IServiceCollection クラスを返します。

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

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

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

var builder = WebApplication.CreateBuilder(args);

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

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