StreamInsight Event Flow Debugger の使用

製造、プロセス制御、公共設備、金融取引、Web、IT 監視などの分野における運用システムでは、複雑な相互関係と短い待機時間の要件を持つイベント ストリームが生成されます。そのようなイベント フローの処理に対する一時的な要素を考えた場合、多様かつ動的なストリーム動作での結果の有効性の判断、および障害発生時のクエリのトラブルシューティングが、これらのシステムにおける主要な課題となります。

そのため、次の要件に対応するクエリ分析ツールが必要になります。

  • 多量のデータを処理し、問題の検索領域を絞り込む。

  • 一貫性に関する厳密な要件に対応する。

  • ユーザーがすばやく診断または解決策を見つけるための直感的な操作性を備えている。

Microsoft StreamInsight には、スタンドアロンのイベント フロー デバッガー グラフィカル ユーザー インターフェイス (GUI) が用意されています。StreamInsight Event Flow Debugger を使用すると、CEP (Complex Event Processing) アプリケーションの開発者または管理者は、StreamInsight クエリを使用してイベントのフローの検査、デバッグ、および理論的な判断を行うことができます。このトピックでは、Event Flow Debugger の機能を紹介すると共に、このデバッグおよび解析ツールの使用をすばやく開始するために必要な手順について説明します。

イベント フロー デバッグについて

Event Flow Debugger について説明する前に、制御フロー デバッガー (C# デバッガーや C++ デバッガーなど) とイベント フロー デバッガーの基本的な違いに注意する必要があります。

制御フロー デバッグでは、開発者は、デバッグ モードで特定の言語を使用して作成されたプログラムを "構築" します。さらに、プログラムの制御フロー内にある特定のステートメントや連結部分でブレークポイントを有効にします。そして、そのプログラムをそれらの各ブレークポイントまで順次 "実行" していき、コードの末尾に到達して実行が完了するまで、コードとシステムの状態についての確認、関数およびプロシージャのステップ インまたはステップ オーバー、変数の監視などを行います。"データ" 変数の一時的な裏付け (時間の経過に伴うこれらの変数の変換の分析) は制限されているか存在しません。

それとは対照的に、イベント フロー デバッグでは、時間の経過と共に CEP クエリの 1 つの段階から次の段階へ、またクエリ段階内では 1 つの演算子から次の演算子へと進むイベントを分析する必要があります。ここでは、デバッグには、特定の演算子から入力されたイベントがストリームに及ぼす影響、および、演算子に入力されたイベントに関する計算の結果として新しいイベントがどのように生成されるかを理解する必要があります。イベント フロー デバッグでは、演算子自体の (制御フローの) 実行ではなく、演算子のセマンティック (フィルター、プロジェクト、結合、集計、マルチキャストなど) がイベントに与える影響に重点が置かれます。その結果、デバッガーは、特定のイベントがその他のイベントに及ぼす影響、およびその他のイベントが分析対象のイベントに及ぼす影響を理解する場合に役立ちます。

デバッグと監視のモード

Event Flow Debugger は、スタンドアロンのイベント トレース ベースのデバッグ ツールです。デバッガーには、次の 2 つの目的があります。

  • イベント フロー トレースをデバッグする。デバッグ セッションは次を基盤とすることができます。

    • ライブ サーバーにデバッガーを接続して、特定の操作に関するクエリのライブ記録から生成したトレース。

    • コマンド ライン ユーティリティを使用してデバッガーの外で生成したトレース ファイル。このファイルは後でデバッガーに読み込まれます。

  • サーバーを監視する。このモードのデバッガーには、システム オブジェクトとアプリケーション オブジェクトを一覧表示するオブジェクト エクスプローラーが用意されています。これらのエンティティのそれぞれに関して操作上の診断を取得できます。オブジェクト エクスプローラーはインターフェイスでもあり、これを使用してクエリによるトレースを有効または無効にしたり、クエリの実行を開始または停止したりできます。

Event Flow Debugger を使用するためには、ユーザーは、Windows Performance Log Users グループに属している必要があります。これにより、ユーザーは、trace.cmd を使用してデバッガー外でトレースを収集したり、デバッガー内で操作しているときにクエリからイベントを記録したりできます。これを行う方法の手順については、「Windows の管理と操作」を参照してください。

StreamInsight が正常にインストールされている場合は、デバッガーを起動し、スタート ページを表示して、このツールの基本的な機能について学ぶことをお勧めします。デバッガーを起動するには、[スタート] ボタンをクリックし、[すべてのプログラム] をポイントします。次に、[Microsoft StreamInsight 1.1][StreamInsight Event Flow Debugger] の順にクリックします。

StreamInsight クエリのデバッグ

デバッガーをローカルまたはリモート クライアント アプリケーションとして StreamInsight サーバーに接続すると、1 つまたは複数のクエリのイベント フロー トレースを記録し、再生できます。また、デバッガーをサーバーから分離されたスタンドアロンのクライアント アプリケーションとして使用し、オフラインで収集したイベント トレースに基づき、クエリを分析することもできます。これにより、特定のクエリの実行中にデバッグを行ったり、クエリ実行の履歴トレースに基づきクエリを逆方向にテストしたりする柔軟性が得られます。

ライブ クエリ イベントの記録

実行中のクエリからイベントを記録するには、Event Flow Debugger をライブ StreamInsight サーバーに接続する必要があります。次の手順では、ライブ サーバーに接続して、実行中のクエリを開き、そのクエリに対するトレースを有効にする方法について説明します。

  1. 前提条件として、ユーザー (またはサーバー管理者) はサーバーの Web サービスを有効にする必要があります。Web サービスの有効化の詳細については、「StreamInsight サーバーへのパブリッシュおよび接続」を参照してください。

  2. それぞれの StreamInsight ユーザー グループのメンバーになることにより、クライアント ユーザーがサーバーに接続する権限を持っていることを確認します。詳細については、「インストール (StreamInsight)」の「StreamInsight Users グループ」を参照してください。

  3. デバッガーで [ファイル][サーバーへの接続] の順にクリックします。サーバー エンドポイント アドレスを入力します。インストールされた StreamInsight サーバーの既定のエンドポイントは、https://localhost/StreamInsight/<instance_name> です。

    サーバーの接続設定が正しく構成されている場合は、デバッガーの左ペインにオブジェクト エクスプローラーが表示されます。

  4. オブジェクト エクスプローラーで、デバッグするクエリが表示されるまでオブジェクトの階層をクリックします。クエリ オブジェクトをダブルクリックします。これにより、次の図に示したようなクエリ グラフが表示されます。この図は、現在実行中のサンプル クエリ 'TrafficSensorQuery' を示しています。

    Event Flow Debugger のクエリ グラフ

    図 1 - クエリ グラフのクエリの表示

  5. クエリによるトレースを有効にするには、クエリを右クリックし、[トレースの有効化] を選択します。または、API を使用してトレースをプログラムで有効にすることもできます。詳細については、「StreamInsight サーバーおよびクエリの監視」を参照してください。

  6. クエリで処理中のイベントを記録するには、[記録を開始] ボタンをクリックします。これにより、次の図に示したように記録のプロセスが開始されます。イベントを数分間記録したら、[停止] をクリックします。

    クエリ内のフローするイベントの記録。

    図 2 - 実行中のクエリにおけるイベントの記録

これにより、デバッガーは図 1 に示した状態になります。この時点で、デバッガーに付属のクエリ分析ツールを使用できます。分析機能については、次のセクションで説明します。

Event Flow Trace (EFT) または Event Tracing for Windows (ETW) ファイルの読み込み

StreamInsight では、スタンドアロンおよび埋め込み式の両方のサーバー配置がサポートされています。アプリケーションにサーバーが埋め込まれていても、Web サービスが有効になっていない場合は、デバッガーのようなクライアント アプリケーションはサーバーに接続できません。そのような状況で実行されるクエリの問題をデバッグおよび診断するメカニズムが必要になります。

実行中の StreamInsight サーバーのイベント トレース ログを収集するには、StreamInsight のインストールに含まれている trace.cmd ユーティリティを使用します。次の手順では、トレース ファイルを作成し、Event Flow Debugger にそれを読み込む方法について説明します。

  1. サーバー、および関連する 1 つまたは複数のクエリが実行されている状態で、Windows コマンド プロンプトで次のステートメントを入力します。トレース ファイルに名前を付けるときには、ファイル拡張子 .etl を使用することが重要です。

trace.cmd start <filename>.etl

  1. クエリを適切な時間実行したら、次のコマンドを使用してトレースを停止します。

trace.cmd stop <filename>.etl

  1. 結果のファイルをデバッガーに読み込むには、[ファイル][開く] の順にクリックします。[開く] ダイアログで <filename>.etl の場所を参照し、[開く] をクリックします。次の図に示したように、クエリ グラフが表示されます。

    デバッガーへのクエリ トレース ファイルの読み込み。

    図 3 - トレース ファイルから読み込んだクエリの表示

この図では図 1 に示したオブジェクトよりも少ない数のエンティティがオブジェクト エクスプローラーに表示されています。これは、デバッガーがサーバーに接続されていないためです。特に、スケジューラなどのサーバーレベルの診断オブジェクトは、デバッガーがサーバーに接続されていないと表示できません。

図では、ステータス バーに進行状況インジケーターが表示されており、ETL ファイルの読み込みの進行状況を示しています。読み込みの一環として、デバッガーでは専用の圧縮 EFT 形式に ETL ファイルを変換します。

trace.cmd ユーティリティは Windows Logman コマンドに基づくスクリプトであることに注意してください。Logman は、イベント コレクションに Event Trace for Windows (ETW) インフラストラクチャを使用します。トレース ログの読み込み処理中に、デバッガーから一部のイベントが失われたことを示す警告が表示されることがあります。これは、ETW バッファーおよびセッションの設定が不適切であるためです。この問題を解決するには、trace.cmd ファイルで Logman コマンドを編集し、-bs オプションに指定されたバッファー サイズ (-bs 3000 など) を大きくするか、-nb オプションに指定されたバッファー数を増やします。詳細と例については、Logman のドキュメントを参照してください。

Event Flow Debugger ツールを使用したクエリ分析

Event Flow Debugger は、クエリ分析のために次の重要な機能を備えています。

  • 特定のクエリのクエリ プランを表示する機能 (クエリ演算子とイベント ストリーム)。これにより、基になるイベント フロー、およびイベント フロー内の処理ノードの面から統合言語クエリ (LINQ) クエリを理解できます。

  • 計算の各段階での中間結果と共に、複雑なイベント フローの入力および出力におけるすべてのイベントを検査する機能。これには、開始と終了のタイム スタンプに関するイベント メタデータ、およびペイロード フィールドが含まれます。

  • スケールアウトのためにパーティション分割された複雑なイベント フローを表示する機能。デバッガーは、Group and Apply 演算子のグループ化操作によってイベントがパーティション分割される方法、および適用演算子によってイベントが変換される方法を示すことができます。

  • 問題の検索領域を絞り込んだり、イベント フローの複数の段階間でイベントを相互に関連付けることができる一連のグローバル分析を実行する機能。

  • 時間の経過に従ってクエリ実行のトレースをステップ実行する機能、およびストリーミング クエリを介してイベントが反映される方法を示す機能。

  • イベントを分析する機能、およびイベントが特定の状態にどのように到達したか、つまり、その他のイベントまたは演算子がイベント タイムやペイロードにどのように影響したかを示す機能。

  • 現在の演算子の下流にあるイベントに特定のイベントが及ぼす影響を分析する機能。基本的には、イベントが最終的に出力に影響するまで、それらのイベントの将来の処理を予測する機能です。

これらの機能を実装するために、デバッガーには分析のための 3 つの機能が用意されています。

  • 再生 - この機能を使用すると、イベント ストリームでイベントを 1 つずつステップ実行し、それが 1 つの演算子から次の演算子へ進む状況を監視できます。代わりに、クエリ グラフの特定の演算子にブレークポイントを設定し、その演算子、またはその演算子の特定の条件が満たされるまで、デバッガーを "実行" する (イベント フローを有効にする) こともできます。

  • 原因分析 - この機能を使用すると、イベントを現在の状態に至らせた "根本原因"、あるいは操作または変更のシーケンスを "振り返って" 確認できます。

  • イベント伝達分析 – この機能を使用すると、このイベントの下流への影響を分析できます。これには、特定のイベント自体が経る変化、他のイベントへの影響、新しいイベント生成などの面での分析が含まれます。この機能は、原因分析の逆の機能です。

再生の使用

ライブの記録またはトレース ログ ファイルの読み込みによってデバッガーにイベントを読み込んだら、次の手順ではこれらのイベントを検出します。そのためには、時計アイコンをクリックしてイベントを再生します。これによりイベント プレーヤーが表示されます。[1 つ進む] アイコンをクリックすると、イベントをステップ実行できます。代わりに、任意の演算子の左側にあるオプション ボタンをクリックしてその演算子にブレークポイントを設定し、イベント プレーヤーで [次のブレークポイントに進む] をクリックすることもできます。

次の図では、適用分岐の集計演算子にブレークポイントが設定され、イベント フローが有効になっています。集計演算子の緑色で強調表示された線は、この点までのイベント フローの進行を示しています。

再生機能で表示されるイベント

図 4 - 集計演算子でのブレークポイントの設定

クエリ内でイベントがフローするようになったら、各演算子の右側にある三角のアイコンをクリックして、演算子を展開できます。引き続きイベントをステップ実行し、イベントの進行状況を確認できます。

原因分析の使用

原因分析を使用すると、イベントが現在の状態に至った経過を分析できます。任意の演算子のイベント グリッドから、目的のイベントを右クリックして [原因分析] をクリックすることにより、原因分析を開始できます。

[原因分析] を選択すると、展開されたビューがデバッガーに表示され、演算子が示されます。これらの演算子には、分析対象となるイベントの現在の状態の原因となった可能性のあるイベントが含まれています。たとえば、次の図は、特定の開始および終了タイムスタンプを持つ avgCount 18 が現在の状態に至った経過を示しています。強調表示されたイベントを右クリックし、コンテキスト メニューで [原因分析] をクリックします。デバッガーは、タブ付きのクエリ キャンバスのヘッダーに 2 番目の矢印を配置することにより、原因分析の再生のスタックを表示します。次の図にこれを示します。クエリ処理で、この段階におけるこのイベントの状態の一因となっているのは、VehicularCount 値 24 を持つ SensorInput 演算子の Insert です。

原因分析

図 5 - 原因分析の使用

イベント伝達分析の使用

原因分析は、他のイベントや処理ステップが特定のイベントに与える影響を理解するための分析ですが、イベント伝達分析では、現在のイベントが下流のイベントに与える影響を理解するための、先のことを考慮した分析を行います。任意の演算子のイベント グリッドから、目的のイベントを右クリックして [イベント伝達分析] をクリックすることにより、イベント伝達分析を開始できます。

分析のスタック

分析は相互に積み重ねることができます。デバッグは "再生" 機能を使用して開始できます。この分析の任意の時点で、特定のイベントの原因分析を開始できます。また、このビューから、伝達分析のために別のイベントを選択できます。このようにして、分析を相互に積み重ねることができます。

さらに同じクエリを複数のタブで開き、異なるタブに異なる分析とビューを表示すると、クエリの同じまたは異なるセグメントを異なる分析間で柔軟に比較できます。

演算子

クエリ グラフ内の四角形のボックスはそれぞれ、演算子 (StreamInsight クエリにおける計算ノード) を表します。クエリ代数は、Select (Filter)、Project、Import、Export、Group-and-Apply、Join、Multicast、Union、Top-K、AlterLifetime、Advancetime、Cleanse など、複数の演算子をサポートしています。サーバー メタデータでは、各演算子に対して、指定の名前およびその種類を示すラベルが付いています。

クエリ グラフに表示される演算子と LINQ クエリを構成する演算子の間には、必ずしも 1 対 1 の対応があるわけではないことに注意してください。たとえば、Import 演算子は入力アダプター インスタンスを表し、Export は出力アダプター インスタンスを表します。Cleanse は、順序付けられていないデータを処理するためにクエリ オプティマイザーによって提供される内部演算子で、LINQ クエリには存在しません。同様に、AdvanceTime と AlterLifetime も、AlterEventDuration または AlterEventLifeTime LINQ 拡張子の指定、またはクエリでのウィンドウ演算によって発生するクエリ代数の中核的な一時演算を表します。ただし、LINQ クエリは結果のクエリ グラフと簡単に相互に関連付けることができます。

各イベント グリッドには次のセクションがあります。

演算子ラベル

グリッドのタイトルは、クエリによって提供される演算子名と演算子の種類です。

フィルター

このテキスト ボックスでは、条件付き C# 式を指定して、目的のイベントをフィルター選択できます。たとえば、特定の値または時間を、満たすまたは超えるイベントのみを調べる必要がある場合に利用できます。

イベント フィールド

残りのイベント グリッド ウィンドウには、イベントのフィールドが表示されます。フィールドには、内部イベント (Retract および Expand) と共に、ユーザーが指定したイベントの種類 (Insert または Cti) が含まれます。既定で表示されるフィールドの列は、イベントの EventKind、StartTime、EndTime、およびペイロード フィールドです。イベント グリッドでフィールドの追加や削除を行うには、ヘッダー バーを右クリックしてコンテキスト メニューを表示するか、[表示][列] の順にクリックしてから、フィールド名を選択または選択解除します。すべてのタイムスタンプ フィールドは、協定世界時 (UTC) で表示されることに注意してください。コンテキスト メニューでは、タイム ゾーンを変更できます。

使用可能なフィールドは、次の表に示した順序で表示されます。特定の演算子のイベントは、その演算子のタイトル バーを右クリックして、[イベントをファイルに書き込み] オプションを選択することによってエクスポートできます。通常、これは別のプログラムで追加の処理を行うためにイベントをエクスポートする場合に行います。

フィールド名

説明

EventKind

Insert、Cti、Retract、または Expand。

StartTime

イベントの開始時刻。

EndTime

イベントの終了時刻。

NewEndTime

特殊な種類のシステム イベントのために変更したイベント終了時刻。この列の値は無視してください。

Latency

特定の時点でのイベントのシステム待機時間。これは、イベントの生成の原因となった受信イベントがシステムに受け入れられた時刻から、システムによってイベントが生成された時刻までの時間です。

EnqueueTime

イベントが演算子によって生成されたシステム時刻。

1 つまたは複数のペイロード フィールド

イベントで使用できるユーザー定義のデータ フィールド。

Group-and-Apply 演算子

Group-and-Apply 演算子は、エントリ ポイントとしてのグループ化演算子と、適用分岐演算子のセット、および終了時のバウンド演算子としての Union グループ演算子で構成される特殊な演算子です。グループ化ノードを展開すると、関連するグループ化キー値に固定した適用分岐のすべてが表示されます。Group-and-Apply 演算子は、グループ化ノードから目的の分岐をキャンバスへドラッグするだけで展開する (または折りたたむ) ことができます。分岐内の各演算子は展開して追加の分析を行うことができます。各分岐の [X] 符号をクリックすると、マスター Group-and-Apply フロー サブグラフに分岐が折りたたまれます。次の図は、Event Flow Debugger の Group-and-Apply ノードを示しています。

Group-and-Analysis 演算子の展開

図 6 - Group-and-Apply ノードの表示

操作性を考慮した追加機能

デバッガーには、操作性を考慮した次の機能が用意されています。

  • クエリ グラフ キャンバスでは、演算子をシームレスに全画面表示のクエリ グラフに拡大したり縮小したりすることができます。

  • アイコンで利用できるすべての機能は、コンテキスト メニューのオプションの選択によっても使用できます。

  • デバッガーがサーバーに接続されている場合、インストールのロケールにかかわりなく、サーバーによって返されたエラーのロケールは en-US になります。英語以外のロケールの場合、これらのエラー メッセージは追加のサポートおよび診断に使用できます。

  • すべての演算子は、[すべて展開] および [すべて折りたたみ] 機能を使用して展開または折りたたむことができます。

  • [ツール] メニューから使用できるオプションによって、さまざまなデバッガー設定に対して既定値を設定できます。イベント フロー トレース ファイルは、特定サイズのセグメントで読み込むように選択することもできます。これにより、予測可能でスムーズなデバッグの操作性を実現できます。また、クエリ グラフのすべての演算子間で DateTime 形式と TimeZone を指定できます。さらに、デバッガーがサーバーに接続されている場合のシナリオに対してイベント フローの最大記録時間および最小記録時間を指定できます。

ダッシュボードの監視

Event Flow Debugger は、デバッグ ツールであることに加え、StreamInsight サーバーの監視ツールとしても機能します。前に説明した手順を利用して、デバッガーをライブ サーバーに接続できます。デバッガーには、すべてのサーバー エンティティを含むオブジェクト エクスプローラーが表示されます。最上位レベルには、イベント マネージャー、クエリ マネージャー、およびスケジューラの統計概要が表示されます。これらのオブジェクトのいずれかのランタイム診断を表示するには、そのオブジェクトのアイコンを右クリックし、[診断] を選択します。

さらに、オブジェクトの階層をクリック スルーし、サーバーに登録された特定のクエリを選択することもできます。クエリのトレースを有効または無効にしたり、クエリの実行を開始または停止したりできます。また、クエリが実行中の場合、クエリのランタイム診断を取得することもできます。このインターフェイスを使用して、生成されたイベントや使用されたイベント、待機時間、スループットの特性、クエリのメモリ要件などに関する情報を監視できます。

これらの基準は、診断ビュー API を使用してプログラムで取得することもできます。各エンティティで使用できる診断情報の詳細については、「StreamInsight サーバーおよびクエリの監視」を参照してください。

変更履歴

変更内容

「Event Flow Trace (EFT) または Event Tracing for Windows (ETW) ファイルの読み込み」にイベントが失われたことを示す警告の原因と解決方法の説明を追加しました。

「ライブ クエリ イベントの記録」に手順 2. を追加しました。