AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Slack にロードアベレージの高まりを通知する簡単なスクリプト

メトリクス監視や APM を入れる (ほどでもない|環境整備する時間がない) みたいな状態のときあると思います。

とりあえず Slack に投げて監視体制はごまかそう、という趣旨。

こんな感じで通知される

実行例

実環境でテストしていたのでちょいちょいモザイク入れています。

やってること

BOOL_LA で指定した値よりロードアベレージの値が大きければ、指定した Slack のチャンネルに通知する。

設置

シェルスクリプトとして作成して chmod a+x して実行権を付与したら、あとは crontab に任意のタイミングで実行させてください。 クソ雑魚なので 1 分感覚で回しても大丈夫でしょう。

# example
*/1 * * * * /home/ec2-user/loadaverage.sh
中身
#!/bin/sh

# 変更箇所

### Webhook URL
WEBHOOKURL="https://hooks.slack.com/services/〜"
### 通知先チャンネル名
CHANNEL="#example"
### Slack ユーザ名(BOTNAME 使うなら不要か?)
USER="@example"
### 通知時のユーザ名
BOTNAME="我が名はBOT……"
### 通知時のアイコン
FACEICON=":innocent:"
### 通知を実行する閾値
BOOL_LA="0.40"

# ホスト名で本文の出し分け
case `hostname` in
  "intg-example-ec2" ) INSTANCE="インテグレーション結合環境 intg.example.com" ;;
  "stg-example-ec2" ) INSTANCE="ステージング検証・検収環境 stg.example.com" ;;
  "prod-example-ec2" ) INSTANCE="プロダクション本番・商用環境 prod.example.com" ;;
esac

# ここまで

# ロードアベレージを取得
LOAD_NOW=`uptime | grep "load average" | sed -e 's/^.*load\saverage:\s//g' | awk '{print $2}' | sed -e 's/,//g'`
# top の CPU 利用率ソート上位 5 つ
TOPS=`top -b -n 1 -o %CPU| head -12`
# 本文
MESSAGE="${INSTANCE} が重いかもしれん、ロードアベレージは ${LOAD_NOW} だ……\r\n\`\`\` ${TOPS} \`\`\`"

# POST
if [ `echo "${LOAD_NOW} > ${BOOL_LA}" | bc` == 1 ]; then
  # channel へ通知
  curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}\" }" ${WEBHOOKURL} >/dev/null
fi

ちなみに

これ通知しなくても毎回 top 叩いてて無駄だし、判断用のロードアベレージ取得と CPU ソートした top 取得が別々になっているのも無駄なのである。

つまりそのあたりの機能は後付……フフフ、リファクタリングしろ!