Elasticsearchのアラート検知プラグイン「Watcher」を使ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

佐々木です。今週は東京に出張していたのですが、このブログは成田空港で書き始め、今、新千歳空港から札幌駅に向かう快速エアポートの車内で書き上げました。

今日はWatcherを試してみたいと思います!

Watcher__Alerts___Notifications_for_Elasticsearch___Elastic

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}

すると、以下のようなメールが送信されます!

Encountered_errors_-_smokeymonkey_gmail_com_-_Gmail

添付された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] アイデア次第で様々な活用ができるのでは無いでしょうか!