クラウドネイティブ アプリケーションに監視を追加する
ここまでで、監視の重要性を理解したので、それをクラウドネイティブ アプリケーションに組み込む方法を確認します。 このステップを行うには、アプリに 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 を使って構築されているため、すべてのコード例が依存関係の挿入を利用することを意味します。
マイクロサービス アプリ内の Products と Store 両方のサービスに、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 サービスに追加してみましょう。