メインコンテンツまでスキップ

紹介

アーキテクチャ概要​

  1. プロファイラー(ネイティブ): Exem.DotNet.Profiler.so — CoreCLR Profiling API使用、IL Rewriting(Probe挿入)。
  2. Startup Hook (Managed bootstrap): Exem.DotNet.Startup.Hook.dll — プロセス初期化時にAgent assemblyロードを補助。(Exem.DotNet.Agent.dllのロード及びExem.DotNet.Agent.dllで使用する外部ライブラリのロード)
  3. 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など)。