mirror of
https://github.com/munin-monitoring/contrib.git
synced 2025-07-25 18:38:30 +00:00
add the possibility to create graphs for all hosts managed by a vCenter with one plugin call
This commit is contained in:
parent
cb21db87c7
commit
b81e26cdaf
1 changed files with 72 additions and 19 deletions
|
@ -94,7 +94,8 @@ I would like to thank VMware for their SDK and the good documentation.
|
||||||
|
|
||||||
Special thanks go to MEGABIT Informationstechnik GmbH (www.megabit.net)
|
Special thanks go to MEGABIT Informationstechnik GmbH (www.megabit.net)
|
||||||
who graciously sponsored the development of the "flat view" option
|
who graciously sponsored the development of the "flat view" option
|
||||||
and the ability to access hosts via vCenter.
|
and the ability to access hosts via vCenter as well as the feature to
|
||||||
|
query all hosts on the vCenter.
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
@ -116,11 +117,53 @@ my $DEBUG = ${Munin::Plugin::DEBUG};
|
||||||
# on your vSphere/vCenter/ESX(i) server (which is the default)
|
# on your vSphere/vCenter/ESX(i) server (which is the default)
|
||||||
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
|
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
|
||||||
|
|
||||||
# get hostname from filename and blurt it out immediately
|
# for datetime parsing later on
|
||||||
# so that when something goes wrong, at least the plugin
|
my $iso8601 = DateTime::Format::ISO8601->new;
|
||||||
# output is linked with the right host
|
my @host_names = ();
|
||||||
$0 =~ /esx_(.+)$/;
|
my $host_name;
|
||||||
my $host_name = $1;
|
my $host_view;
|
||||||
|
my $dtsys;
|
||||||
|
my $perfMan;
|
||||||
|
my %perfCounter;
|
||||||
|
# IDs/UUIDs to human readable names
|
||||||
|
my $resolveNames;
|
||||||
|
|
||||||
|
if ($0 =~ /vcenter_(.+)$/) {
|
||||||
|
$ENV{vCenter} = $1;
|
||||||
|
$ENV{flatview} = $ENV{flatview} || $ENV{vCenter};
|
||||||
|
my $vpid = open(FH, "-|");
|
||||||
|
if ($vpid == 0) {
|
||||||
|
Opts::set_option ('username', $ENV{user} || 'root');
|
||||||
|
Opts::set_option ('password', $ENV{password} || '');
|
||||||
|
Opts::set_option ('server', $ENV{vCenter});
|
||||||
|
Util::connect();
|
||||||
|
foreach (@{Vim::find_entity_views(view_type => 'HostSystem', properties => ['name'])}) {
|
||||||
|
print $_->{name}, "\n";
|
||||||
|
}
|
||||||
|
Util::disconnect();
|
||||||
|
exit 0;
|
||||||
|
} else {
|
||||||
|
while (<FH>) {
|
||||||
|
push @host_names, trim($_);
|
||||||
|
print "# found host ",trim($_)," on vCenter\n" if $DEBUG;
|
||||||
|
}
|
||||||
|
close FH;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# get hostname from filename and blurt it out immediately
|
||||||
|
# so that when something goes wrong, at least the plugin
|
||||||
|
# output is linked with the right host
|
||||||
|
$0 =~ /esx_(.+)$/;
|
||||||
|
push @host_names, $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @returns = ();
|
||||||
|
|
||||||
|
foreach $host_name (@host_names) {
|
||||||
|
local *FH;
|
||||||
|
my $pid = open(FH, "-|");
|
||||||
|
if ($pid == 0) {
|
||||||
|
######################## CHILD
|
||||||
|
|
||||||
if ((defined $ARGV[0]) and ($ARGV[0] eq "config")) {
|
if ((defined $ARGV[0]) and ($ARGV[0] eq "config")) {
|
||||||
if ($ENV{flatview}) {
|
if ($ENV{flatview}) {
|
||||||
|
@ -137,30 +180,28 @@ Opts::set_option ('password', $ENV{password} || '');
|
||||||
if ($ENV{vCenter}) {
|
if ($ENV{vCenter}) {
|
||||||
print "# vCenter: $ENV{vCenter} - host $host_name\n" if $DEBUG;
|
print "# vCenter: $ENV{vCenter} - host $host_name\n" if $DEBUG;
|
||||||
Opts::add_options ( (vihost => { alias => "h", type => "=s", required => 0 }) );
|
Opts::add_options ( (vihost => { alias => "h", type => "=s", required => 0 }) );
|
||||||
Opts::set_option ('vihost',"$host_name");
|
Opts::set_option ('vihost',$host_name);
|
||||||
Opts::set_option ('url',"https://$ENV{vCenter}/sdk/webService");
|
Opts::set_option ('server',$ENV{vCenter});
|
||||||
} else {
|
} else {
|
||||||
Opts::set_option ('url',"https://$host_name/sdk/webService");
|
Opts::set_option ('server',$host_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# plugin needs Munin 1.4 or later
|
# plugin needs Munin 1.4 or later
|
||||||
need_multigraph();
|
need_multigraph();
|
||||||
|
|
||||||
# for datetime parsing later on
|
|
||||||
my $iso8601 = DateTime::Format::ISO8601->new;
|
|
||||||
my $sstarttime = time();
|
my $sstarttime = time();
|
||||||
|
|
||||||
# connect to vSphere host
|
# connect to vSphere host
|
||||||
Util::connect();
|
Util::connect();
|
||||||
|
|
||||||
# central object host_view holds all relevant items (VMs, network, etc.)
|
# central object host_view holds all relevant items (VMs, network, etc.)
|
||||||
my $host_view = VIExt::get_host_view(1, ['summary', 'network', 'datastore', 'vm', 'runtime', 'configManager.networkSystem', 'configManager.dateTimeSystem']);
|
$host_view = VIExt::get_host_view(1, ['summary', 'network', 'datastore', 'vm', 'runtime', 'configManager.networkSystem', 'configManager.dateTimeSystem']);
|
||||||
Opts::assert_usage(defined($host_view), "Invalid host.");
|
Opts::assert_usage(defined($host_view), "Invalid host.");
|
||||||
|
|
||||||
my $serviceInst = Vim::get_view (mo_ref => ManagedObjectReference->new(type => 'ServiceInstance', value => 'ServiceInstance'));
|
my $serviceInst = Vim::get_view (mo_ref => ManagedObjectReference->new(type => 'ServiceInstance', value => 'ServiceInstance'));
|
||||||
# Performance Manager for getting the actual values
|
# Performance Manager for getting the actual values
|
||||||
my $perfMan = Vim::get_view (mo_ref => $serviceInst->content->perfManager);
|
$perfMan = Vim::get_view (mo_ref => $serviceInst->content->perfManager);
|
||||||
Opts::assert_usage(defined($perfMan), "No PerformanceManager.");
|
Opts::assert_usage(defined($perfMan), "No PerformanceManager.");
|
||||||
|
|
||||||
# may be needed later
|
# may be needed later
|
||||||
|
@ -169,19 +210,17 @@ Opts::assert_usage(defined($perfMan), "No PerformanceManager.");
|
||||||
|
|
||||||
# used for getting the current vSphere server time and then
|
# used for getting the current vSphere server time and then
|
||||||
# defining the (now - 5minutes) interval
|
# defining the (now - 5minutes) interval
|
||||||
my $dtsys = Vim::get_view(mo_ref => $host_view->{'configManager.dateTimeSystem'});
|
$dtsys = Vim::get_view(mo_ref => $host_view->{'configManager.dateTimeSystem'});
|
||||||
Opts::assert_usage(defined($dtsys), "No DateTimeSystem.");
|
Opts::assert_usage(defined($dtsys), "No DateTimeSystem.");
|
||||||
|
|
||||||
print "# time to connect and get objects: ", time() - $sstarttime, "\n" if $DEBUG;
|
print "# time to connect and get objects: ", time() - $sstarttime, "\n" if $DEBUG;
|
||||||
|
|
||||||
# enumerate all performance counters by their IDs
|
# enumerate all performance counters by their IDs
|
||||||
my %perfCounter = map { $_->key => $_ } @{$perfMan->perfCounter};
|
%perfCounter = map { $_->key => $_ } @{$perfMan->perfCounter};
|
||||||
# holds all performance data
|
# holds all performance data
|
||||||
my @all_perf_data = ();
|
my @all_perf_data = ();
|
||||||
# store VM ids for iteration later on
|
# store VM ids for iteration later on
|
||||||
my @all_vms = ();
|
my @all_vms = ();
|
||||||
# IDs/UUIDs to human readable names
|
|
||||||
my $resolveNames;
|
|
||||||
|
|
||||||
$host_view->update_view_data();
|
$host_view->update_view_data();
|
||||||
# retrieve performance counters for host
|
# retrieve performance counters for host
|
||||||
|
@ -427,7 +466,21 @@ foreach (@all_graphs) {
|
||||||
|
|
||||||
print "# time of the script: ", time() - $sstarttime, "\n" if $DEBUG;
|
print "# time of the script: ", time() - $sstarttime, "\n" if $DEBUG;
|
||||||
|
|
||||||
0;
|
exit 0;
|
||||||
|
} else {
|
||||||
|
################################ PARENT
|
||||||
|
push @returns, *FH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $fh (@returns) {
|
||||||
|
while (<$fh>) {
|
||||||
|
print $_;
|
||||||
|
}
|
||||||
|
close ($fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
|
@ -509,7 +562,7 @@ sub munin_print {
|
||||||
my $oldGroup = "_-_";
|
my $oldGroup = "_-_";
|
||||||
my $factor;
|
my $factor;
|
||||||
if ($ENV{flatview}) {
|
if ($ENV{flatview}) {
|
||||||
$cfg->{graphName} = clean_fieldname("Host_$host_name").".".$cfg->{graphName} unless $cfg->{graphName} =~ m/\./;
|
$cfg->{graphName} = clean_fieldname("Host_".$host_view->name).".".$cfg->{graphName} unless $cfg->{graphName} =~ m/\./;
|
||||||
}
|
}
|
||||||
|
|
||||||
# find values according to criteria in $par and sort by grouping parameter
|
# find values according to criteria in $par and sort by grouping parameter
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue