ElastAlertでEFKスタックで収集したログを監視する
お久しぶりです。生きております…!
最近はコンテナ基盤の監視やログ収集について勉強しておりました。定番のPrometheus+GrafanaやEFKスタックについてですね。前者ではcadvisor、node-exporterを使った一般的なDockerホスト監視やbackbox-exporterを使った外形監視、後者ではfluentdの設定ファイルの記述方法を勉強してコンテナやsystemdサービス、kernelログを収集する方法について学びました。
ところでEFKスタックでログ収集をしたら、ERROR
やFAIL
などの文字列を検出して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です。
監視ルールは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
をクリックして、アラートを保存して完了です。