.NET Application Insights SDK から Azure Monitor OpenTelemetry に移行する

このガイドでは、さまざまな .NET アプリケーションを Application Insights ソフトウェア開発キット (SDK) を使用して Azure Monitor OpenTelemetry に移行する手順について説明します。

Azure Monitor OpenTelemetry インストルメンテーションおよび Application Insights SDK と同様のエクスペリエンスが期待されます。 詳細と機能ごとの比較については、機能のリリース状態に関する記事を参照してください。

Application Insights の使用を開始していて、Classic API から移行する必要がない場合は、「Azure Monitor OpenTelemetry を有効にする」を参照してください。

前提条件

  • カスタマイズなしで Application Insights でインストルメント化された ASP.NET Core Web アプリケーション
  • アクティブにサポートされているバージョンの .NET

ヒント

製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。

Application Insights SDK を削除する

Note

これらの手順を続行する前に、アプリケーションの現在のバックアップがあることを確認する必要があります。

  1. NuGet パッケージの削除

    csproj から Microsoft.ApplicationInsights.AspNetCore パッケージを削除します。

    dotnet remove package Microsoft.ApplicationInsights.AspNetCore
    
  2. 初期化コードとカスタマイズの削除

    コードベース内の Application Insights 型への参照をすべて削除します。

    ヒント

    Application Insights パッケージを削除した後、アプリケーションをビルドし直して、削除する必要がある参照の一覧を取得できます。

    • 次の行を削除して、ServiceCollection から Application Insights を削除します。

      builder.Services.AddApplicationInsightsTelemetry();
      
    • appsettings.json から ApplicationInsights セクションを削除します。

      {
          "ApplicationInsights": {
              "ConnectionString": "<Your Connection String>"
          }
      }
      
  3. クリーンとビルド

    bin ディレクトリを調べて、Microsoft.ApplicationInsights.* へのすべての参照が削除されたことを検証します。

  4. アプリケーションのテスト

    アプリケーションに予期しない結果が生じないことを確認します。

ヒント

製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。

OpenTelemetry を有効にする

次の手順に従うときは、開発 リソースを作成し、その接続文字列を使用することをお勧めします。

Application Insights の概要と接続文字列を示すスクリーンショット。

移行が成功したことを確認した後、元のリソースにテレメトリを送信するように接続文字列を更新することを計画します。

  1. Azure Monitor Distro のインストール

    Azure Monitor Distro では、トレース、メトリック、ログ、例外を収集するための OpenTelemetry インストルメンテーション ライブラリを含めることで、自動テレメトリを有効にし、カスタム テレメトリを収集できます。

    Azure Monitor Distro をインストールすると、OpenTelemetry SDK が依存関係として使用されます。

    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
    
  2. OpenTelemetry と Azure Monitor の両方を追加して構成する

    OpenTelemery SDK は、ServiceCollection の一部として、アプリケーションの起動時に構成する必要があります。通常、これは Program.cs で行います。

    OpenTelemetry には、トレース、メトリック、ログという 3 つのシグナルの概念があります。 Azure Monitor Distro は、これらの各シグナルを構成します。

Program.cs

次のコード サンプルでは、基本的な使い方を示します。

using Azure.Monitor.OpenTelemetry.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // Call AddOpenTelemetry() to add OpenTelemetry to your ServiceCollection.
        // Call UseAzureMonitor() to fully configure OpenTelemetry.
        builder.Services.AddOpenTelemetry().UseAzureMonitor();

        var app = builder.Build();
        app.MapGet("/", () => "Hello World!");
        app.Run();
    }
}

環境変数に接続文字列を格納することをお勧めします。

APPLICATIONINSIGHTS_CONNECTION_STRING=<Your Connection String>

接続文字列を構成するためのその他のオプションについては、Application Insights 接続文字列の構成に関するページを参照してください。

ヒント

製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。

インストルメンテーション ライブラリのインストールと構成

インストルメンテーション ライブラリをプロジェクトに追加して、特定のコンポーネントまたは依存関係に関するテレメトリを自動収集できます。

Distro には、次のライブラリが含まれています。

インストルメンテーション ライブラリのカスタマイズ

Azure Monitor Distro には、ASP.NET CoreHttpClient、および SQLClient 用の .NET OpenTelemetry インストルメンテーションが含まれています。 OpenTelemetry API を使用して、これらのインストルメンテーションをカスタマイズしたり、独自に追加のインストルメンテーションを手動で追加したりできます。

インストルメンテーションをカスタマイズする方法の例をいくつか次に示します。

AspNetCoreTraceInstrumentationOptions のカスタマイズ
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(options =>
{
    options.RecordException = true;
    options.Filter = (httpContext) =>
    {
        // only collect telemetry about HTTP GET requests
        return HttpMethods.IsGet(httpContext.Request.Method);
    };
});
HttpClientTraceInstrumentationOptions のカスタマイズ
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<HttpClientTraceInstrumentationOptions>(options =>
{
    options.RecordException = true;
    options.FilterHttpRequestMessage = (httpRequestMessage) =>
    {
        // only collect telemetry about HTTP GET requests
        return HttpMethods.IsGet(httpRequestMessage.Method.Method);
    };
});
SqlClientInstrumentationOptions のカスタマイズ

SQLClient インストルメンテーションは、ベータ版の間はパッケージに組み込んで提供しています。 安定版がリリースされた際には、標準的なパッケージ参照として組み込む予定です。 それまでは、SQLClient インストルメンテーションをカスタマイズするために、OpenTelemetry.Instrumentation.SqlClient パッケージ参照をプロジェクトに追加し、そのパブリック API を使用します。

dotnet add package --prerelease OpenTelemetry.Instrumentation.SqlClient
builder.Services.AddOpenTelemetry().UseAzureMonitor().WithTracing(builder =>
{
    builder.AddSqlClientInstrumentation(options =>
    {
        options.SetDbStatementForStoredProcedure = false;
    });
});

Azure Monitor を構成する

Application Insights では、ApplicationInsightsServiceOptions を介してさらに多くの構成オプションが提供されています。

Application Insights Setting OpenTelemetry Alternative
AddAutoCollectedMetricExtractor 該当なし
ApplicationVersion リソースに "service.version" を設定する
ConnectionString 接続文字列の構成に関する記事で、手順をご覧ください。
DependencyCollectionOptions 該当なし。 依存関係をカスタマイズするには、適用可能なインストルメンテーション ライブラリで使用可能な構成オプションを確認します。
DeveloperMode 該当なし
EnableActiveTelemetryConfigurationSetup 該当なし
EnableAdaptiveSampling 該当なし。 固定レート サンプリングのみサポートされています。
EnableAppServicesHeartbeatTelemetryModule 該当なし
EnableAuthenticationTrackingJavaScript 該当なし
EnableAzureInstanceMetadataTelemetryModule 該当なし
EnableDependencyTrackingTelemetryModule トレースのフィルター処理の手順を参照してください。
EnableDiagnosticsTelemetryModule 該当なし
EnableEventCounterCollectionModule 該当なし
EnableHeartbeat 該当なし
EnablePerformanceCounterCollectionModule 該当なし
EnableQuickPulseMetricStream AzureMonitorOptions.EnableLiveMetrics
EnableRequestTrackingTelemetryModule トレースのフィルター処理の手順を参照してください。
EndpointAddress ConnectionString を使用します。
InstrumentationKey ConnectionString を使用します。
RequestCollectionOptions 該当なし。 OpenTelemetry.Instrumentation.AspNetCore オプションを参照してください。

カスタム構成の削除

次のシナリオは省略可能であり、上級ユーザーにのみ適用されます。

  • これ以上、テレメトリを手動で記録するために使用できる TelemetryClient への参照がある場合は、それらを削除する必要があります。

  • カスタム TelemetryProcessor または TelemetryInitializer の形式で カスタム フィルターまたはエンリッチメント を追加した場合は、削除する必要があります。 これらについては、ServiceCollection 内で見つけることができます。

    builder.Services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>();
    
    builder.Services.AddApplicationInsightsTelemetryProcessor<MyCustomTelemetryProcessor>();
    
  • JavaScript スニペットを削除する

    Application Insights .NET SDK によって提供されるスニペットを使用した場合は、そのスニペットも削除する必要があります。 削除する内容の完全なコード サンプルについては、Web アプリケーションのクライアント側テレメトリを有効にするガイドを参照してください。

    クライアント側のテレメトリを収集するために JavaScript SDK を追加した場合は、.NET SDK なしで動作し続けますが、削除することもできます。 削除する内容の完全なコード サンプルについては、JavaScript SDK のオンボード ガイドを確認してください。

  • Visual Studio Artifacts を削除する

    Visual Studio を使用して Application Insights にオンボードした場合は、プロジェクトに残っているファイルが増える可能性があります。

    • Properties/ServiceDependencies ディレクトリには、次の Application Insights リソースへの参照がある場合があります。

ヒント

製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。

よく寄せられる質問

このセクションは、テレメトリ初期化子またはプロセッサを使用するか、クラシック Application Insights API に対してカスタム コードを記述してカスタム テレメトリを作成するお客様を対象としています。

SDK API の OpenTelemetry 概念へのマップ方法

OpenTelemetry は、ベンダーに依存しない可観測性フレームワークです。 OpenTelemetry SDK またはライブラリに Application Insights API はありません。 移行する前に、OpenTelemetry の概念をいくつか理解しておくことが重要です。

  • Application Insights では、すべてのテレメトリは 1 つの TelemetryClientTelemetryConfiguration で管理されていました。 OpenTelemetry では、3 つのテレメトリ信号 (トレース、メトリック、ログ) のそれぞれに独自の構成があります。 外部ライブラリを使用せずに、.NET ランタイムを使用してテレメトリを手動で作成できます。 詳細については、分散トレースメトリック、およびログに関する .NET ガイドを参照してください。

  • Application Insights は TelemetryModules を使用して、アプリケーションのテレメトリを自動的に収集しました。 代わりに、OpenTelemetry では、インストルメンテーション ライブラリを使用して、特定のコンポーネント (要求に対する AspNetCore や依存関係に対する httpClient など) からテレメトリを収集します。

  • Application Insights は TelemetryInitializers を使用して、テレメトリを追加情報で強化したり、プロパティをオーバーライドしたりします。 OpenTelemetry を使用すると、プロセッサ を記述して、特定のシグナルをカスタマイズできます。 さらに、多くの OpenTelemetry インストルメンテーション ライブラリには、その特定のコンポーネントによって生成されるテレメトリをカスタマイズするための Enrich メソッドが用意されています。

  • Application Insights は、テレメトリをフィルター処理するために TelemetryProcessors を使用します。 OpenTelemetry プロセッサ を使用して、特定のシグナルにフィルター処理ルールを適用することもできます。

Application Insights テレメトリの種類を OpenTelemetry にマップする方法

次の表は、Application Insights データ型を OpenTelemetry の概念とその .NET 実装にマップします。

Azure Monitor テーブル Application Insights DataType OpenTelemetry DataType .NET の実装
customEvents EventTelemetry 該当なし 該当なし
customMetrics MetricTelemetry メトリック System.Diagnostics.Metrics.Meter
依存関係 DependencyTelemetry スパン (クライアント、内部、コンシューマー) System.Diagnostics.Activity
exceptions ExceptionTelemetry 例外 System.Exception
requests RequestTelemetry スパン (サーバー、プロデューサー) System.Diagnostics.Activity
traces TraceTelemetry ログ Microsoft.Extensions.Logging.ILogger

詳細については、次のドキュメントを参照してください。

Application Insights サンプリングの概念を OpenTelemetry にマップする方法

Application Insights にはサンプリングを構成するための複数のオプションが用意されていますが、Azure Monitor Exporter または Azure Monitor Distro では固定レート サンプリングのみが提供されます。 要求依存関係 (OpenTelemetry トレース) のみをサンプリングできます。

サンプリングを構成する方法の詳細なコード サンプルについては、サンプリングを有効にするガイドを参照してください

テレメトリ プロセッサと初期化子を OpenTelemetry にマップする方法

Application Insights .NET SDK で、テレメトリ プロセッサを使用してテレメトリをフィルター処理および変更または破棄します。 テレメトリ初期化子を使用して、カスタム プロパティを追加または変更します。 詳細については、Azure Monitor のドキュメントを参照してください。 OpenTelemetry は、これらの概念をアクティビティ プロセッサまたはログ プロセッサに置き換え、テレメトリを強化およびフィルター処理します。

トレースのフィルター処理

OpenTelemetry でテレメトリ データをフィルター処理するには、アクティビティ プロセッサを実装します。 この例は、Azure Monitor のドキュメントで説明されているテレメトリ データのフィルタリングに関する Application Insights の例と同等です。 この例では、失敗した依存関係の呼び出しがフィルター処理される場所を示します。

using System.Diagnostics;
using OpenTelemetry;

internal sealed class SuccessfulDependencyFilterProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (!OKtoSend(activity))
        {
            activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
        }
    }

    private bool OKtoSend(Activity activity)
    {
        return activity.Kind == ActivityKind.Client && activity.Status == ActivityStatusCode.Ok;
    }
}

このプロセッサを使用するには、AddAzureMonitorTraceExporter より先に TracerProvider を作成し、プロセッサを追加する必要があります。

using OpenTelemetry.Trace;

public static void Main()
{
    var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddProcessor(new SuccessfulDependencyFilterProcessor())
        .AddAzureMonitorTraceExporter()
        .Build();
}

ログのフィルタリング

ILogger の実装には、ログのフィルタリングを適用するための組み込みメカニズムがあります。 このフィルタリングにより、OpenTelemetryLoggerProvider などの、各登録済みプロバイダーに送信されるログを制御できます。 "OpenTelemetry" は、フィルター処理規則の構成に使用される、OpenTelemetryLoggerProvider エイリアス です。

次の例では、既定の LogLevel として "Error" を定義し、ユーザー定義カテゴリの最小 LogLevel として "警告" を定義します。 定義されているこれらの規則は、OpenTelemetryLoggerProvider にのみ適用されます。

builder.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Error);
builder.AddFilter<OpenTelemetryLoggerProvider>("MyProduct.MyLibrary.MyClass", LogLevel.Warning);

詳細については、ログに関する OpenTelemetry .NET ドキュメントを参照してください。

トレースへのカスタム プロパティの追加

OpenTelemetry では、アクティビティ プロセッサを使用して、テレメトリ データにより多くのプロパティを追加し、内容を充実させることができます。 これは、Application Insights におけるテレメトリ初期化子の使用に類似しており、そこでもテレメトリのプロパティを修正することができます。

既定では、Azure Monitor エクスポーターは応答コードが 400 以上の HTTP 要求を失敗として扱います。 ただし、400 を成功として扱いたい場合は、アクティビティを成功と設定し、さらにテレメトリ プロパティを追加するタグを付与するエンリッチメント アクティビティ プロセッサを追加できます。 これは、Azure Monitor のドキュメントで説明されている Application Insights の初期化子を使用したプロパティの追加や変更と類似しています。

カスタム プロパティを追加し、特定の応答コードの既定の動作をオーバーライドする方法の例を次に示します。

using System.Diagnostics;
using OpenTelemetry;

/// <summary>
/// Custom Processor that overrides the default behavior of treating response codes >= 400 as failed requests.
/// </summary>
internal class MyEnrichingProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (activity.Kind == ActivityKind.Server)
        {
            int responseCode = GetResponseCode(activity);

            if (responseCode >= 400 && responseCode < 500)
            {
                // If we set the Success property, the SDK won't change it
                activity.SetStatus(ActivityStatusCode.Ok);

                // Allow to filter these requests in the portal
                activity.SetTag("Overridden400s", "true");
            }

            // else leave the SDK to set the Success property
        }
    }

    private int GetResponseCode(Activity activity)
    {
        foreach (ref readonly var tag in activity.EnumerateTagObjects())
        {
            if (tag.Key == "http.response.status_code" && tag.Value is int value)
            {
                return value;
            }
        }

        return 0;
    }
}

このプロセッサを使用するには、AddAzureMonitorTraceExporter より先に TracerProvider を作成し、プロセッサを追加する必要があります。

using OpenTelemetry.Trace;

public static void Main()
{
    var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddSource("Company.Product.Name")
        .AddProcessor(new MyEnrichingProcessor())
        .AddAzureMonitorTraceExporter()
        .Build();
}

OpenTelemetry を使用してテレメトリを手動で追跡する方法

トレースの送信 - 手動

Application Insights のトレースは、RequestTelemetry および DependencyTelemetry として格納されます。 OpenTelemetry では、トレースは Activity クラスを使用して Span としてモデル化されます。

OpenTelemetry .NET は、.NET ランタイムの一部であるトレースに ActivitySource クラスと Activity クラスを利用します。 このアプローチが特徴的なのは、.NET 実装においてトレース API がランタイム自体に直接組み込まれていることです。 System.Diagnostics.DiagnosticSource パッケージを使用すると、開発者は ActivitySource を使用して Activity インスタンスを作成および管理できます。 このメソッドは、外部ライブラリに依存せずに .NET アプリケーションにトレースを追加し、.NET エコシステムの組み込み機能を適用するシームレスな方法を提供します。 詳細については、分散トレース インストルメンテーションのチュートリアルを参照してください。

手動トレースを移行する方法を次に示します。

Note

Application Insights では、ロール名とロール インスタンスをテレメトリごとのレベルで設定できます。 ただし、Azure Monitor Exporter では、テレメトリごとのレベルではカスタマイズできません。 ロール名とロール インスタンスは OpenTelemetry リソースから抽出され、すべてのテレメトリに適用されます。 詳細については、クラウド ロール名とクラウド ロール インスタンスの設定に関するドキュメントを参照してください。

DependencyTelemetry

Application Insights DependencyTelemetry は、送信要求をモデル化するために使用されます。 OpenTelemetry に変換する方法は次のとおりです。

Application Insights の例:

DependencyTelemetry dep = new DependencyTelemetry
{
   Name = "DependencyName",
   Data = "https://www.example.com/",
   Type = "Http",
   Target = "www.example.com",
   Duration = TimeSpan.FromSeconds(10),
   ResultCode = "500",
   Success = false
};

dep.Context.Cloud.RoleName = "MyRole";
dep.Context.Cloud.RoleInstance = "MyRoleInstance";
dep.Properties["customprop1"] = "custom value1";
client.TrackDependency(dep);

OpenTelemetry の例:

var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
  .SetResourceBuilder(resourceBuilder)
  .AddSource(activitySource.Name)
  .AddAzureMonitorTraceExporter()
  .Build();

// Emit traces
using (var activity = activitySource.StartActivity("DependencyName", ActivityKind.Client))
{
  activity?.SetTag("url.full", "https://www.example.com/");
  activity?.SetTag("server.address", "www.example.com");
  activity?.SetTag("http.request.method", "GET");
  activity?.SetTag("http.response.status_code", "500");
  activity?.SetTag("customprop1", "custom value1");
  activity?.SetStatus(ActivityStatusCode.Error);
  activity?.SetEndTime(activity.StartTimeUtc.AddSeconds(10));
}

RequestTelemetry

Application Insights RequestTelemetry は、受信要求をモデル化します。 OpenTelemetry に移行する方法は次のとおりです。

Application Insights の例:

RequestTelemetry req = new RequestTelemetry
{
   Name = "RequestName",
   Url = new Uri("http://example.com"),
   Duration = TimeSpan.FromSeconds(10),
   ResponseCode = "200",
   Success = true,
   Properties = { ["customprop1"] = "custom value1" }
};

req.Context.Cloud.RoleName = "MyRole";
req.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackRequest(req);

OpenTelemetry の例:

var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
  .SetResourceBuilder(resourceBuilder)
  .AddSource(activitySource.Name)
  .AddAzureMonitorTraceExporter()
  .Build();

// Emit traces
using (var activity = activitySource.StartActivity("RequestName", ActivityKind.Server))
{
  activity?.SetTag("url.scheme", "https");
  activity?.SetTag("server.address", "www.example.com");
  activity?.SetTag("url.path", "/");
  activity?.SetTag("http.response.status_code", "200");
  activity?.SetTag("customprop1", "custom value1");
  activity?.SetStatus(ActivityStatusCode.Ok);
}

カスタム操作の追跡

Application Insights で、StartOperation メソッドと StopOperation メソッドを使用してカスタム操作を追跡します。 OpenTelemetry .NET で ActivitySourceActivity を使用してこれを実現します。 ActivityKind.ServerActivityKind.Consumer を使用した操作の場合、Azure Monitor Exporter によって RequestTelemetry が生成されます。 ActivityKind.ClientActivityKind.Producer、および ActivityKind.Internal の場合、DependencyTelemetry が生成されます。 カスタム操作の追跡の詳細については、Azure Monitor のドキュメントを参照してください。 .NET で ActivitySourceActivity を使用する方法の詳細については、.NET 分散トレース インストルメンテーションのチュートリアルを参照してください。

カスタム操作のアクティビティを開始および停止する方法の例を次に示します。

using System.Diagnostics;
using OpenTelemetry;

var activitySource = new ActivitySource("Company.Product.Name");

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddSource(activitySource.Name)
    .AddAzureMonitorTraceExporter()
    .Build();

// Start a new activity
using (var activity = activitySource.StartActivity("CustomOperation", ActivityKind.Server))
{
    activity?.SetTag("customTag", "customValue");

    // Perform your custom operation logic here

    // No need to explicitly call Activity.Stop() because the using block automatically disposes the Activity object, which stops it.
}

ログの送信

Application Insights のログは、TraceTelemetry および ExceptionTelemetry として格納されます。

TraceTelemetry

OpenTelemetry では、ILogger インターフェイスを介してログ記録が統合されます。 TraceTelemetry を移行する方法は次のとおりです。

Application Insights の例:

TraceTelemetry traceTelemetry = new TraceTelemetry
{
   Message = "hello from tomato 2.99",
   SeverityLevel = SeverityLevel.Warning,
};

traceTelemetry.Context.Cloud.RoleName = "MyRole";
traceTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackTrace(traceTelemetry);

OpenTelemetry の例:

var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var loggerFactory = LoggerFactory.Create(builder => builder
   .AddOpenTelemetry(logging =>
   {
       logging.SetResourceBuilder(resourceBuilder);
       logging.AddAzureMonitorLogExporter();
   }));

// Create a new instance `ILogger` from the above LoggerFactory
var logger = loggerFactory.CreateLogger<Program>();

// Use the logger instance to write a new log
logger.FoodPrice("tomato", 2.99);

internal static partial class LoggerExtensions
{
    [LoggerMessage(LogLevel.Warning, "Hello from `{name}` `{price}`.")]
    public static partial void FoodPrice(this ILogger logger, string name, double price);
}
ExceptionTelemetry

Application Insights では、例外をログに記録するために ExceptionTelemetry が使用されます。 OpenTelemetry に移行する方法は次のとおりです。

Application Insights の例:

ExceptionTelemetry exceptionTelemetry = new ExceptionTelemetry(new Exception("Test exception"))
{
    SeverityLevel = SeverityLevel.Error
};

exceptionTelemetry.Context.Cloud.RoleName = "MyRole";
exceptionTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
exceptionTelemetry.Properties["customprop1"] = "custom value1";
client.TrackException(exceptionTelemetry);

OpenTelemetry の例:

var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var loggerFactory = LoggerFactory.Create(builder => builder
   .AddOpenTelemetry(logging =>
   {
       logging.SetResourceBuilder(resourceBuilder);
       logging.AddAzureMonitorLogExporter();
   }));

// Create a new instance `ILogger` from the above LoggerFactory.
var logger = loggerFactory.CreateLogger<Program>();

try
{
    // Simulate exception
    throw new Exception("Test exception");
}
catch (Exception ex)
{
    logger?.LogError(ex, "An error occurred");
}

メトリックの送信

Application Insights のメトリックは、MetricTelemetry として格納されます。 OpenTelemetry では、メトリックは System.Diagnostics.DiagnosticSource パッケージから Meter としてモデル化されます。

Application Insights には、事前集計 (TrackMetric()) 以外と事前集計 (GetMetric().TrackValue()) メトリック API の両方があります。 OpenTelemetry とは異なり、Application Insights には Instruments の概念はありません。 Application Insights には、すべてのメトリック シナリオで同じ API があります。

一方、OpenTelemetry では、ユーザーはまずメトリックの実際の意味に基づいて適切なメトリック インストルメントを選択する必要があります。 たとえば、何か (受信したサーバー要求の合計数など) をカウントする場合、OpenTelemetry Counter を使用する必要があります。 さまざまなパーセンタイル (サーバー待機時間の P99 値など) を計算する場合は、OpenTelemetry ヒストグラム インストルメントを使用する必要があります。 Application Insights と OpenTelemetry の基本的な違いにより、それらの間で直接的な比較は行われません。

Application Insights とは異なり、OpenTelemetry には、メトリックを強化またはフィルター処理するための組み込みのメカニズムは用意されていません。 Application Insights では、テレメトリ プロセッサと初期化子を使用してメトリックを変更または破棄できますが、この機能は OpenTelemetry では使用できません。

さらに、OpenTelemetry では、Application Insights の TrackMetric() 機能と同等の機能がないため、直接生のメトリックを送信することはできません。

Application Insights から OpenTelemetry への移行には、すべての Application Insights メトリック API の使用状況を OpenTelemetry API に置き換える必要があります。 さまざまな OpenTelemetry Instruments とそのセマンティクスを理解する必要があります。

ヒント

ヒストグラムは最も汎用性が高く、Application Insights GetMetric().TrackValue() API と最も近いものです。 Application Insights メトリック API をヒストグラムに置き換えて、同じ目的を達成できます。

その他のテレメトリの種類

CustomEvents

OpenTelemetry ではサポートされていません。

Application Insights の例:

TelemetryClient.TrackEvent()
AvailabilityTelemetry

OpenTelemetry ではサポートされていません。

Application Insights の例:

TelemetryClient.TrackAvailability()
PageViewTelemetry

OpenTelemetry ではサポートされていません。

Application Insights の例:

TelemetryClient.TrackPageView()

コンソールおよびワーカー サービス アプリケーションのライブ メトリックを取得できますか?

ライブ メトリックを含まないコンソールおよびワーカー サービス アプリケーションには、Azure Monitor OpenTelemetry Exporter をお勧めします。

次のステップ

ヒント

製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。

サポート