アクティビティ

このトピックでは、Windows Communication Foundation (WCF) トレース モデルでのアクティビティのトレースについて説明します。 アクティビティは、ユーザーがエラーの範囲を絞り込む上で役立つ処理単位です。 同じアクティビティで発生したエラーは直接関連します。 たとえば、メッセージを復号化できなかったために、ある操作が失敗したとします。 この操作とメッセージ復号化失敗のトレースは同じアクティビティ内に表示され、復号化エラーと要求エラー間の直接相関関係が示されます。

アクティビティ トレースの構成

WCF には、アプリケーションを処理するための定義済みアクティビティが用意されています (「アクティビティ リスト」を参照してください)。 また、ユーザー トレースをグループ化するために、アクティビティをプログラムによって定義することもできます。 詳細については、「ユーザー コード トレースの出力」を参照してください。

実行時にアクティビティ トレースを出力するには、次の構成コードに示すように、System.ServiceModel トレース ソースや、他の WCF トレース ソースまたはカスタム トレース ソースの ActivityTracing 設定を使用します。

<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">  

使用する構成要素と属性の詳細については、「トレースの構成」を参照してください。

アクティビティの表示

アクティビティとそのユーティリティは、サービス トレース ビューアー ツール (SvcTraceViewer.exe) で表示できます。 ActivityTracing が有効な場合、このツールはトレースを取得し、アクティビティに基づいて並べ替えます。 トレース転送を表示することもできます。 トレース転送は、さまざまなアクティビティが相互にどのように関連しているかを示します。 これにより、特定のアクティビティによって別のアクティビティが開始されたことを確認できます。 たとえば、Secure Conversation トークンを取得するために、あるメッセージ要求によってセキュリティ ハンドシェイクが開始されたことを確認できます。

サービス トレース ビューアーでのアクティビティの関連付け

次のように、サービス トレース ビューアー ツールには、アクティビティの 2 つのビューが用意されています。

  • リスト ビュー: アクティビティ ID を使用して、プロセス全体にわたり、トレースを直接関連付けます。 異なるプロセス (クライアントとサービスなど) のトレースであっても、同じアクティビティ ID を持つトレースは、同じアクティビティにグループ化されます。 したがって、サービスで発生したエラーによってクライアントでエラーが発生した場合、ツールの同じアクティビティ ビューに両方のエラーが表示されることになります。

  • グラフ ビュー: アクティビティは、プロセスごとにグループ化されます。 このビューでは、クライアントとサービスのトレースは、アクティビティ ID が同じであっても、異なるアクティビティに表示されます。 アクティビティ ID は同じであるが、異なるプロセスに含まれるアクティビティを相互に関連付けるために、このツールでは、関連するアクティビティ間のメッセージ フローが示されます。

詳細およびサービス トレース ビューアー ツールのグラフィック表示については、「サービス トレース ビューアー ツール (SvcTraceViewer.exe)」および「サービス トレース ビューアーを使用した相関トレースの表示とトラブルシューティング」を参照してください。

アクティビティ スコープの定義

アクティビティはデザイン時に定義され、作業の論理単位を表します。 同じアクティビティ識別子を使用して出力されたトレースは直接関連し、同じアクティビティに含まれます。 アクティビティはエンドポイントの境界を越えることができるため (要求など)、アクティビティには 2 つのスコープが定義されています。

  • Global スコープ (アプリケーションごと)。 このスコープでは、アクティビティは 128 ビットの、グローバルに一意なアクティビティ識別子 (gAId) によって識別されます。 gAId は、エンドポイント全体にわたって伝達されます。

  • Local スコープ (エンドポイントごと)。 このスコープでは、アクティビティは、gAId、アクティビティ トレースを出力するトレース ソース名、およびプロセス ID によって識別されます。この 3 つの組み合わせによって、ローカル アクティビティ ID (lAId) が構成されます。 lAId は、アクティビティの (ローカル) 境界の定義に使用されます。

トレース スキーマ

トレースはスキーマを使用して Microsoft プラットフォーム間で出力できます。 "e2e" ("エンド ツー エンド" の略) は、一般に使用されるスキーマです。 このスキーマには、128 ビット識別子 (gAId)、トレース ソース名、およびプロセス ID が含まれます。 マネージド コードでは、XmlWriterTraceListener が e2e スキーマでトレースを出力します。

開発者は、スレッド ローカル ストレージ (TLS) の GUID を使用して ActivityId プロパティを設定することにより、トレースで出力する AID を設定できます。 次に例を示します。

// set the current Activity ID to a new GUID.  
CorrelationManager.ActivityId = Guid.NewGuid();  

次の例に示すように、トレース ソースを使用してトレースを出力すると、TLS での gAId の設定が明確に示されます。

TraceSource traceSource = new TraceSource("myTraceSource");  
traceSource.TraceEvent(TraceEventType.Warning, eventId, "Information");  

出力されるトレースには、TLS の現在の gAId、トレース ソースのコンストラクターにパラメーターとして渡されるトレース ソース名、および現在のプロセスの ID が含まれます。

アクティビティの有効期間

最も厳密な意味では、アクティビティの形跡は、出力されたトレースでアクティビティ ID が初めて使用されたときに始まり、出力されたトレースでアクティビティ ID が最後に使用されたときに終わります。 System.Diagnostics には、定義済みのトレースの種類のセットが用意されています。これは、アクティビティの有効期間の境界を明示的にマークするための Start トレースと Stop トレースを含みます。

  • Start: アクティビティの開始を示します。 "Start" トレースは、新しい処理マイルストーンの開始を記録します。 このトレースには、特定のプロセスの特定のトレース ソースに使用される新しいアクティビティ ID が含まれます。ただし、エンドポイント間でアクティビティ ID が伝達される場合を除きます (この場合は、エンドポイントごとに 1 つの "Start" トレースが表示されます)。 新しいアクティビティの開始の例として、新しい処理スレッドの作成や、新しいパブリック メソッドの入力などがあります。

  • Stop: アクティビティの終了を示します。 "Stop" トレースは、既存の処理マイルストーンの終了を記録します。 このトレースには、特定のプロセスの特定のトレース ソースに使用される既存のアクティビティ ID が含まれます。ただし、エンドポイント間でアクティビティ ID が伝達される場合を除きます (この場合は、エンドポイントごとに 1 つの "Stop" トレースが表示されます)。 アクティビティの停止の例として、処理スレッドの終了や、"Start" トレースによって開始が示されたメソッドの終了などがあります。

  • Suspend : アクティビティの処理の中断を示します。 "Suspend" トレースには、後で処理を再開することが予想される既存のアクティビティ ID が含まれます。 中断イベントと再開イベントの間に、現在のトレース ソースからこの ID を使用してトレースが出力されることはありません。 中断の例として、外部ライブラリ関数の呼び出し時、または I/O 完了ポートなどのリソースで待機する際のアクティビティの一時停止などがあります。

  • Resume: アクティビティの処理の再開を示します。 "Resume" トレースには、現在のトレース ソースから最後に出力されたトレースが "Suspend" トレースであった既存のアクティビティ ID が含まれます。 再開の例として、外部ライブラリ関数の呼び出しからの復帰や、I/O 完了ポートなどのリソースによって処理の再開が通知された場合などがあります。

  • Transfer: アクティビティの中には、他のアクティビティによって発生するものや、他のアクティビティに関連するものがあるため、"Transfer" トレースを使用してアクティビティを他のアクティビティに関連付けることができます。 転送により、アクティビティ間の直接の関係が記録されます。

Start トレースと Stop トレースは、関連付けにとっては重要ではありません。 ただし、これらのトレースは、パフォーマンスの向上、プロファイリング、およびアクティビティ スコープの検証に役立ちます。

同じアクティビティの直接関連するイベントを検出するときや、転送トレースを追跡する場合に関連アクティビティのイベントを検出するときに、ツールはこれらのトレースを使用して、トレース ログのナビゲーションを最適化することができます。 たとえば、ツールが Start/Stop トレースを確認したときに、特定のアクティビティのログの解析を中止できます。

Start/Stop トレースは、プロファイリングに使用することもできます。 開始マーカーと終了マーカーの間で使用されるリソースは、論理アクティビティを含むアクティビティの包括的時間を表します。 Suspend トレースから Resume トレースまでの時間間隔を減算することで、アクティビティの実際の時間がわかります。

また、Stop トレースは、実装済みのアクティビティのスコープを検証する際に特に役立ちます。 特定のアクティビティ内ではなく Stop トレースの後に出現する処理トレースがある場合、これはコードの欠陥を示している可能性があります。

アクティビティ トレースを使用するためのガイドライン

ActivityTracing トレース (Start、Stop、Suspend、Resume、および Transfer) を使用する際のガイドラインを以下に示します。

  • トレースは、ツリーではなく循環有向グラフです。 あるアクティビティを発生させたアクティビティに制御を戻すことができます。

  • アクティビティは処理の境界を示します。処理の境界は、システム管理者にとって重要であり、サポートを容易にする上でも役立ちます。

  • WCF の各メソッド (クライアントとサーバーの両方) は、新しいアクティビティを開始し、(処理の終了後に) その新しいアクティビティを終了した後、アンビエント アクティビティに戻ることによって境界が設定されます。

  • 接続のリッスンやメッセージの待機など、長時間にわたって実行される (継続中の) アクティビティは、対応する開始マーカーと終了マーカーによって表されます。

  • メッセージの受信または処理によって起動されるアクティビティは、トレースの境界によって表されます。

  • アクティビティはアクティビティを表します。オブジェクトとは限りません。 アクティビティは、"~のときに 。 。 (有効なトレース出力が発生したときに) これが発生していた" と解釈する必要があります。

関連項目