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>を、このトピックの前提条件セクションで取得したエンドポイントとトークンに置き換えます。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 依存関係を追加します。
// アプリケーションを手動でインストルメントするために必要な 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"); // 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 // OpenTelemetry Protocol (OTLP) 経由でデータを出力します。 dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol自動インストルメンテーションの依存関係をダウンロードします。
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 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /path/to/<your-project-name>ブラウザで
http://localhost:5107にアクセスします。次のページが表示された場合、トレースデータは Managed Service for OpenTelemetry コンソールに送信されています。
監視データを表示する
ARMS コンソール にログインします。左側のナビゲーションペインで、 を選択します。[アプリケーション] ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。
アイコンが言語列に表示されている場合、アプリケーションはApplication Monitoringに接続されています。ハイフン(-)が表示されている場合は、アプリケーションはManaged Service for OpenTelemetryに接続されています。