すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:.NET アプリケーションのトレースデータを送信するために OpenTelemetry を使用する

最終更新日:Mar 03, 2025

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 以後

    • サポートされているフレームワーク

      サポートされているフレームワークとバージョン

      フレームワーク

      Windows 専用の .NET Framework でサポートされています

      クロスプラットフォーム .NET でサポートされています

      (.NET Core)

      サポートされているバージョン

      インストルメント化されたライブラリ

      ASPNET

      はい

      ASP.NET (.NET Framework) MVC および ASP.NET Web API はサポートされていません。

      該当なし

      該当なし

      ASPNETCORE

      該当なし

      はい

      該当なし

      該当なし

      Azure

      はい

      はい

      2021 年 10 月 1 日以降にリリースされたAzure.プレフィックスが付いたパッケージがサポートされています。

      Azure SDK

      Elasticsearch

      はい

      はい

      • V8.0.0 から V8.10.0 未満の Elasticsearch .NET クライアントがサポートされています。

      • V8.10.0 以降は、Elasticsearch Transport フレームワークでサポートされています。

      Elastic.Clients.Elasticsearch

      Elasticsearch Transport

      はい

      はい

      V0.4.16 以後

      Elastic.Transport

      Entity Framework Core

      該当なし

      はい

      V6.0.12 以後

      Microsoft.EntityFrameworkCore

      GraphQL

      該当なし

      はい

      V7.5.0 以後

      GraphQL

      gRPC クライアント

      はい

      はい

      V2.52.0 から V3.0.0 未満

      Grpc.Net.Client

      HttpClient

      はい

      はい

      *

      System.Net.Http.HttpClient

      System.Net.HttpWebRequest

      Quartz

      V4.7.1 以前はサポートされていません。

      はい

      V3.4.0 以後

      Quartz

      MassTransit

      該当なし

      はい

      V8.0.0 以後

      MassTransit

      MongoDB

      はい

      はい

      V2.13.3 から V3.0.0 未満

      MongoDB.Driver.Core

      MySQL Connector

      はい

      はい

      V2.0.0 以後

      MySqlConnector

      MySQL Data

      該当なし

      はい

      V8.1.0 以後

      MySql.Data

      Npgsql

      はい

      はい

      V6.0.0 以後

      Npgsql

      NServiceBus

      はい

      はい

      V8.0.0 以後

      NServiceBus

      SQL クライアント

      はい

      はい

      Microsoft.Data.SqlClient V3 はサポートされていません。

      StackExchange.Redis

      該当なし

      はい

      V2.0.405 から V3.0.0 未満

      StackExchange.Redis

      WCF クライアント

      はい

      はい

      該当なし

      該当なし

      WCF サービス

      はい

      該当なし

      該当なし

      該当なし

サンプルコード

dotnet-demo からサンプルコードをダウンロードします。

方法 1:アプリケーションの自動インストルメンテーションを設定する

制限事項

  • OpenTelemetry は、.NET 6.0 以後の OpenTelemetry SDK を使用する場合にのみ、自動インストルメンテーションをサポートします。

  • OpenTelemetry は、.NET Framework を使用した自動インストルメンテーションをサポートしていません。

  1. ASP.NET Core を使用して Web アプリケーションを作成します。

    1. サンプルコードを使用してアプリケーションを作成します。

      mkdir dotnet-simple-demo
      cd dotnet-simple-demo
      dotnet new web
    2. 次のコードを 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"
            }
          }
        }
      }
    3. アプリケーションをビルドします。

      dotnet build
  2. アプリケーションの自動インストルメンテーションを設定します。

    1. .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
    2. 環境変数を設定し、自動インストルメンテーションスクリプトを実行します。

      <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 の公式ドキュメントの設定を参照してください。

  3. アプリケーションを実行してアクセスします。

    1. アプリケーションを実行します。

      dotnet run
    2. 次のコマンドを実行してアプリケーションにアクセスします。生成されたトレースは、Managed Service for OpenTelemetry に自動的に送信されます。

      curl localhost:8080/

方法 2:アプリケーションを手動でインストルメントする

  1. 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.Hosting
  2. OpentelemetryExporterDemo.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");
                }
            }
        }
    }
  3. 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();
            }
        }
    }
  4. 現在のパスで次のコマンドを実行します。

    dotnet run

方法 3:自動インストルメンテーションと手動インストルメンテーションを組み合わせる

OpenTelemetry は、数十の .NET フレームワークのトレースデータを自動的にアップロードできます。詳細については、トレースのインストルメンテーションを参照してください。

  1. dotnet-demo/opentelemetry-demo/auto-demo ディレクトリに移動し、ASP.NET Core を使用して Web アプリケーションを作成します。

    コード内の <your-project-name> をアプリケーション名に置き換えます。

    mkdir <your-project-name>
    cd <your-project-name>
    dotnet new mvc
  2. アプリケーションを監視するために必要な OpenTelemetry 依存関係をダウンロードします。

    // 収集されたデータをコンソールに出力します。
    dotnet add package OpenTelemetry.Exporter.Console 
    dotnet add package OpenTelemetry.Extensions.Hosting
    // OpenTelemetry Protocol (OTLP) 経由でデータを出力します。
    dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol 
  3. 自動インストルメンテーションの依存関係をダウンロードします。

    ASP.NET Core フレームワークでアプリケーションを自動的にインストルメントするために使用される依存関係をダウンロードします。アプリケーションが HTTP リクエストを受信すると、スパンが自動的に生成され、送信されます。他のフレームワーク上のアプリケーションの自動インストルメンテーションを設定するには、トレースのインストルメンテーションから関連する依存関係をダウンロードします。

    dotnet add package OpenTelemetry.Instrumentation.AspNetCore
  4. <your-project-name>/Program.cs ファイルのコードを変更します。

    1. ソースファイルの先頭に必要なパッケージをインポートします。

      using System.Diagnostics;
      using OpenTelemetry.Exporter;
      using OpenTelemetry.Resources;
      using OpenTelemetry.Trace;
    2. ソースファイルの最後に 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);
      }
    3. 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;
                    })
             );
        // ...

    Program.cs ファイルの完全なサンプルコード

    // 必要なパッケージをインポートします。
    using System.Diagnostics;
    using OpenTelemetry.Exporter;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Trace;
    
    var builder = WebApplication.CreateBuilder(args);
    
    
    builder.Services.AddControllersWithViews();
    
    // OpenTelemetry を初期化します。
    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 経由でデータを送信します。
                    // opt.Endpoint = new Uri("<grpc_endpoint>");
                    // opt.Headers = "Authentication=<token>";
                    // opt.Protocol = OtlpExportProtocol.Grpc;
                })
         );
    
    
    var app = builder.Build();
    
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    
    app.UseAuthorization();
    
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    
    // DiagnosticsConfig クラスを作成します。
    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);
    }
                                
  5. ターミナルで次のコマンドを実行して、プロジェクトを実行します。

    dotnet run

    コマンド出力の例:

    返された情報で URL を取得します。例:http://localhost:5107

    Building...
    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>
  6. ブラウザで http://localhost:5107 にアクセスします。次のページが表示された場合、トレースデータは Managed Service for OpenTelemetry コンソールに送信されています。

    返回页面

監視データを表示する

ARMS コンソール にログインします。左側のナビゲーションペインで、アプリケーション監視 > アプリケーション を選択します。[アプリケーション] ページで、アプリケーションの名前をクリックします。表示されるページで、トレースデータを表示します。

説明

image アイコンが言語列に表示されている場合、アプリケーションはApplication Monitoringに接続されています。ハイフン(-)が表示されている場合は、アプリケーションはManaged Service for OpenTelemetryに接続されています。