Ab.の日記: vMA を使って ESXi のステータスを munin グラフ化
ステータス値の取得には viperformance.pl を改造したスクリプトを使用します。
これはそこそこ時間がかかるので、munin plugin から呼び出さずに cron で呼び出し、結果を redis KVS に突っ込んでおくことにします。
また、vMA に手を入れるのを極力避けるため、ssh で他のマシン(FreeBSD機)からスクリプトを呼び出すという形式にします。
munin plugin は redis からデータを取ってきて、必要な処理を行い、munin に値を返します。
という事でまずは改造版 viperformance.pl (4.1 用 vMA 上のファイルとの差分です)
このファイルは呼び出し側の /root/vma-munin/ ディレクトリに置いてあります。
vMA マシンに転送されて使用されます。
$ diff -u /usr/lib/vmware-vcli/apps/performance/viperformance.pl ./viperformance.pl
--- /usr/lib/vmware-vcli/apps/performance/viperformance.pl 2010-04-08 23:07:58.000000000 -0400
+++ ./viperformance.pl 2011-02-12 01:25:15.000000000 -0500
@@ -7,6 +7,7 @@
use FindBin;
use lib "$FindBin::Bin/../";
+use lib "/usr/lib/vmware-vcli/apps/";
use VMware::VIRuntime;
use AppUtil::HostUtil;
@@ -48,6 +49,21 @@
help => "Name of file to hold output",
required => 0,
},
+ 'average' => {
+ type => "",
+ help => "to average data",
+ required => 0,
+ },
+ 'nosummary' => {
+ type => "",
+ help => "suppress summary info",
+ required => 0,
+ },
+ 'show-counter-type' => {
+ type => "",
+ help => "show counter type",
+ required => 0,
+ },
);
Opts::add_options(%opts);
@@ -126,8 +142,27 @@
my $values = $_->value;
foreach (@$values) {
print_counter_info($_->id->counterId, $_->id->instance);
- print_log("Sample info : " . $time_stamps);
- print_log("Value: " . $_->value . "\n");
+# print_log("Sample info : " . $time_stamps);
+ if (Opts::get_option('show-counter-type')) {
+ print_log("CounterType: " . Opts::get_option('countertype'));
+ }
+ if (Opts::get_option('average')) {
+ my $sum = 0.0;
+ my @data = split(/,/, $_->value);
+ if ($#data >= 0) {
+ pop @data
+ if ($#data > 0);
+ map { $sum += 0.0+$_ } @data;
+ if ($all_counters->{$_->id->counterId}->rollupType->val
+ ne "summation") {
+ $sum /= ($#data+1.0);
+ }
+ print_log("Value: " . $sum);
+ }
+ }else {
+ print_log("Value: " . $_->value);
+ }
+ print_log("\n");
}
}
}
@@ -136,11 +171,15 @@
my ($counter_id, $instance) = @_;
my $counter = $all_counters->{$counter_id};
print_log("Counter: " . $counter->nameInfo->label);
+ print_log("KeyName: " . $counter->nameInfo->key);
if (defined $instance) {
- print_log("Instance : " . $instance);
+ print_log("Instance: " . $instance);
+ }
+ if (! Opts::get_option('nosummary')) {
+ print_log("Description: " . $counter->nameInfo->summary);
}
- print_log("Description: " . $counter->nameInfo->summary);
print_log("Units: " . $counter->unitInfo->label);
+ print_log("RollupType: ". $counter->rollupType->val);
}
sub get_perf_metric_ids {
次は /root/vma-munin/get-all-perf-data.sh
vMA マシン上に転送し実行され、全パフォーマンスデータを出力します。
#!/bin/sh
source setup.sh
for f in cpu mem net disk sys ; do
./viperformance.pl --host $VI_SERVER --samples 15 --instance '*' --average --countertype $f "$@"
done
/root/vma-munin/setup.sh
esxi にアクセスする為の情報を設定するファイル。
vSphere Client からパフォーマンスデータの読み出し許可だけ付けた vima-user というユーザーを作って、そのユーザーでアクセスするようにしています。
chmod 600 しておくのがお勧め。
#!/bin/sh
export VI_SERVER=esxi.somedomain.local
export VI_USERNAME=vima-user
export VI_PASSWORD='somegoodpassword'
/root/vma-munin/pump-vma-stats.sh 必要なファイルを vma マシンに転送して実行し、全パフォーマンスデータを取得して redis KVS に放り込むスクリプト。
#!/bin/sh
vma_ssh="ssh -i /root/.ssh/id_vma -l vi-admin"
redis_opt="-h redishost"
export RSYNC_RSH="$vma_ssh"
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
workdir=$(dirname $(realpath "$0"))
chdir "$workdir"
rsync -a setup.sh viperformance.pl get-all-perf-data.sh vma:.
$vma_ssh vma ./get-all-perf-data.sh --show-counter-type \
| redis-cli $redis_opt -x set "ESXi-vma-data" | grep -v '^OK$'
redis-cli $redis_opt set "ESXi-vma-life" 2 | grep -v '^OK$'
exit 0
そのスクリプトを5分ごとに呼び出す /etc/crontab のエントリ
3-59/5 * * * * root lockf -t 1 /var/run/vma-munin.lock /bin/sh /root/vma-munin/pump-vma-stats.sh 2>&1 | logger -t vma-munin
後は munin plugin なんですがこんなんなのでどうしましょうかね。
# wc /root/vma-munin/munin_pump_vma*
166 424 4246 /root/vma-munin/munin_pump_vma.conf
399 1194 10190 /root/vma-munin/munin_pump_vma_
とりあえず眠いので寝てしまおう。
vMA を使って ESXi のステータスを munin グラフ化 More ログイン