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


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

1. GrowthForecast導入とCloudWatch連携理解
1. GrowthForecastの情報が生で見えるのは精神衛生上悪いので認証プロクシ化
1. Fluentd導入とログ連携理解
1. Apacheベースでnginx理解
1. 各種OSリソース情報等の出力
1. GrowthForecast+FluentdでWeb管理を素敵にしよう！

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

さて３回目だが、「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
```