OpenTelemetry を使用して .NET アプリケーションをインストルメントし、トレースデータを Managed Service for OpenTelemetry にレポートすると、Managed Service for OpenTelemetry は .NET アプリケーションの監視を開始します。 アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL分析など、アプリケーションのモニタリングデータを表示できます。 このトピックでは、OpenTelemetry を使用して .NET アプリケーションを自動または手動でインストルメントし、トレースデータをレポートする方法について説明します。
背景情報
OpenTelemetry は、.NET アプリケーションの自動および手動インストルメンテーションをサポートしています。
自動インストルメンテーション
OpenTelemetry は、次の .NET バージョンを使用して自動インストルメンテーションをサポートしています。
.NET SDK 6 以降
OpenTelemetry は、.NET Framework を使用した自動インストルメンテーションをサポートしていません。
OpenTelemetry が自動インストルメンテーションをサポートしているフレームワークの詳細については、OpenTelemetry 公式ドキュメントの 利用可能なインストルメンテーション をご参照ください。
手動および半自動インストルメンテーション
サポートされているバージョン
.NET 5.0 以降
.NET Core 2.0 以降
.NET Framework 4.6.1 以降
サポートされているフレームワーク
サンプルコード
dotnet-demo からサンプルコードをダウンロードします。
方法 1:アプリケーションの自動インストルメンテーションを設定する
制限事項
OpenTelemetry は、.NET 6.0 以降の OpenTelemetry SDK を使用する場合にのみ、自動インストルメンテーションをサポートします。
OpenTelemetry は、.NET Framework を使用した自動インストルメンテーションをサポートしていません。
ASP.NET Core を使用して Web アプリケーションを作成します。
サンプルコードを使用してアプリケーションを作成します。
mkdir dotnet-simple-demo cd dotnet-simple-demo dotnet new web次のコードを Properties/launchSettings.json ファイルに追加します。
{ "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "http://localhost:8080", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }アプリケーションをビルドします。
dotnet build
アプリケーションの自動インストルメンテーションを設定します。
.NET 用 OpenTelemetry SDK を使用して、自動インストルメンテーションのインストールスクリプトをダウンロードして実行します。
curl -L -O https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/otel-dotnet-auto-install.sh ./otel-dotnet-auto-install.sh環境変数を設定し、自動インストルメンテーションスクリプトを実行します。
<serviceName>をアプリケーション名に置き換えます。<endpoint>と<token>は、この Topic の 前提条件 セクションで取得したエンドポイントとトークンに置き換えます。export OTEL_TRACES_EXPORTER=otlp \ OTEL_METRICS_EXPORTER=none \ OTEL_LOGS_EXPORTER=none \ OTEL_SERVICE_NAME=<serviceName> \ OTEL_EXPORTER_OTLP_PROTOCOL=grpc OTEL_EXPORTER_OTLP_ENDPOINT=<endpoint> \ OTEL_EXPORTER_OTLP_HEADERS="Authentication=<token>" . $HOME/.otel-dotnet-auto/instrument.sh説明.NET 用 OpenTelemetry SDK を使用して自動インストルメンテーションの環境変数を設定する方法の詳細については、OpenTelemetry 公式ドキュメントの 設定 をご参照ください。
アプリケーションを実行してアクセスします。
アプリケーションを実行します。
dotnet run次のコマンドを実行してアプリケーションにアクセスします。 生成されたトレースは、Managed Service for OpenTelemetry
curl localhost:8080/
方法 2:アプリケーションを手動でインストルメントする
dotnet-demo/opentelemetry-demo/manual-demo ディレクトリに移動し、アプリケーションを手動でインストルメントするために必要な次の OpenTelemetry 依存関係を追加します。
dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol dotnet add package OpenTelemetry.Exporter.Console // オプション。 コンソールにデータをエクスポートする場合に必要です。 dotnet add package OpenTelemetry.Extensions.HostingOpentelemetryExporterDemo.cs ファイルで、OpenTelemetry TracerProvider を作成し、HTTP ベースの OtlpExporter を追加してから、トレースデータがレポートされるアプリケーションの名前と、トレースデータのレポートに使用されるエンドポイントを指定します。
using System.Diagnostics; using OpenTelemetry; using OpenTelemetry.Trace; using OpenTelemetry.Resources; using OpenTelemetry.Exporter; namespace Demo { internal static class OpentelemetryExporterDemo { internal static void Run() { Console.WriteLine("otlp running"); // otlp 実行中 // OpenTelemetry を使用してトレースデータをレポートするアプリケーションの名前を指定します。 var serviceName = "otlp-test"; using var tracerProvider = Sdk.CreateTracerProviderBuilder() .AddSource(serviceName) .SetResourceBuilder( ResourceBuilder.CreateDefault().AddService(serviceName)) .AddOtlpExporter(opt => { // パラメーターの値を、このトピックの「前提条件」セクションで取得したエンドポイントに置き換えます。 opt.Endpoint = new Uri("<endpoint>"); // HTTP 経由でトレースデータをレポートします。 opt.Protocol = OtlpExportProtocol.HttpProtobuf; }) .AddConsoleExporter() // オプション。 コンソールにデータをエクスポートします。 .Build(); for(int i = 0; i<10; i++) { var MyActivitySource = new ActivitySource(serviceName); using var activity = MyActivitySource.StartActivity("SayHello"); activity?.SetTag("bar", "Hello World"); } } } }Program.cs ファイルを変更して、Main メソッドで OpentelemetryExporterDemo を呼び出します。
using System.Diagnostics; using System.Net.Http; using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; namespace Demo { public class Otlp { public static void Main(string[] args) { OpentelemetryExporterDemo.Run(); } } }現在のパスで次のコマンドを実行します。
dotnet run
方法 3:自動インストルメンテーションと手動インストルメンテーションを組み合わせる
OpenTelemetry は、数十の .NET フレームワークのトレースデータを自動的にアップロードできます。 詳細については、トレースのインストルメンテーション をご参照ください。
dotnet-demo/opentelemetry-demo/auto-demo ディレクトリに移動し、ASP.NET Core を使用して Web アプリケーションを作成します。
コード内の
<your-project-name>をアプリケーション名に置き換えます。mkdir <your-project-name> cd <your-project-name> dotnet new mvcアプリケーションを監視するために必要な OpenTelemetry 依存関係をダウンロードします。
dotnet add package OpenTelemetry.Exporter.Console // 収集されたデータをコンソールにエクスポートします。 dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol // OpenTelemetry Protocol (OTLP) 経由でデータをエクスポートします。自動インストルメンテーションの依存関係をダウンロードします。
ASP.NET Core フレームワークでアプリケーションを自動的にインストルメントするために使用される依存関係をダウンロードします。 アプリケーションが HTTP リクエストを受信すると、スパンが自動的に生成され、レポートされます。 他のフレームワーク上のアプリケーションの自動インストルメンテーションを設定するには、トレースのインストルメンテーション から関連する依存関係をダウンロードします。
dotnet add package OpenTelemetry.Instrumentation.AspNetCore<your-project-name>/Program.cs ファイルのコードを変更します。
ソースファイルの先頭に必要なパッケージをインポートします。
using System.Diagnostics; using OpenTelemetry.Exporter; using OpenTelemetry.Resources; using OpenTelemetry.Trace;ソースファイルの最後に DiagnosticsConfig クラスを追加します。
コード内の
<your-service-name>と<your-host-name>を実際のアプリケーション名とホスト名に置き換えます。public static class DiagnosticsConfig { public const string ServiceName = "<your-service-name>"; public const string HostName = "<your-host-name>"; public static ActivitySource ActivitySource = new ActivitySource(ServiceName); }OpenTelemetry を初期化するコードを追加します。
HTTP 経由でデータをレポートします。
次のコードの
<http_endpoint>を、このトピックの「前提条件」セクションで取得したエンドポイントに置き換えます。// ... builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => tracerProviderBuilder .AddSource(DiagnosticsConfig.ActivitySource.Name) .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault() .AddAttributes(new Dictionary<string, object> { {"service.name", DiagnosticsConfig.ServiceName}, {"host.name",DiagnosticsConfig.HostName} })) .AddAspNetCoreInstrumentation() .AddConsoleExporter() // オプション。 トレースデータをコンソールにエクスポートします。 .AddOtlpExporter(opt => { // HTTP 経由でデータをレポートします。 opt.Endpoint = new Uri("<http_endpoint>"); opt.Protocol = OtlpExportProtocol.HttpProtobuf; }) ); // ...gRPC 経由でデータをレポートします。
次のコードの
<grpc_endpoint>と<token>を、このトピックの「前提条件」セクションで取得したエンドポイントとトークンに置き換えます。// ... builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => tracerProviderBuilder .AddSource(DiagnosticsConfig.ActivitySource.Name) .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault() .AddAttributes(new Dictionary<string, object> { {"service.name", DiagnosticsConfig.ServiceName}, {"host.name",DiagnosticsConfig.HostName} })) .AddAspNetCoreInstrumentation() .AddConsoleExporter() // オプション。 トレースデータをコンソールにエクスポートします。 .AddOtlpExporter(opt => { // gRPC 経由でデータをレポートします。 opt.Endpoint = new Uri("<grpc_endpoint>"); opt.Headers = "Authentication=<token>"; opt.Protocol = OtlpExportProtocol.Grpc; }) ); // ...
ターミナルで次のコマンドを実行して、プロジェクトを実行します。
dotnet runコマンド出力の例:
返された情報にある URL を取得します。 例:
http://localhost:5107Building... // ビルド中... info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5107 // リッスン中: http://localhost:5107 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. // アプリケーションが起動しました。 終了するには Ctrl+C を押します。 info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development // ホスティング環境: 開発 info: Microsoft.Hosting.Lifetime[0] Content root path: /path/to/<your-project-name> // コンテンツルートパス: /path/to/<your-project-name>ブラウザで
http://localhost:5107にアクセスします。 次のページが表示された場合、トレースデータは Managed Service for OpenTelemetry コンソールにレポートされています。
モニタリングデータを表示する
Managed Service for OpenTelemetry コンソール の [アプリケーション] ページで、アプリケーションの名前をクリックします。 表示されるページで、トレースデータを表示します。