ビビリフクロウの足跡

いつもお世話になっているインターネットへの恩返し

ElastAlertでEFKスタックで収集したログを監視する

お久しぶりです。生きております…!

最近はコンテナ基盤の監視やログ収集について勉強しておりました。定番のPrometheus+GrafanaやEFKスタックについてですね。前者ではcadvisor、node-exporterを使った一般的なDockerホスト監視やbackbox-exporterを使った外形監視、後者ではfluentdの設定ファイルの記述方法を勉強してコンテナやsystemdサービス、kernelログを収集する方法について学びました。

ところでEFKスタックでログ収集をしたら、ERRORFAILなどの文字列を検出してSlack等に通知したくなりますよね…? Elastic製品ではWatherという、x-pack(https://www.elastic.co/guide/jp/x-pack/current/index.html)内のコンポーネントを使ってこれを実現できるそうですが、x-packは有償なんです… OSSだけで同じことをやろうとしたら、KibanaをやめてGrafanaを使うという手もありますが、ログの検索/一覧性でGrafanaはKibanaには勝てない…

呆然とさまよっていたところで見つけたのがElastAlertというOSSです! ElastAlertを使うとPrometheusのAlertManagerのようにYAMLベースで監視ルールを書いて、Slackを始めとした様々な媒体に通知することができます。またコンテナイメージKibanaのプラグインがbitsensor社によって提供されているため、導入も簡単です。

使い方はbitsensor社のGitHubリポジトリ上の説明が丁寧なので全ては記載しませんが、概ね以下のように進めればOKです。

  1. elastalertのコンフィグファイル(json)を作成する。
  2. kibanaにelastalertプラグインをインストール
  3. EFKスタックを起動
  4. elastalertを起動

監視ルールはKibana上にElastAlertという項目が追加されているので、Creat ruleからエディタを起動し、以下のようなルールを書きます。

es_host: <Elasticsearchのホスト名/IPアドレス>
es_port: 9200

name: Alert on any error

index: logstash-*
timestamp_field: "@timestamp"

type: any

filter:
- query:
    query_string:
      query: "message:/ERROR/i"

alert_subject: "Error!!"

alert_text_type: alert_text_only
alert_text: "occur error on some components!"

alert:
  - slack

slack_webhook_url: "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"

Test ボタンで試験的にqueryを発行し、アラートを飛ばすことができます。意図したとおりであればSaveをクリックして、アラートを保存して完了です。