導入
「エラーが一定数を超えたら知らせてほしい」。これができると、人が定期的に画面を見に行く必要がなくなります。監視スクリプトの骨格は、測る → しきい値と比べる → 知らせるの3段だけです。
説明
#!/bin/bash
set -eu
LOG_FILE=/home/user/logs/app.log
THRESHOLD=1
# 通知(本番ではメールやSlackへ送る部分)
notify() {
echo "[ALERT] $1"
}
check_errors() {
local count
count=$(grep -c ERROR "$LOG_FILE" || true)
echo "$count"
}
ERROR_COUNT=$(check_errors)
echo "エラー件数: $ERROR_COUNT(しきい値: $THRESHOLD)"
if [ "$ERROR_COUNT" -gt "$THRESHOLD" ]; then
notify "エラーが $ERROR_COUNT 件発生しています"
exit 1
fi
echo "正常範囲です"
exit 0
設計のポイントを3つ。
- しきい値を変数にする(
THRESHOLD)。現場で必ず調整することになる値は、先頭に出しておく - 通知処理を関数に分ける(
notify)。いまはechoでも、あとでmailやcurl(Slack通知)に差し替えられる - 異常なら
exit 1で終わる。cron や監視ツールが「失敗した」と認識できる
flowchart TD
A["ログを測る"] --> B{"しきい値を超えた?"}
B -->|"はい"| C["notify で知らせる"] --> D["exit 1(異常終了)"]
B -->|"いいえ"| E["正常メッセージ"] --> F["exit 0(正常終了)"]
grep -c は「一致した行数」を返します。|| true を付けているのは、1件も見つからないと grep が終了ステータス 1 を返し、set -e で止まってしまうからです(第7章)。正常な「0件」を異常として扱わないための一手間です。
これを */5 * * * * で cron に登録すれば、5分おきの死活監視になります。第8章で学んだ flock で多重起動を防ぎ、>> /home/user/monitor.log 2>&1 でログを残せば、そのまま運用に載せられます。
やってみよう
スクリプトを実行して、app.log にエラーが2件あるためアラートが出ることを確かめましょう。次に THRESHOLD=5 に変えて実行すると、しきい値を下回るので 正常範囲です になります。同じスクリプトで、判定基準だけを運用に合わせて変えられることを体感してください。
演習
THRESHOLD を 5 に変えて実行し、正常範囲です と表示させてください。
ヒント1を見る
エディタの THRESHOLD=1 を THRESHOLD=5 に書き換えます。
ヒント2を見る
app.log のエラーは2件なので、しきい値5なら正常判定になります。