StreamInsightでデバッグする

StreamInsightのEvent Flow Debuggerをつかう

こちらの記事を参考にEvent Flow Debuggerを使ったStreamInsightのデバッグについて書きました。

イベントストリームをデバッグするには?

StreamInsightではイベントストリームを扱っています。当然、アプリケーションを作成する上ではコードの挙動を確認したり、イベントが意図通りに流れているかデバッグをする必要があります。

しかし、イベントストリームは非同期に流れてきますので、コードにブレークポイントを貼っても全体の流れがよくわかりません。また、デバッグのためにログをコンソールに出したりファイルに吐いたりしたものを毎回確認するのもなかなか面倒です。

StreamInsightには標準でEvent Flow Debuggerというデバッガーが付属しており、これを使うことでストリームを保存して再生したり、ストリームを途中で止めて挙動を確認したりすることができます。

StreamInsightでのデバッグの流れ

StreamInsightでイベントストリームをデバッグするための流れは、だいたい以下の様な感じです。

  1. (初回のみ) 既存のコードにStreamInsightのサーバーエンドポイントを実装する処理を追加します
  2. Event Flow Debuggerでサービスマネジメントホストに接続し、StreamInsightアプリケーションで動作しているクエリを保存します
  3. Event Flow Debuggerで保存したクエリを読み込み、ステップ実行したりブレークポイントを設置したりしながらデバッグを行います

1. StreamInsightのサーバーエンドポイントを追加する

Event Flow DebuggerからStreamInsightアプリケーションに接続するためには、StreamInsightアプリケーションが紐づくサーバーエンドポイントに接続する必要があります。通常のサンプルプロジェクトではサーバーエンドポイントを立ち上げる処理は記述されていませんので、自前で作成しましょう。

おおまかな実装は以下のようになります。

using (cepServer = Server.create(instanceName)) {
    // create management host service
    ServiceHost host = new ServiceHost(cepServer.createManagementHost());

    // add endpoint to access
    host.AddServiceEndpoint(typeof(IManagementService), new WSHttpBinding(SecurityMode.Message), "http://localhost/StreamInsight/{Service Name}");

    host.Open();

    // and other functions...
}

参照設定で System.ServiceModel, Microsoft.ComplexEventProcessing.ManagementService を読み込む必要があります。エンドポイントを公開するURLはとくに決まりがあるわけではありませんが、Event Flow Debugger起動時のデフォルトURLが http://localhost/StreamInsight/{Service Name} になっていますのでそちらを利用しました。

2. Event Flow Debuggerで動作しているクエリを保存する

StreamInsightのクエリが実行されている状態でEvent Flow Debuggerを立ち上げて先ほど指定したURLに接続します。正常に接続ができている場合は左ペインの「Applications」フォルダの下に、起動中のStreamInsightアプリケーションの一覧が表示されているはずです。

[Applilcations] -> [Application Name] -> [Queries] を選択していくと、アプリケーション上で定義されているクエリの一覧が表示されていると思います。適当なクエリをダブルクリックすると以下の様なクエリグラフが表示されます。

Query Graph

このようにクエリを選択した状態で左上の時計ボタンを押すとストリームの記録が開始されます。適当にストリームを流してから記録を停止すると、記録した内容をETF(Event Trace File)形式のファイルとして保存することができます。保存ダイアログが出ない場合は左上の[File]メニューから保存してください。

ETFはいろいろと使いようがあるみたいですが、今回はひとまず普通にデバッガーで読み込む方法を試します。

3. Event Flow Debuggerで保存したクエリのデバッグを行う

では、先ほど保存したETFを読み込んでデバッグを行いましょう。左上の[File]メニューからETFファイルを開くことができます。ファイルを開くと以下の様にクエリグラフが表示されます。

Event Flow Debugger

タブの上部に表示された矢印をクリックすることで、どのデータがどのフローをどの順番で流れていったのか確認することができます。

Debugging Image

CTIイベントやInsertイベントで挿入されたデータの詳細も同時に見ることができます。

まとめ

Event Flow Debuggerを利用することでStreamInsightで処理するイベントストリームの保存、デバッグを容易に行うことができます。また、特定のクエリのフローにデータが流れてきた原因分析など、より高度なデバッグも用意されているようです。素敵ですね :)

今回はデバッガーに寄り道しましたが、次回はLINQによるクエリテンプレートを見ていきます。

データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)

データサイエンティスト養成読本 [ビッグデータ時代のビジネスを支えるデータ分析力が身につく! ] (Software Design plus)