#chiroito ’s blog

Java を中心とした趣味の技術について

nasne 監視システム -Oracle Stream Explorer-

この記事はnasne監視システムを作る記事の第3弾です。

[nasne 監視システム概要]で紹介しましたが、nasne監視システムは4つの要素で構成されています。今回はその中で最もコアな部分である Complex Event Processing を紹介します。Complex Event Processing は様々なミドルウェアで提供されていますが、今回は Oracle Stream Explorer (OSX) を使用します。

▼図1:今回紹介する範囲

収集プログラムは OSX へ頻繁に HDD 情報を送信します。OSX は Librato へ 5 分ごとに各 HDDの情報を 1 つ送信します。
Librato を開発者プランで使用する場合には 5 分以上の間隔で情報を送ると保持期間が 2 週間になり、1 分以上 5 分未満の間隔で情報を送ると保持期間が 1 日になります。保持期間をできるだけ長くしたかったので、本システムでは収集プログラムによって頻繁に送られてくる HDD 情報を 5 分ごとに最新の HDD 情報だけを Librato へ送信しています。
参考:Librato Pricing explained

OSX で実現する処理は4つです。1つ目の処理は、収集プログラムからHDD情報を受信する処理 (図①)。2つ目の処理は、受信したHDD情報の中でマウントされているHDD情報だけに絞り込む処理 (図②)。3つ目の処理は、HDD 情報を 5 分間隔に絞り込む処理 (図③)。最後の処理は Librato へグラフを作る情報を送信する処理 (図④) です。

▼図2:OSXで実装する処理

1つ目の処理は、収集プログラムから受け取った JSON を設定されたクラスのオブジェクトに変換します。
2つ目の処理は、受信した HDD 情報からマウントしている HDD の情報のみを抽出します。
3つ目の処理は Librato を開発者プランで使用する際のデータ保持時間の都合上、5 分に 1 回だけデータを送るように絞り込みます。そのため、5 分に 1 回 HDDごとに最新の情報を絞り込みます。この処理の入力はマウントしているHDDの情報です。
3つ目の処理を含めない場合には、収集プログラムが HDD 情報を送信し、OSX がその情報を受信するつど Librato へ情報を送信します。収集プログラムが 5 分間隔で収集して OSX へ送れば良いと思われるかもしれません。そうすると収集プログラムが Librato の 5 分間という制約に影響を受けてしまいます。別の処理で 5 分と異なるタイミングで処理を行いたくなった場合に実装できません。
5 分ごとに各 HDD の最新情報を絞り込むという処理はウィンドウを使用して実現します。ウィンドウの詳細は省略しますが、処理対象とする範囲を指定する物です。
今回は、5 分間という時間ベースのウィンドウを 5 分刻みに移動しています(図3①②)。また、タプルベースのウィンドウを 1 つに指定し、最も遅く受信した情報(=最新の情報)だけを保持しています(図3③)。またそれぞれのウィンドウをHDDごとに分割することで、各 HDD の情報を分割して絞り込めます(図3④)。
▼図3:ウィンドウの例

図3の例では、マウント済みの HDD 情報を受信すると、タプルベースのウィンドウがもつ情報がつど置き換えられます。時間ベースのウインドウ範囲が終わるときに最新の情報だけが次の処理へ送られます。
次の処理へ送られる正確なタイミングは時間ベースのウィンドウが移動するタイミングです。今回のシステムではウィンドウの範囲=移動する量=5分間なので上記の記述としています。
ウィンドウの詳細につきましては、参考資料をご参照下さい。
参考:1.1.3 ストリームからリレーションへの演算子(ウィンドウ)

さいごの Librato へ情報を送る処理は、5分ごとに各HDDの情報が送られてくるため、どの HDD の空き容量が何 Byte なのかを送信しています。

Oracle Stream Explorer (OSX) ではこれらの処理を標準コンポーネント、Continuous Query Language (CQL)、Java クラスで実現します。OSXは、標準コンポーネントのREST Inboundアダプタを使用して収集プログラムから JSON を受け取り、CQLを使用してマウント済のHDD情報の絞り込みや、ウィンドウで5分ごとに絞り込みます。Librato へ情報を送信する機能は標準コンポーネントとして用意されていないため、自分で実装しなければなりません。
OSX では、これらの処理を並べることでイベント処理ネットワーク (EPN) を構築します。全ての処理は EPN に並べられた順に処理されます。図2で紹介した処理を実装した EPN が図4 です。


▼図4:nasne監視システムのイベント処理ネットワーク

それぞれのコンポーネントで行っている処理はこれまでに紹介した物になりますので割愛しますが、OSX ではコンポーネントを EPN で並べることで複雑な処理を実現します。今回のシステムでは登場しませんでしたが、EPN は1つの情報を複数の処理の入力とする分岐や複数の情報を統合してより複雑な情報を作ることもできます。分岐を利用して、今回は紹介していませんが、私のnasne監視システムでは受信した情報を分岐させてマウント状態が前回受信した内容から変更があったらメールを投げる実装などもしています。また、今回は HDD 情報だけを入力情報としていますが、他の情報と組み合わせることで、新たな機能を実現することも可能です。ぜひいろいろ試してみて下さい。

次回はOSXから送信された情報を Librato でグラフ化する方法を紹介します。目次ページはこちらです。