VMESXiのパフォーマンス値をとってみる

Rubyの勉強がてらVMAPIのRuby用ラッパー『RbVmomi』を利用して『VMware vSphere Client』で閲覧できるパフォーマンスチャートの値を取得するスクリプトを作ってみました。

結構ふわふわな知識で書いてるので間違ってる箇所があれば指摘いただけると幸いです。
ソースコードも人にみてもらう機会がほとんどないのでなにかあればコメントください。。。


●パフォーマンスチャート
f:id:ma2k8:20121219212633p:plain



Zabbix連携

id:taishinさんの以下のエントリーでzabbixサーバのローカルに取得した値を
保存するという上手いやり方を紹介されていたので真似てみました。
http://taishin.github.com/blog/2012/11/11/zabbixde/

出力形式は合わせたので、zabbix_agentd.d以下にユーザーパラメーター用のファイルを作成し、zabbix上でテンプレートを用意することで監視が行えます。



調査の流れ

ホストOS&ゲストOS情報の取得や電源ON/OFFメソッドの実行等のサンプルコードはrbvmomiのgithub(https://github.com/rlane/rbvmomi)にありますが、パフォーマンス関連の情報はないのでとりあえずVMAPIのドキュメントを漁ったところ『QueryPerf』メソッドの説明で以下の文面を発見

An array of PerfQuerySpec objects. Each PerfQuerySpec object specifies a managed object reference for an entity, plus optional criteria for filtering results. Only metrics for entities that can be resolved and that are valid performance providers are returned in any result.

Each PerfQuerySpec object in the array submitted in this operation can query for different metrics. Or, select all types of statistics for a single managed entity.

managed Objectなるものとフィルタ条件を渡して実行するっぽいことが書いてあります。
このメソッドを実行している箇所をRbVmomiのソースから探してみます。


その前に。。。Managed Objectとは???

VMAPI上で管理しているものほぼ全てのオブジェクトっぽいです。
http://www.vmware.com/support/developer/vc-sdk/visdk25pubs/ReferenceGuide/vim.ManagedEntity.html
Managed Objectを渡すことで対象のentity(実体)を特定するぜーといった感じ

サンプルコードを見ると以下の様な感じでManaged Objectの配列がとれるみたい。

dc.hostFolder.children.first.host.grep(RbVmomi::VIM::HostSystem)
# => [HostSystem("ha-host")]

VMマシンが2台存在すれば以下のような感じ。

dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine)
# =>[VirtualMachine("1"), VirtualMachine("2")]

一個ずつループで処理

dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine).each |x|
     〜ほげほげ
end
調査続き

RbVmomiのドキュメントを漁っているとPerfQueryを叩いている箇所を発見!(^ω^)
http://www.rdoc.info/github/vmware/rbvmomi/master/RbVmomi/VIM/PerformanceManager:retrieve_stats

def retrieve_stats objects, metrics, opts = {}

渡す引数は objects,metrics,optsですね。

optsは指定しないでもいいようなのでhostのManagedObjectとmetrics(取得する項目)を渡してみる。
metricsではvSphere Clientでいうチャートの項目を指定します。
f:id:ma2k8:20121220002446p:plain
※ちなみにチャート設定でチェックが入ってなくてもAPIで値は取得できます。

dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine).each |x|
     vim.serviceContent.perfManager.retrieve_stats(x, "cpu.usage")
end

んでこんなのが取れます。

{HostSystem("ha-host")=>
  {:metrics=>{"cpu.usagemhz"=>[147]},
   :sampleInfo=>
    [PerfSampleInfo(
       dynamicProperty: [],
       interval: 20,
       timestamp: Fri Nov 30 11:03:20 UTC 2012
     )]}}