紹介
アーキテクチャ概要
- プロファイラー(ネイティブ):
Exem.DotNet.Profiler.so— CoreCLR Profiling API使用、IL Rewriting(Probe挿入)。 - Startup Hook (Managed bootstrap):
Exem.DotNet.Startup.Hook.dll— プロセス初期化時にAgent assemblyロードを補助。(Exem.DotNet.Agent.dllのロード及びExem.DotNet.Agent.dllで使用する外部ライブラリのロード) - Managed Agent:
Exem.DotNet.Agent.dll—XmBridge、XmNetAgentなど収集・加工・送信ロジックを実行。
プロセスフロー: プロセス開始 → Profilerロード及びICorProfilerCallbackイベント購読(メソッドweave準備) → Startup Hook実行 → JITコンパイル時点でICorProfilerCallback呼び出しによるIL Rewrite (メソッドweave) → アプリケーションプロセス開始 → モニタリング対象メソッドの最初の呼び出し時にExem.DotNet.Agent.dllをロード
サポート環境
- Linux環境で動作する.NET 6.0以上のASP.NET Core (Kestrelサーバー)アプリケーション
主要環境変数 (必須)
CORECLR_ENABLE_PROFILING=1— Profiling有効化(なければProfiler未ロード)。CORECLR_PROFILER={GUID}— Profiler識別子(CLSID)。EXEM_DOTNET_HOME=/.../exem/dotnet— DotNet Agentルート(設定/ログ/dll探索基準)。CORECLR_PROFILER_PATH=/.../Exem.DotNet.Profiler.so— ネイティブProfilerパス。DOTNET_STARTUP_HOOKS=/.../Exem.DotNet.Startup.Hook.dll— Startup Hookパス。EXEM_DOTNET_PROFILE_TARGET_PROCESS=<app>.dll— プロファイリング対象プロセスの明示(または実行引数検査)。EXEM_DOTNET_DEBUG2=true— デバッグログ有効化(選択)。
DLL探索/解決(Resolver)動作
- Profilerの主な役割はCoreCLRイベントを受け取りILを修正してメソッド呼び出しを挿入すること
- Profilerが直接managed assemblyをロードしないため、メソッドが呼び出される際に
Exem.DotNet.Agent.dll及び依存DLLを別途探してロードする仕組みが必要 - Startup Hook及びAgent内部resolverは、基本ロード失敗時に以下のパスを順番に探索:
$EXEM_DOTNET_HOME/binary/{AssemblyName}.dll$EXEM_DOTNET_HOME/binary/libs/{AssemblyName}.dll
動作原理
- IL Rewrite: Profilerがメソッド IL を修正して
XmBridge.TraceEnter*、TraceLeave*、TraceThrow*呼び出しを挿入。これによりメソッドの開始/終了/例外時点を追跡。 - Probe → XmBridge → Handler: Probeが呼び出されると
XmBridgeが現在収集可能な状態かを検査した後、適切なhandlerに分岐(Txn、SQL、Exception、RemoteCallなど)。 - 送信:
XmNetAgentが周期的な送信taskを管理し、Collectorにパケットを送信(パケット構造:XmTcpReqAgentInfo、XmTcpWasStatなど)。