
Elasticsearchのアラート検知プラグイン「Watcher」を使ってみた
この記事は公開されてから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] アイデア次第で様々な活用ができるのでは無いでしょうか!










