LoginSignup
0
0

More than 1 year has passed since last update.

Elasticsearch KibanaのErrors alerts with Watcherの仕組みをshell scriptで作る

Last updated at Posted at 2021-09-10

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とか)に保存できる気がする
  • もっといい方法があれば知りたいので是非インフラエンジニアの方はコメントして頂きたいです
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0