Zabbixでvmc statsの情報など監視

Preview:

DESCRIPTION

 

Citation preview

zabbix で vmc stats の情報など監視してオートスケール風に動かしてみました。

DTS 大西

自己紹介• 大西正太 (株) DTS @shouta_dev• Rails 歴 7 年位

– 自社サービス グループウェア (2006 ~ )• http://www.bizca.jp

– 受託開発色々• 普通の Rails• Heroku 上アプリ (6 dyno)

• 自転車が大好き!• お酒が大好き!• 岩ガキが大好き!• 生肉が大好き!

今日の内容• Zabbix で CloudFoundry のインスタンスを試し

にオートスケールしてみました• 連携できるか見たかっただけでさほど突き詰めて

ないですが、あまり突っ込まないでください!

×

オートスケール ?

• 負荷が高くなってきたら自動的にスケールアウトする機構

• 突然の負荷上昇に自動対応• CloudFoundry には現状ない ?• サーバ側の何らかのメトリクスが閾値を超えた

らスケールアウトを発動させる– レスポンスタイム– CPU 、メモリ– プロセス数– スコアボードなど

Zabbix

• オープンソースの監視ソフト• Item を監視し Trigger 条件

を満たしたら Action を実行するという構造

ItemTrigg

erAction

今回やること• vmc stats の Item 種別を追加する

– エージェント拡張の機構を用いることで Item の種別を追加できる

• vmc instances でスケールアウトする Action を追加する– Action はシェルコマンドを定義できる

監視対象

CPU Item

メモリItem

Trigger

条件

メール通知

Action

スケールアウトAction

Trigger

条件vmc stats

Item

vmc stats?• vmc statsで該当アプリケーションのリソース状況を取得できる

$ vmc stats xxx

+----------+-------------+----------------+--------------+----------------+| Instance | CPU (Cores) | Memory (limit) | Disk (limit) | Uptime |+----------+-------------+----------------+--------------+----------------+| 0 | 0.0% (4) | 23.1M (128M) | 56.0K (2G) | 0d:18h:53m:10s || 1 | 0.0% (4) | 18.0M (128M) | 52.0K (2G) | 0d:17h:42m:5s |+----------+-------------+----------------+--------------+----------------+

• vmcコマンドはCloudControllerのWebAPIを叩いてJSONで結果受け取り

[{:state=>:RUNNING, :stats=>{:name=>“xxx", :host=>"172.30.49.137", :port=>40538, :uris=>[“xxx.cloudfoundry.com"], :uptime=>71329.371288281, :mem_quota=>134217728, :disk_quota=>2147483648, :fds_quota=>256, :cores=>4, :usage=>{:time=>"2012-08-23 02:40:58 +0000", :cpu=>0.0, :mem=>23660.0, :disk=>57344}}, :instance=>0}, {:state=>:RUNNING, :stats=>{:name=>"shoutahello", :host=>"172.30.50.23", :port=>28052, :uris=>["shoutahello.cloudfoundry.com"], :uptime=>67064.368383474, :mem_quota=>134217728, :disk_quota=>2147483648, :fds_quota=>256, :cores=>4, :usage=>{:time=>"2012-08-23 02:40:57 +0000", :cpu=>0.0, :mem=>18428.0, :disk=>53248}}, :instance=>1}]

vmc stats 用 Item 種別追加■API 叩く簡単な自作スクリプト#vmc_stats.rbrequire 'cli'opt = { :target => 'api.cloudfoundry.com', :email => 'xxxx@example.com', :password => 'xxxx', :appname => 'xxxx'}

client = VMC::Client.new(opt[:target], nil)token = client.login(opt[:email], opt[:password])

stats = client.app_stats(opt[:appname])

sum = 0.0stats.each do |stat| sum += stat[:stats][:usage][:cpu].to_fend

average = sum / stats.length# 標準出力に数値を出力puts average

■Item 種別の追加#/etc/zabbix/zabbix-agentd.conf に追

記する

UserParameter=cloudfoundry.vmc.stats,ruby /home/zabbix/vmc_stats.rb

※vmc コマンド直接ではなく vmc 内部のクラスを利用→ コマンドはログイン情報をファイルに保持するため、複数の cloudfoundry アカウントで監視したい場合などに動きがおかしくなりそうだと考えたため

Item の作成• 普通のCPU監視などと同様に、画面か

らcloudfoundry.vmc.statsを指定してItemを作成

• Itemのグラフを定義するとグラフ表示!

※ 今回30秒毎の監視で指定

Trigger 定義• Zabbix 書式で閾値を定義

Action 定義■ スケールアウト自作スクリプト(徐々にスケールアウト )#vmc_instances.rbrequire 'cli'

opt = { :target => 'api.cloudfoundry.com', :email => ‘xxxx@example.com', :password => ‘xxxx', :appname => ‘xxxx'}

client = VMC::Client.new(opt[:target], nil)token = client.login(opt[:email], opt[:password])

app = client.app_info(opt[:appname])current_instances_num = app[:instances]

cmd = VMC::Cli::Command::Apps.newcmd.client(client)

if current_instances_num <= 5 cmd.instances(opt[:appname], "+1")end

負荷掛けてみる• Jmeter で負荷• CPU を消費するシンプルアプリ– 負荷掛けると Trigger 検知されて画面に出る

require 'sinatra'get '/' do 100000000.times{}end

オートスケールしてる• スケールアウトが自動実行されて性能改

善している

2 86 170 254 338 422 506 590 674 758 842 926 1010109411781262134614301514159816820

500

1000

1500

2000

2500

3000

3500

4000

12510

Jmeterスレッド数

リクエスト数

スケールアウト

段になっている

実用するには ?• vmc stats で返ってくる CPU の精度が怪しい?

• 平均値を返してるのか、使用率の上下が即時反映されない?• そもそも Item は CPU でいいのか?

– CPU は AP がボトルネックという切分にはなるけど…– レスポンスタイムとか

• Zabbix の Web 監視で実現可能– 同時処理中のインスタンス数とか

• そもそも取れる? Router とか持ってない?• varz の情報にもないっぽい?

– 複合条件• Zabbix の Trigger で定義可能

• 歯止めの対応– 連続で高負荷検知の場合スケールアウトとか

• Zabbix の Trigger で定義可能• スケールインの対応

• Zabbix の Trigger で定義可能