Elasticsearch, KibanaのErrors alerts with Watcher is 何?
- KibanaにはErrors alerts with Watcherという機能がある
- この機能には、発生の閾値と時間間隔を指定すると閾値を越えた時にSlack通知などをすることができる機能である
- サーバのログ件数を補足する時などに利用できるが、この機能を利用するにはElasticsearchにログを挿入する必要がある
- 更にログを収集する為にLogstashやfilebeatなどを導入する必要がある
そこで、そこまで規模の大きくないサービスにおいて一定間隔でエラー件数を集計し、通知する為のshell scriptを作成してみる。
grepコマンドは非常に高速に動作する為、適切にログをローテーションさせれば、リソース効率よくログの監視ができる
(ELKはJavaで動作する為、小規模なサービスに使うにはリソース消費が激しくて無駄が多いので使いたくない)
実装したスクリプト
こちらの記事を参考に改良していく
#!/bin/bash
# ここで各エラーの件数を記録
ERROR_LINES=$(</var/run/hoge/error_lines)
WARNING_LINES=$(</var/run/hoge/warning_lines)
# ここで最後に実行したファイルが現在のファイルと同じか確認
LOGFILE_TIMESTAMP=$(</var/run/hoge/worker_timestamp)
# 作成した日のタイムスタンプを取得する
LOGFILE_TIMESTAMP_CURRENT=$(stat -c '%W' /var/log/hoge/error.log)
# もし。タイムスタンプが違ったらそれはローテーションされて新しいログファイルになっている
if [ "$LOGFILE_TIMESTAMP_CURRENT" != "$LOGFILE_TIMESTAMP" ]; then
ERROR_LINES=0
WARNING_LINES=0
echo "$LOGFILE_TIMESTAMP_CURRENT" > /var/run/hoge/worker_timestamp
fi
# ここでエラーログからログレベル別に件数を集計する
ERROR_LINES_CURRENT=$(grep -c error /var/log/hoge/error.log)
WARNING_LINES_CURRENT=$(grep -c warning /var/log/hoge/error.log)
# 前回の実行からどのくらいエラー件数が増えたか確認する
# もし閾値よりもエラー件数が多かったらSlackに通知する
if [ $((ERROR_LINES_CURRENT-ERROR_LINES)) -gt 5 ]; then
curl -X POST --data-urlencode "payload={\"username\": \"エラー報告Bot\", \"text\": \"直近5分間に$((ERROR_LINES_CURRENT-ERROR_LINES))件のerrorが確認されました\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZ
fi
if [ $((WARNING_LINES_CURRENT-WARNING_LINES)) -gt 10 ]; then
curl -X POST --data-urlencode "payload={\"username\": \"エラー報告Bot\", \"text\": \"直近5分間に$((WARNING_LINES_CURRENT-WARNING_LINES))件のwarningが確認されました\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZ
fi
# 最後にエラー件数を更新する
echo "$ERROR_LINES_CURRENT" > /var/run/hoge/error_lines
echo "$WARNING_LINES_CURRENT" > /var/run/hoge/warning_lines
考察
- 永続化するデータをどこに保存するか、どんな形式で保存するかにすごく悩んだ
- 結果的には3つのデータを保存しておく必要があり、それぞれ別々に保存したが、もう少しスマート(CSVとか)に保存できる気がする
- もっといい方法があれば知りたいので是非インフラエンジニアの方はコメントして頂きたいです