ASP.NET (.NET Framework) 製アプリをリビルドせずにOpenTelemetryで計測しよう

3.5K Views

February 24, 23

スライド概要

profile-image

New Relic株式会社、Technical Support Manager.

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

ASP.NET (.NET Framework) 製アプリを リビルドせずに OpenTelemetryで計測しよう 【オンライン】2023年! C# Tokyo イベント 2023/02/24 @tanaka̲733

2.

自己紹介: @tanaka̲733 ◦ New Relic K.K. テクニカルサポートマネージャー ◦ C# Tokyo運営メンバー ◦ Microsoft MVP for Development Technologies ◦ Microsoft Certified Cloud Solution Architect Expert ◦ Certified Kubernetes Administrator & Application Developer (CKA/CKAD)

3.

今日の目的 まだまだ現役のASP.NET (.NET Framework)アプリだが 継続的に運用するにはオブザーバビリティの獲得が必要 ◦ 予算が少なめ è 有償サービスの導入にハードルあり ◦ OSSなツール類の対応が後回しにされがち ◦ コード変更に対して消極的 それら課題を克服できるOpenTelemetryの自動計装ツールを紹介します

4.

今日の流れ ◦ 自動計装ツールが必要な背景 ◦ ツールの導入手順 ◦ デモ ◦ 現時点の制約など ◦ 自動計装ツールを支える技術

5.

オブザーバビリティの必要性 アプリケーション(サービス)に問題が起きているか、なぜ起きているかを把握したい è 把握する必要ないというケースはレア。コストとメリットのバランス ベンダーならNew Relic、Azure Monitor、AWS CloudWatch、などなど オープンな規格としては、CNCFの1つのOpenTelemetry 最新の.NET (いわゆる.NET Core)対応ばかりではないか? .NET Framework製のアプリも監視したい! 予算も限られているのでまずは最低限の費用で始めたい!!

6.

オープンな標準: OpenTelemetry ベンダー ニュートラル 単一のベンダーに 依存しない 普遍性 end to endの実装 将来性 さまざまな言語、 フレームワークに対応 データの生成から、収集、 処理、送信まで対応 進化する標準 活発なOSSプロジェクト

7.

OpenTelemeryを導入するには Grafana, New Relic などのバックエンド アプリ (C#) OTel SDK Collector (Agent) Instrumentation Collector (Gateway) 7

8.

OpenTelemeryを導入するには(基本形) アプリ (C#) データ送信は いずれかの方法 OTel SDK Collector (Gateway) Collector (Agent) Instrumentation SDKを組み込んで データ取得・送信の コードを追加 Grafana, New Relic などのバックエンド データ加工などの 目的で Collectorを経由 データの保管・ 可視化は 別サービスを利用 8

9.

コード変更したくない(できない)! 監視はしたい。 が、監視のためにアプリのコードを修正する許可がでない。 リビルドすら厳しい。

10.

opentelemetry-dotnetinstrumentation ソースコードの編集なしにOpenTelemetryの計装を可能にするツール 現在0.6.0-beta2 でプレリリース状態 .NET Framework、.NET (Core)に対応

11.

自動計装を利用した導入 アプリ (C#) データ送信も も柔軟に選択可能 Grafana, New Relic などのバックエンド instrumentation Collector (Agent) Instrumentation アプリのバイナリ は変更不要 Collector (Gateway) 11

12.

自動計装の方法 (ASP.NET on IIS) 1. opentelemetry-dotnet-instrumentationのバイナリを アプリと同じホスト上に配置 2. IISにopentelemetry-dotnet-instrumentationが提供するHTTP moduleを配置 3. アプリのプロセスに環境変数を設定 プロセス単位で設定する都合上、 ApplicationPool単位の環境変数が設定できるIIS10以降必須 IIS10未満では、ApplicationPoolの実行ユーザーをWindowsユーザーにし、 ユーザー環境変数を設定するなどで対応可能。

13.

実際の導入手順1 GitHubのreleasesページから最新版をダウンロードする ◦ https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases ◦ 具体的な手順はダウンロードしたバージョンのドキュメントを参照するようにする ◦ 指定すべき環境変数などに違いがあります ◦ 2023/2/22時点では、Web.configでの設定が利用できる 0.6.0-beta2がおすすめ ダウンロードしたzipファイルを展開し、計測対象のアプリが動くホスト上に配置 ◦ 配置場所は任意だが、稼働させる間はずっとその場所に配置しておく必要あり

14.

実際の導入手順2 TelemetryHttpModuleをHTTP ModuleとしてIISに追加 https://github.com/open-telemetry/opentelemetry-dotnetinstrumentation/blob/main/docs/iis-instrumentation.md applicationHost.configですべてのWebサイトに追加する例

15.

実際の導入手順3 計測対象のApplicationPoolごとに必要な環境変数を設定する https://github.com/open-telemetry/opentelemetry-dotnetinstrumentation/blob/main/docs/config.md applicationHost.configでの設定例

16.

(参考)設定値の意味 OTEL̲SERVICE̲NAME、OTEL̲RESOURCE̲ATTRIBUTES: アプリの名前・属性 COR̲ENABLE̲PROFILING、COR̲PROFILER: 固定値 COR̲PROFILER̲PATH̲32などのパス: インストール先のパス OTEL̲EXPORTER̲OTLP̲ENDPOINT: OTEL形式でのエクスポート先のURL (サポートされるエクスポート形式や送信先はドキュメント参照) OTEL̲EXPORTER̲OTLP̲HEADERS: OTEL形式でのエクスポート時のHTTPヘッダー(認証など)

17.

実際の導入手順4 (オプション) アプリ固有の設定値(アプリ名など)はWeb.configでも設定可能

18.

DEMO

22.

現時点の制約など ◦ MVC、API、WCFに対応 ◦ Webformsや独自フレームワークは非対応 ◦ 自動計装と追加での手動計装の組み合わせは不可 ◦ 別物ととして計測・収集される ◦ ASP.NET MVCにおいて転送されたSpanの名前がすべて同一になる ◦ 自動計装側ではなくて、ライブラリごとに対応している実装の問題らしい ◦ トレースの識別が困難だが http.target属性で実際の値は取得できているのである程度回避は可能 ◦ 同じアプリケーションプールで複数のWebサイトの構成で、 Web.configによる設定が不安定? ◦ https://github.com/open-telemetry/opentelemetry-dotnetinstrumentation/pull/2066 で解消したがまだ動作しないことがありそう

23.

自動計装を支える技術 https://github.com/open-telemetry/opentelemetry-dotnetinstrumentation/blob/main/docs/design.md CLR Profiler API: 実行中にコードを変更できる.NET RuntimeのAPI なお、.NET CoreではHost startup hookを利用して、アプリコードの実行前に計装の 初期化を行なっている

25.

ライブラリの計装手段 ソースコードによる計装 ◦ ASP.NET CoreやHTTPClientのようなOpenTelemetryの計装を実装済みのライブラリにつ いてはAPIフックやコールバックにより計測が可能になります バイトコードによる計装 ◦ LoggerなどサポートされていないライブラリについてはILコードを変更することで 計装を可能にしています

26.

おわり 桃浜@アドベンチャーワールド 2023/02/19