Elasticsearchのアラート検知プラグイン「Watcher」を使ってみた
はじめに
佐々木です。今週は東京に出張していたのですが、このブログは成田空港で書き始め、今、新千歳空港から札幌駅に向かう快速エアポートの車内で書き上げました。
今日はWatcherを試してみたいと思います!
WatcherはElasticsearchのアラート検知プラグインです。Watcherを使うことで、Indexに登録されたデータを特定のキーワードで引っ掛けて、定義したアクションを実行することが出来ます。例えばElasticsearchのログに記録したり、メールで通知したり、Webhookを投げたりすることが出来ます。ApacheのアクセスログをElasticsearchに投入して「error」というキーワードが発生したら管理者にメール通知する、といったことが出来ます。これは便利ですね。
なお、WatcherはShieldと同様に商用プロダクトであり、インストール後30日間は試用ライセンスで動作しますが、その後はライセンスの購入が必要です。
さて、ではやってみましょう!
やってみた
Watcherのインストール
Elasticsearch自体はrpmでインストール済みとします。
$ rpm -qa | grep elasticsearch elasticsearch-1.7.2-1.noarch
WatcherはPluginとしてインストールできます。また商用プロダクトなのでlicenseのインストールが必要になります。
$ sudo /usr/share/elasticsearch/bin/plugin -i elasticsearch/license/latest $ sudo /usr/share/elasticsearch/bin/plugin -i elasticsearch/watcher/latest
Pluginをインストールしたら、Elasticsearchを起動します。
$ sudo service elasticsearch restart Stopping elasticsearch: [ OK ] Starting elasticsearch: [ OK ]
Elasticsearch起動時のログ。Watcherのライセンスがvalidになりました。
[2015-09-26 13:51:03,512][INFO ][plugins ] [Enchantress] loaded [river-twitter, river-csv, watcher, license, shield], sites [head] [2015-09-26 13:51:03,594][INFO ][watcher.trigger.schedule ] [Enchantress] using [ticker] schedule trigger engine [2015-09-26 13:51:11,746][INFO ][watcher ] [Enchantress] starting watch service... [2015-09-26 13:51:11,750][INFO ][license.plugin.core ] [Enchantress] license for [watcher] - valid [2015-09-26 13:51:11,750][ERROR][watcher.license ] [Enchantress]
Watcherのステータスの確認。本構成ではShieldも入っているためユーザーを指定してGETしています。以下のように、watcher_stateが"started"となっているのがわかります。
$ curl -XGET -u admin 'http://localhost:9200/_watcher/stats?pretty' Enter host password for user 'admin': { "watcher_state" : "started", "watch_count" : 0, "execution_thread_pool" : { "queue_size" : 0, "max_size" : 0 } }
Watcherでメール通知
それでは、Watcherを使ってキーワードを検知したらメール通知する、というのをやってみましょう。 Watcherからメールを送るためには、メールアカウントの設定が必要になります。(configuring Watcher to Send Email) /etc/elasticsearch/elasticsearch.ymlを編集し、以下のようにメールアカウントの設定を行います。今回は同一hosts上のSMTPサーバ(Amazon Linuxであればデフォルトでsendmailがセットアップされています)を使っています。
$ sudo vi /etc/elasticsearch/elasticsearch.yml watcher.actions.email.service.account: localhost: profile: standard email_defaults: from: 'smokeymonkey@localhost' smtp: host: localhost port: 25 user: root
では、watch定義を追加してみましょう。intervalは10秒、logsというindexの中で、statusがerrorの場合、actionsで定義したアクションを実行します。つまり前述で定義したlocalhostというメールアカウントを使って、smokeymonkey@example.comにメールするってことですね。
$ curl -XPUT -u admin 'http://localhost:9200/_watcher/watch/log_event_watch' -d '{ "trigger" : { "schedule" : { "interval" : "10s" } }, "input" : { "search" : { "request" : { "indices" : "logs", "body" : { "query" : { "match" : { "status" : "error" } } } } } }, "actions" : { "email_root" : { "email" : { "account" : "localhost", "to" : "smokeymonkey@example.com", "subject" : "Encountered errors", "body" : "Too many error in the system, see attached data", "attach_data" : true, "priority" : "high" } } } }' Enter host password for user 'admin': {"_id":"log_event_watch","_version":1,"created":true}
では実際に、logsというindexに、statusがerrorとなるデータを登録します。
$ curl -XPOST -u admin 'http://localhost:9200/logs/event' -d '{ "timestamp" : "2015-09-26T14:08:36.388Z", "status" : "error" }' Enter host password for user 'admin': {"_index":"logs","_type":"event","_id":"AVAIDZS1FAlg5C6CtNfk","_version":1,"created":true}
すると、以下のようなメールが送信されます!
添付されたdata.ymlの中身。検知したデータ自体が送られてきます。
--- ctx: id: "log_event_watch_786-2015-09-26T07:39:08.093Z" vars: {} trigger: triggered_time: "2015-09-26T07:39:08.093Z" scheduled_time: "2015-09-26T07:39:07.853Z" execution_time: "2015-09-26T07:39:08.093Z" watch_id: "log_event_watch" payload: hits: total: 1 hits: - _type: "event" _source: timestamp: "2015-09-26T14:08:36.388Z" status: "error" _id: "AVAIDZS1FAlg5C6CtNfk" _index: "logs" _score: 0.5945348 max_score: 0.5945348 _shards: total: 5 failed: 0 successful: 5 timed_out: false took: 2 metadata: null
ということで、Watcherでアラート検知が出来ました!
さいごに
特定のIndexを検知する以外にも、Elasticsearch Clusterの状態を監視して通知するような使い方も出来ます(Watch Your Cluster Health] アイデア次第で様々な活用ができるのでは無いでしょうか!