Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@kou_bacchus

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
7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kou_bacchus
属性:闇、野良SE。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?