Posted at

GrowthForecast+FluentdでWeb管理を素敵にしよう!③ 〜各種OSリソースをGrowthForecastにぶっ込もう〜

More than 5 years have passed since last update.


GrowthForecast+FluentdでWeb管理を素敵にしよう!のゴール


  1. GrowthForecast導入とCloudWatch連携理解

  2. GrowthForecastの情報が生で見えるのは精神衛生上悪いので認証プロクシ化

  3. Fluentd導入とログ連携理解

  4. Apacheベースでnginx理解

  5. 各種OSリソース情報等の出力

  6. GrowthForecast+FluentdでWeb管理を素敵にしよう!

段階的にnginxやGrowthForecast、Fluentdを理解して、Zabbix無しでも軽くて素敵な運用が出来ることがゴール。

さて3回目だが、「4」をやってみたりしてるけど別の機会にまとめようと思う。

Apacheとの違いで覚えるよりもnginxを弄くり倒すのが先だ。

で、Fluentdは既に導入していたりするけど、それよりも先に各種OSリソース情報を直接突っ込めるものはGrowthForecastに突っ込んで『見える化』した方が幸せだなと思ったから。


各種OSリソースをOneLinerで取得してみよう

気が向いたらスクリプトは追加しようと思う。


基本形

Linuxなのでお手軽にShellで書く。

シェルをcronで回す。

そんだけ。


basic.sh

#!/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コマンドで。


Load_Average_1

uptime | cut -d, -f4 | cut -d: -f2|awk '{print $1*100}'|bc



Load_Average_5

uptime | cut -d, -f5 |awk '{print $1*100}'|bc



Load_Average_15

uptime | cut -d, -f6 |awk '{print $1*100}'|bc


それぞれLoad Averageの1分、5分、15分のもの。

100倍しているのは、GrowthForecastは整数しか取り扱わないので、100倍して整数にし、GrowthForecastで表示する際に100で割ってる。

文末にシェルのソース貼っておく。


空き物理メモリ取るよ

これは普通にfreeコマンドで取る。


MemFree

free | tail -n 3 | sed 's/^.*:\s*//' | tr '\n' ' ' | sed 's/$/\n/' | awk '{ print $8 }'


こねくり回し感が(笑)


プロセス数を取るよ

ま、これは超簡単だね。


Process

ps -e | grep -v grep | wc -l



ディスク使用率取るよ

こいつはdfコマンド。

ワンパーティションなので、いろいろとやってないけど、複数パーティションの場合はもうちょいとこねくり回す必要あり。


Disk

df / | /usr/bin/tail -1 | /bin/sed 's/^.* \([0-9]*\)%.*$/\1/



topで使用しているユーザ毎のCPU使用率とメモリ使用率取るよ

何に問題があるのかすぐに分かりたいので、各ユーザ毎にCPU使用率とメモリ使用率を取ってみる。

これがあるとCPU使用率が高騰していても何が原因かの一次切り分けが早くなる。

Webに何かあればnginxが高騰してるとか。

rootユーザの例を記載しておく。


top_cpu

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_memory

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

こいつで登録。

内容はこんな感じにしてる。


cron

*/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使用率


disk_push.sh

#!/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



プロセス数


ps_push.sh

#!/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



物理メモリ空き容量


free_mem_push.sh

#!/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


la_push.sh

#!/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使用率


cpu_top_push.sh

#!/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



ユーザ毎メモリ使用率


mem_top_push.sh

#!/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