ASP.NET Core アプリケーションにおいて、業界標準の分散トレーシング技術である OpenTelemetry を活用し、Azure Monitor (Application Insights) へ効率的かつ最適化されたテレメトリを送信する実装例です。
単なるライブラリの導入にとどまらず、実運用を見据えた「ログのノイズ除去」「パフォーマン最適化」「分散トレーシングのタグ継承」などのカスタム実装を行っています。
- ハイブリッドな計装 (Instrumentation)
MySqlConnectorによるデータベース通信の自動計装。ActivitySourceを用いた、ビジネスロジック(ユースケース)単位の手動計装。
- コストと分析効率を最適化するカスタム Processor
PollingNoiseFilterProcessor: 変更がなかった不要なポーリング処理や付随するDBアクセスログを動的に破棄し、Azure Monitorのログ料金高騰を防ぎます。HealthCheckFilterProcessor: ヘルスチェックエンドポイント(/health)の無駄なトレースを除外します。BlazorFilterProcessor: Blazor特有の内部通信パスを整理し、分析時のノイズを低減します。
- 分散トレーシングのタグ自動継承
TagInheritanceProcessor: 親アクティビティ(コントローラーなど)で付与したenduser.idなどの情報を、子アクティビティ(DB通信など)へ自動的に伝播させ、ユーザーごとの一連の行動追跡を容易にします。
- ゼロ・アロケーションロジック (
[LoggerMessage])- C# のソースジェネレーターを活用し、ボクシングやメモリアロケーションを発生させない高速なログ出力を実装しています。
- C# / .NET 10
- ASP.NET Core MVC
- OpenTelemetry .NET
- Azure.Monitor.OpenTelemetry.AspNetCore
- MySqlConnector
Program.cs: OpenTelemetryプロバイダーの構成と、各カスタムProcessorの登録。Traces/AppDiagnostics.cs: アプリケーション独自のActivitySourceの定義。Traces/*Processor.cs: トレースの開始/終了時に介入するカスタムフィルター群。Controllers/HomeController.cs:Activityの生成および[LoggerMessage]を用いた計装の実装例。
このプロジェクトをローカルで実行し、Azure Monitorでログを確認するには以下の設定が必要です。
- リポジトリをクローンします。
- Azure ポータルで Application Insights のリソースを作成し、「接続文字列 (Connection String)」を取得します。
- プロジェクトのルートに
appsettings.Development.jsonを作成(または編集)し、以下の設定を追加します。
{
"AzureMonitor": {
"ConnectionString": "YOUR_CONNECTION_STRING_HERE"
},
"AppSettings": {
"LogOutput": true
}
}