GrowthForecast+FluentdでWeb管理を素敵にしよう!のゴール
- GrowthForecast導入とCloudWatch連携理解
- GrowthForecastの情報が生で見えるのは精神衛生上悪いので認証プロクシ化
- Fluentd導入とログ連携理解
- Apacheベースでnginx理解
- 各種OSリソース情報等の出力
- GrowthForecast+FluentdでWeb管理を素敵にしよう!
段階的にnginxやGrowthForecast、Fluentdを理解して、Zabbix無しでも軽くて素敵な運用が出来ることがゴール。
さて3回目だが、「4」をやってみたりしてるけど別の機会にまとめようと思う。
Apacheとの違いで覚えるよりもnginxを弄くり倒すのが先だ。
で、Fluentdは既に導入していたりするけど、それよりも先に各種OSリソース情報を直接突っ込めるものはGrowthForecastに突っ込んで『見える化』した方が幸せだなと思ったから。
各種OSリソースをOneLinerで取得してみよう
気が向いたらスクリプトは追加しようと思う。
基本形
Linuxなのでお手軽にShellで書く。
シェルをcronで回す。
そんだけ。
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
KANSHI_1=`(監視したいOSリソース情報をOneLinerで取得)`
if [ -n "$KANSHI_1" ]; then
curl -F number=$KANSHI_1 http://$GFSERVER/api/$INSTANCE_ID/KANSHI_A1/KANSHI_B1
fi
GrowthForecastはcurlでURLをpushしてnumberに格納された値を記録するわけだが、「KANSHI_A1」は今回はLoad Agerageなど管理する中項目、「KANSHI_B1」はグラフに判例として乗るのでLoad_Average_1など具体的になんだか判るようにして置いた方がいいだろう。
これに気付いて、全スクリプトを見直し、アーカイブし直し始めた。
気軽に『見える化』出来るが、どう見せるのかという考慮も大事だね。
Load Averageを取るよ
大抵、top
コマンドでよく見ると思うが、今回はuptime
コマンドで。
uptime | cut -d, -f4 | cut -d: -f2|awk '{print $1*100}'|bc
uptime | cut -d, -f5 |awk '{print $1*100}'|bc
uptime | cut -d, -f6 |awk '{print $1*100}'|bc
それぞれLoad Averageの1分、5分、15分のもの。
100倍しているのは、GrowthForecastは整数しか取り扱わないので、100倍して整数にし、GrowthForecastで表示する際に100で割ってる。
文末にシェルのソース貼っておく。
空き物理メモリ取るよ
これは普通にfree
コマンドで取る。
free | tail -n 3 | sed 's/^.*:\s*//' | tr '\n' ' ' | sed 's/$/\n/' | awk '{ print $8 }'
こねくり回し感が(笑)
プロセス数を取るよ
ま、これは超簡単だね。
ps -e | grep -v grep | wc -l
ディスク使用率取るよ
こいつはdf
コマンド。
ワンパーティションなので、いろいろとやってないけど、複数パーティションの場合はもうちょいとこねくり回す必要あり。
df / | /usr/bin/tail -1 | /bin/sed 's/^.* \([0-9]*\)%.*$/\1/
topで使用しているユーザ毎のCPU使用率とメモリ使用率取るよ
何に問題があるのかすぐに分かりたいので、各ユーザ毎にCPU使用率とメモリ使用率を取ってみる。
これがあるとCPU使用率が高騰していても何が原因かの一次切り分けが早くなる。
Webに何かあればnginxが高騰してるとか。
rootユーザの例を記載しておく。
top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' | grep root | awk '{print $2*10}'|bc`
top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' | grep root | awk '{print $2*10}'|bc
10倍してるのは先ほども記載したが、GrowthForecastは整数しか取り扱わないので、GrowthForecastで表示する際に10で割って元に戻してる。
cronに登録
$ crontab -e
こいつで登録。
内容はこんな感じにしてる。
*/10 * * * * /home/ec2-user/cloudwatch_push.sh
*/10 * * * * /home/ec2-user/disk_push.sh
*/10 * * * * /home/ec2-user/ps_push.sh
*/10 * * * * /home/ec2-user/free_mem_push.sh
*/10 * * * * /home/ec2-user/la_push.sh
*/10 * * * * /home/ec2-user/cpu_top_push.sh
*/10 * * * * /home/ec2-user/mem_top_push.sh
Load Averageとか1分毎とかにしてたのだが、EBSへの$0.08 per 1 million I/O requests
で課金され始めたので、10分にした。
全然10分で問題ないし。
いや、いろいろと弄ってみるもんだ。
監視項目を追加したら、ここに追記していく予定。
各シェルのソース公開
Disk使用率
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
DISK=`/bin/df / | /usr/bin/tail -1 | /bin/sed 's/^.* \([0-9]*\)%.*$/\1/'`
if [ -n "$DISK" ]; then
curl -F number=$DISK http://$GFSERVER/api/$INSTANCE_ID/disk/disk
fi
プロセス数
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
PS=`ps -e | grep -v grep | wc -l`
if [ -n "$PS" ]; then
curl -F number=$PS http://$GFSERVER/api/$INSTANCE_ID/process/process
fi
物理メモリ空き容量
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
FM=`free | tail -n 3 | sed 's/^.*:\s*//' | tr '\n' ' ' | sed 's/$/\n/' | awk '{ print $8 }'`
if [ -n "$FM" ]; then
curl -F number=$FM http://$GFSERVER/api/$INSTANCE_ID/free_memory/free_memory
fi
Load Average
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
LA_1=`uptime | cut -d, -f4 | cut -d: -f2|awk '{print $1*100}'|bc`
LA_5=`uptime | cut -d, -f5 |awk '{print $1*100}'|bc`
LA_15=`uptime | cut -d, -f6 |awk '{print $1*100}'|bc`
if [ -n "$LA_1" ]; then
curl -F number=$LA_1 http://$GFSERVER/api/$INSTANCE_ID/load_average_1/load_average_1
fi
if [ -n "$LA_5" ]; then
curl -F number=$LA_5 http://$GFSERVER/api/$INSTANCE_ID/load_average_5/load_average_5
fi
if [ -n "$LA_15" ]; then
curl -F number=$LA_15 http://$GFSERVER/api/$INSTANCE_ID/load_average_15/load_average_15
fi
ユーザ毎CPU使用率
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
CPU_ROOT=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep root|awk '{print $2*10}'|bc`
CPU_EC2USER=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep ec2-user|awk '{print $2*10}'|bc`
CPU_DBUS=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep dbus|awk '{print $2*10}'|bc`
CPU_MYSQL=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep mysql|awk '{print $2*10}'|bc`
CPU_NGINX=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep nginx|awk '{print $2*10}'|bc`
CPU_TDAGENT=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep td-agent|awk '{print $2*10}'|bc`
CPU_NTP=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep ntp|awk '{print $2*10}'|bc`
CPU_SMMSP=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$9}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep smmsp|awk '{print $2*10}'|bc`
if [ -n "CPU_ROOT" ]; then
curl -F number=$CPU_ROOT http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_root
fi
if [ -n "CPU_EC2USER" ]; then
curl -F number=$CPU_EC2USER http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_ec2-user
fi
if [ -n "CPU_DBUS" ]; then
curl -F number=$CPU_DBUS http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_dbus
fi
if [ -n "CPU_MYSQL" ]; then
curl -F number=$CPU_MYSQL http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_mysql
fi
if [ -n "CPU_NGINX" ]; then
curl -F number=$CPU_NGINX http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_nginx
fi
if [ -n "CPU_TDAGENT" ]; then
curl -F number=$CPU_TDAGENT http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_td-agent
fi
if [ -n "CPU_NTP" ]; then
curl -F number=$CPU_NTP http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_ntp
fi
if [ -n "CPU_SMMSP" ]; then
curl -F number=$CPU_SMMSP http://$GFSERVER/api/$INSTANCE_ID/cpu_top/cpu_smmsp
fi
ユーザ毎メモリ使用率
# !/bin/bash
GFSERVER="127.0.0.1:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
MEM_ROOT=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep root|awk '{print $2*10}'|bc`
MEM_EC2USER=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep ec2-user|awk '{print $2*10}'|bc`
MEM_DBUS=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep dbus|awk '{print $2*10}'|bc`
MEM_MYSQL=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep mysql|awk '{print $2*10}'|bc`
MEM_NGINX=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep nginx|awk '{print $2*10}'|bc`
MEM_TDAGENT=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep td-agent|awk '{print $2*10}'|bc`
MEM_NTP=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep ntp|awk '{print $2*10}'|bc`
MEM_SMMSP=`top -b -n1 | awk '/^ *[0-9]/ {c[$2]+=$10}END{for(p in c){printf("%s %f\n",p,c[p])}}' |grep smmsp|awk '{print $2*10}'|bc`
if [ -n "MEM_ROOT" ]; then
curl -F number=$MEM_ROOT http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_root
fi
if [ -n "MEM_EC2USER" ]; then
curl -F number=$MEM_EC2USER http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_ec2-user
fi
if [ -n "MEM_DBUS" ]; then
curl -F number=$MEM_DBUS http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_dbus
fi
if [ -n "MEM_MYSQL" ]; then
curl -F number=$MEM_MYSQL http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_mysql
fi
if [ -n "MEM_NGINX" ]; then
curl -F number=$MEM_NGINX http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_nginx
fi
if [ -n "MEM_TDAGENT" ]; then
curl -F number=$MEM_TDAGENT http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_td-agent
fi
if [ -n "MEM_NTP" ]; then
curl -F number=$MEM_NTP http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_ntp
fi
if [ -n "MEM_SMMSP" ]; then
curl -F number=$MEM_SMMSP http://$GFSERVER/api/$INSTANCE_ID/mem_top/mem_smmsp
fi