この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
佐々木です。今週は東京に出張していたのですが、このブログは成田空港で書き始め、今、新千歳空港から札幌駅に向かう快速エアポートの車内で書き上げました。
今日は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] アイデア次第で様々な活用ができるのでは無いでしょうか!