メトリクス監視や 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 取得が別々になっているのも無駄なのである。
つまりそのあたりの機能は後付……フフフ、リファクタリングしろ!