監視イベント通知システム「wakame-dolphin」の話


[Wakame Users Group Advent Calendar 2013 12/14](http://atnd.org/events/45749)担当することになりました。　
wakame-vdcの初期のころからコミッターとして参加している@saicologicです。

ここ一年くらいは、[wakame-vdc](https://github.com/axsh/wakame-vdc)とOSS([Zabbix](http://www.zabbix.jp/), [Fluentd](http://fluentd.org/))製品を組み合わせた監視やログ収集に関するプロダクトの開発をしております。
2013年９月に[Wakame-vdcのv13.08のリリース](http://axsh.jp/news/publicity/894)時にメッセージ監視機能が加わったため、今回はメッセージ監視を実現するために使われている「[wakame-dolphin](https://github.com/axsh/wakame-dolphin)(以下Dolphin)」というプロダクトについてご紹介いたします。
Dolphinは、GithubでOSSとして公開しています。

Dolphinを開発した目的は、データセンター内で管理している複数の監視システムの監視結果を一カ所に集約し、システム管理者やユーザーに監視結果を通知するために作られました。
どこか、港で話題のFluentdにも似ている気もしますが、DolphinはFluentdとも組み合わせても利用するようにも設計しています。

Dolphinの利用した、基本のシステム構成図は以下になります。この中でAlertEngineと呼んでいるものは、ZabbixやFluentdになります。

システム構成図

```
                   +-----------------+
                   |                 |
                   |  HTTP Client    |
                   |                 |
                   +------^---+------+
                          |   |
                          |   |
+--------------+      +---+---v---+        +--------------+
|              |      |           |        |              |
| Alert Engine |----->|  Dolphin  +--------> Mail Server  |
|              |      |           |        |              |
+--------------+      +---^---+---+        +--------------+
                          |   |
                          |   |
                          |   |
                          |   |
                      +---+---v----+
                      |            |
                      |  DataBase  |
                      |            |
                      +------------+
```

Dolphinは主に２つの機能を提供しています。それは、通知する先の宛先の管理と、受け取る監視結果（以下イベント）のデータを管理するためのイベント管理機能です。

まず最初にDolphinに宛先情報を登録します。宛先は以下のようにHeaderにX-Notification-Idを付与し、BodyにJSON形式で指定します。
いまのところNotification-Idはサーバー側で発行はせず、クライアント側が付与する形にしています。そして送信方法としてemailを指定し、SMTPによるメール送信をサポートしています。

Header

```
X-Notification-Id: 1
Content-Type: application/json
```

Body(JSON)

```
{
  "email":{
    "to":"demo@example.com"
  }
}
```

Dolphinに格納する情報はデータベースに保存しており、データベースの種類はCassandraとMySQLの２つのデータベースをサポートしています。

２つ目の機能は、イベント管理です。Headerに付与している、X-Notification-Idは先ほど登録したIDです。Dolphinの中では、このIdで宛先をルックアップし、
イベントデータを転送します。X-Message-Typeは、宛先に送るときの、メッセージの型を指定します。今のところこれは、メールのテンプレートファイルとマッピングされており、
Bodyの情報とテンプレートファイルを結合し、メールを送信する作りになっています。
Bodyは、イベントと呼んでいる監視結果の情報を格納することを想定しています。コンテンツのタイプはJSON形式です。

Header

```
Content-Type: application/json
X-Notification-Id: 1
X-Message-Type: ping
```

Body(JSON)

```
{
  "instance_id":"i-abcdefgh",
  "instance_name":"test",
  "instance_ip":"127.0.0.1",
  "account_id":"a-abcdefgh",
  "event_datetime":"2013-12-13 17:35:41 +0900",
  "message":"Alert!!!!"
}
```

これで、Dolphinの基本的な動作は終わりです。
あとは、WebAPIを経由して宛先情報の更新削除を行ったり、イベント情報を取得することができます。イベント情報は今のところ削除機能を提供していません。

システム構成の紹介はこのくらいで、Dolphinの実装についても少し触れたいと思います。

Dolphinは、Rubyで書かれたおりマルチスレッドサーバーとして動作しています。
[Celluloid](https://github.com/celluloid/celluloid)というアクターベースのライブラリを使用しており、WebAPIの実装には、Celluloidをベースにした[Reel](https://github.com/celluloid/reel)と[Sinatra](https://github.com/sinatra/sinatra)を使っています。
Celluloidは、Erlangというコンピューター言語から影響を受けており、[Erlang](http://www.erlang.org/)の機能のうちsupervisorやlinkといった機能をRubyの上で実装しています。
これは、スレッドがシステムのバグやトラブルによって死んでしまった場合でも、スレッドを監視している別スレッドが自動で再起動をシステムを止めることなくサービスを提供する仕組みです。
また、マルチスレッドの実装にともなう、デッドロックの問題もライブラリが吸収しており、少ない労力でマルチスレッドのシステムを開発することができます。
またデータセンター内の仮想ネットワークを構築するための[openvnet](https://github.com/axsh/openvnet)でも利用しており、注目しているライブラリです。

これからも、データセンターの管理を自動化して運用を楽にするための、プロダクトをどんどん開発いきたいと思います。
ではまたー。