.NET Application Insights SDK から Azure Monitor OpenTelemetry に移行する
このガイドでは、さまざまな .NET アプリケーションを Application Insights ソフトウェア開発キット (SDK) を使用して Azure Monitor OpenTelemetry に移行する手順について説明します。
Azure Monitor OpenTelemetry インストルメンテーションおよび Application Insights SDK と同様のエクスペリエンスが期待されます。 詳細と機能ごとの比較については、機能のリリース状態に関する記事を参照してください。
- Azure Monitor OpenTelemetry Distro への ASP.NET Core の移行。 (
Azure.Monitor.OpenTelemetry.AspNetCore
NuGet パッケージ) - Azure Monitor OpenTelemetry Exporter への ASP.NET、コンソール、および WorkerService の移行。 (
Azure.Monitor.OpenTelemetry.Exporter
NuGet パッケージ)
Application Insights の使用を開始していて、Classic API から移行する必要がない場合は、「Azure Monitor OpenTelemetry を有効にする」を参照してください。
前提条件
- カスタマイズなしで Application Insights でインストルメント化された ASP.NET Core Web アプリケーション
- アクティブにサポートされているバージョンの .NET
ヒント
製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。
Application Insights SDK を削除する
Note
これらの手順を続行する前に、アプリケーションの現在のバックアップがあることを確認する必要があります。
NuGet パッケージの削除
csproj
からMicrosoft.ApplicationInsights.AspNetCore
パッケージを削除します。dotnet remove package Microsoft.ApplicationInsights.AspNetCore
初期化コードとカスタマイズの削除
コードベース内の Application Insights 型への参照をすべて削除します。
ヒント
Application Insights パッケージを削除した後、アプリケーションをビルドし直して、削除する必要がある参照の一覧を取得できます。
次の行を削除して、
ServiceCollection
から Application Insights を削除します。builder.Services.AddApplicationInsightsTelemetry();
appsettings.json
からApplicationInsights
セクションを削除します。{ "ApplicationInsights": { "ConnectionString": "<Your Connection String>" } }
クリーンとビルド
bin ディレクトリを調べて、
Microsoft.ApplicationInsights.*
へのすべての参照が削除されたことを検証します。アプリケーションのテスト
アプリケーションに予期しない結果が生じないことを確認します。
ヒント
製品グループは、このドキュメントに関するフィードバックを積極的に求めています。 otel@microsoft.com にフィードバックを提供するか、「サポート」セクションを参照してください。
OpenTelemetry を有効にする
次の手順に従うときは、開発 リソースを作成し、その接続文字列を使用することをお勧めします。
移行が成功したことを確認した後、元のリソースにテレメトリを送信するように接続文字列を更新することを計画します。
Azure Monitor Distro のインストール
Azure Monitor Distro では、トレース、メトリック、ログ、例外を収集するための OpenTelemetry インストルメンテーション ライブラリを含めることで、自動テレメトリを有効にし、カスタム テレメトリを収集できます。
Azure Monitor Distro をインストールすると、OpenTelemetry SDK が依存関係として使用されます。
dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
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 Core、HttpClient、および 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 つの
TelemetryClient
とTelemetryConfiguration
で管理されていました。 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 |
詳細については、次のドキュメントを参照してください。
- Azure Monitor Application Insights のデータ収集の基本
- Application Insights Telemetry のデータ モデル
- OpenTelemetry Concepts
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 で ActivitySource
と Activity
を使用してこれを実現します。 ActivityKind.Server
と ActivityKind.Consumer
を使用した操作の場合、Azure Monitor Exporter によって RequestTelemetry
が生成されます。 ActivityKind.Client
、ActivityKind.Producer
、および ActivityKind.Internal
の場合、DependencyTelemetry
が生成されます。 カスタム操作の追跡の詳細については、Azure Monitor のドキュメントを参照してください。 .NET で ActivitySource
と Activity
を使用する方法の詳細については、.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 にフィードバックを提供するか、「サポート」セクションを参照してください。
サポート
- Azure サポートの問題については、Azure サポート チケットを開いてください。
- OpenTelemetry の問題については、OpenTelemetry .NET コミュニティに直接問い合わせてください。
- Azure Monitor Exporter に関連する未解決の問題の一覧については、GitHub のイシュー ページを参照してください。