このトピックでは、Windows Communication Foundation (WCF) トレース モデルのアクティビティ トレースについて説明します。 アクティビティは、ユーザーが障害の範囲を絞り込むのに役立つ処理単位です。 同じアクティビティで発生したエラーは直接関連しています。 たとえば、メッセージの暗号化解除が失敗したため、操作は失敗します。 操作とメッセージの暗号化解除エラーの両方のトレースが同じアクティビティに表示され、復号化エラーと要求エラーの直接的な相関関係が示されます。
アクティビティ トレースの構成
WCF は、アプリケーションを処理するための定義済みのアクティビティを提供します ( 「アクティビティリスト」を参照)。 アクティビティをプログラムで定義して、ユーザー トレースをグループ化することもできます。 詳細については、「 User-Code トレースの出力」を参照してください。
実行時にアクティビティ トレースを出力するには、次の構成コードに示すように、ActivityTracing
トレース ソースまたはその他の WCF またはカスタム トレース ソースのSystem.ServiceModel
設定を使用します。
<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
使用されている構成要素と属性の詳細については、「 トレースの構成」 トピックを参照してください。
アクティビティの表示
アクティビティとそのユーティリティは、 サービス トレース ビューアー ツール (SvcTraceViewer.exe) で表示できます。 ActivityTracing が有効になっている場合、このツールはトレースを取得し、アクティビティに基づいて並べ替えます。 トレース転送を確認することもできます。 トレース転送は、さまざまなアクティビティが相互にどのように関連しているかを示します。 特定の活動が別の活動を開始させたことが確認できます。 たとえば、メッセージ要求がセキュリティハンドシェイクを開始して、セキュリティで保護された会話トークンを取得したとします。
サービス トレース ビューアーでのアクティビティの関連付け
サービス トレース ビューアー ツールには、アクティビティの 2 つのビューが用意されています。
リスト ビュー。アクティビティ ID を使用して、プロセス間でトレースを直接関連付けます。 クライアントやサービスなど、さまざまなプロセスからのトレースが、同じアクティビティ ID を持つトレースは、同じアクティビティにグループ化されます。 そのため、クライアントでエラーを引き起こすサービスで発生したエラーは、両方ともツールの同じアクティビティ ビューに表示されます。
アクティビティ がプロセス別にグループ化されたグラフ ビュー。 このビューでは、同じアクティビティ ID を持つクライアントとサービスのトレースが異なるアクティビティに含まれます。 さまざまなプロセスでアクティビティを同じアクティビティ ID に関連付けるために、このツールは関連するアクティビティ間のメッセージ フローを表示します。
詳細およびサービス トレース ビューアー ツールのグラフィカル ビューを表示するには、「 サービス トレース ビューアー ツール (SvcTraceViewer.exe) 」および「関連トレースの 表示とトラブルシューティングのためのサービス トレース ビューアーの使用」を参照してください。
アクティビティのスコープの定義
アクティビティはデザイン時に定義され、作業の論理単位を表します。 同じアクティビティ識別子を持つ出力トレースは直接関連しており、同じアクティビティの一部です。 アクティビティはエンドポイントの境界 (要求) を超えることができるため、アクティビティの 2 つのスコープが定義されます。
Global
スコープ (アプリケーションごと)。 このスコープでは、アクティビティは 128 ビットのグローバル一意のアクティビティ識別子 gAId によって識別されます。 gAid は、エンドポイント間で伝達されるものです。Local
スコープ、エンドポイントごと。 このスコープでは、アクティビティは、アクティビティ トレースとプロセス ID を出力するトレース ソース名と共に、その gAId によって識別されます。このトリプレットは、ローカル アクティビティ ID lAId を構成します。 lAId は、アクティビティの (ローカル) 境界を定義するために使用されます。
トレース スキーマ
トレースは、任意のスキーマを使用して、および Microsoft プラットフォーム全体で出力できます。 "e2e" ("End to End" の場合) は、一般的に使用されるスキーマです。 このスキーマには、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 が初めて使用されるときに開始され、出力されたトレースで最後に使用された時刻を終了します。 アクティビティの有効期間の境界を明示的にマークするために、定義済みのトレースの種類のセットが、start や Stop などの System.Diagnosticsによって提供されます。
開始: アクティビティの開始を示します。 「開始」トレースは、新しい処理のマイルストーン開始を記録するものです。 これには、特定のプロセス内の特定のトレース ソースの新しいアクティビティ ID が含まれています。ただし、アクティビティ ID がエンドポイント間で伝達される場合を除き、エンドポイントごとに 1 つの "開始" が表示されます。 新しいアクティビティを開始する例としては、処理用の新しいスレッドの作成や、新しいパブリック メソッドの入力などがあります。
停止: アクティビティの終了を示します。 "停止" トレースは、既存の処理マイルストーンを終了するレコードを提供します。 これには、特定のプロセス内の特定のトレース ソースの既存のアクティビティ ID が含まれています。ただし、アクティビティ ID がエンドポイント間で伝達される場合を除き、エンドポイントごとに 1 つの "停止" が表示されます。 アクティビティを停止する例としては、処理スレッドの終了や、先頭が "Start" トレースで示されたメソッドの終了などがあります。
中断: アクティビティの処理の中断を示します。 "Suspend" トレースには、後で処理が再開される予定の既存のアクティビティ ID が含まれています。 現在のトレース ソースからの Suspend イベントと Resume イベントの間に、この ID を持つトレースは生成されません。 たとえば、外部ライブラリ関数を呼び出すときや、I/O 完了ポートなどのリソースを待機しているときにアクティビティを一時停止する場合などです。
再開: アクティビティの処理の再開を示します。 "再開" トレースには、現在のトレース ソースから最後に出力されたトレースが "中断" トレースであった既存のアクティビティ ID が含まれています。 たとえば、外部ライブラリ関数の呼び出しから戻ったり、I/O 完了ポートなどのリソースによる処理を再開するように通知されたりします。
転送: 一部のアクティビティは他のアクティビティによって引き起こされるか、他のアクティビティに関連しているため、アクティビティは "転送" トレースを介して他のアクティビティに関連付けることができます。 転送により、アクティビティ間の直接の関係が記録されます。
開始トレースと停止トレースは、相関関係にとって重要ではありません。 ただし、パフォーマンス、プロファイリング、アクティビティ スコープの検証を向上させるために役立ちます。
これらの種類を使用すると、ツールはトレース ログ内の移動を最適化して、同じアクティビティの直ちに関連するイベントを見つけることができます。また、ツールが転送トレースに従う場合は、関連するアクティビティのイベントを検索できます。 たとえば、ツールは、開始/停止トレースが表示されると、特定のアクティビティのログの解析を停止します。
これらのトレースの種類は、プロファイリングにも使用できます。 開始マーカーと停止マーカーの間で消費されるリソースは、含まれている論理アクティビティを含むアクティビティの包括時間を表します。 Suspend トレースと Resume トレースの間の時間間隔を減算すると、実際のアクティビティ時間が得られます。
Stop トレースは、実装されたアクティビティのスコープを検証する場合にも特に便利です。 特定のアクティビティ内ではなく Stop トレースの後に一部の処理トレースが表示される場合は、コードの欠陥を示す可能性があります。
アクティビティ トレースの使用に関するガイドライン
ActivityTracing トレース (開始、停止、中断、再開、転送) の使用に関するガイドラインを次に示します。
トレースは、ツリーではなく、有向循環グラフです。 あるアクティビティを発生させたアクティビティに制御を戻すことができます。
アクティビティは、システムの管理者にとって、またはサポート可能性のために意味のある処理境界を表します。
クライアントとサーバーの両方の各 WCF メソッドは、新しいアクティビティを開始し、(作業が完了した後に) 新しいアクティビティを終了し、アンビエント アクティビティに戻ることによって制限されます。
接続の待ち受けやメッセージの待機などの長時間続くアクティビティは、開始停止のマーカーで表されます。
メッセージの受信または処理によってトリガーされるアクティビティは、トレース境界によって表されます。
アクティビティはアクティビティを表し、必ずしもオブジェクトではありません。 アクティビティは、「これが起きていた時の状況」と解釈されるべきです。 . . (意味のあるトレースエミッションが発生しました)。"