Better sanoïd monitoring integration

tags/zabbix-agent-addons-0.2.83-1
Daniel Berteaud 5 years ago
parent cd9ee20c02
commit dc8bef75ed
  1. 4
      zabbix_conf/zfs.conf
  2. 21
      zabbix_scripts/check_zfs
  3. 12
      zabbix_scripts/disco_zfs

@ -9,3 +9,7 @@ UserParameter=vfs.zfs.zpool.info[*],/var/lib/zabbix/bin/check_zfs --zpool=$1
# Type: Agent or Agent (active) # Type: Agent or Agent (active)
# FS, Zvol or Snap info in JSON # FS, Zvol or Snap info in JSON
UserParameter=vfs.zfs.dataset.info[*],/var/lib/zabbix/bin/check_zfs --dataset=$1 UserParameter=vfs.zfs.dataset.info[*],/var/lib/zabbix/bin/check_zfs --dataset=$1
# Type: Agent or Agent (active)
# Sanoïd snapshot monitoring
UserParameter=vfs.zfs.sanoid.check[*],/var/lib/zabbix/bin/check_zfs --sanoid=$1

@ -9,13 +9,13 @@ use Getopt::Long;
my $json = {}; my $json = {};
my $pool = undef; my $pool = undef;
my $dataset = undef; my $dataset = undef;
my $sanoidsnap = undef; my $sanoidmon = undef;
my $pretty = 0; my $pretty = 0;
GetOptions( GetOptions(
"zpool|pool=s" => \$pool, "zpool|pool=s" => \$pool,
"dataset=s" => \$dataset, "dataset=s" => \$dataset,
"sanoidsnap" => \$sanoidsnap, "sanoid=s" => \$sanoidmon,
"pretty" => \$pretty "pretty" => \$pretty
); );
@ -27,14 +27,17 @@ if (not $zpool or not $zfs){
print 'ZBX_NOTSUPPOTED'; print 'ZBX_NOTSUPPOTED';
exit 0; exit 0;
} }
if ($sanoidsnap and not $sanoid){ if ($sanoidmon and not $sanoid){
die 'ZBX_NOTSUPPOTED';
}
if (not grep { $_ eq $sanoidmon } qw(snapshot capacity health)){
die 'ZBX_NOTSUPPOTED'; die 'ZBX_NOTSUPPOTED';
} }
if (not $pool and not $dataset and not $sanoidsnap){ if (not $pool and not $dataset and not $sanoidmon){
print <<_EOF; print <<_EOF;
Usage: Usage:
$0 [--zpool=<name>|--dataset=<fs zvol or snap>|--sanoidsnap] $0 [--zpool=<name>|--dataset=<fs zvol or snap>|--sanoid=<snapshot|capacity|health>]
_EOF _EOF
exit 1; exit 1;
} }
@ -68,9 +71,9 @@ if ($pool){
$json->{$parse[1]} =~ s/x$//; $json->{$parse[1]} =~ s/x$//;
} }
} }
} elsif ($sanoidsnap){ } elsif ($sanoidmon){
print qx($sanoid --monitor-snapshot); print qx($sanoid --monitor-$sanoidmon);
exit 0; exit $?;
} }
print to_json($json, { pretty => $pretty }) . "\n"; print to_json($json, { pretty => $pretty }) . "\n";
@ -116,6 +119,8 @@ sub get_zpool_errors {
$errors->{$index->{$i-1}} .= $line; $errors->{$index->{$i-1}} .= $line;
} elsif ($line =~ m/\s+[a-zA-Z0-9_\-]+\s+[A-Z]+\s+(?<read>\d+(\.\d+)?)(?<read_suffix>[KMT])?\s+(?<write>\d+(\.\d+)?)(?<write_suffix>[KMT])?\s+(?<cksum>\d+(\.\d+)?)(?<cksum_suffix>[KMT])?/){ } elsif ($line =~ m/\s+[a-zA-Z0-9_\-]+\s+[A-Z]+\s+(?<read>\d+(\.\d+)?)(?<read_suffix>[KMT])?\s+(?<write>\d+(\.\d+)?)(?<write_suffix>[KMT])?\s+(?<cksum>\d+(\.\d+)?)(?<cksum_suffix>[KMT])?/){
# And here, we count the number of read, write and checksum errors # And here, we count the number of read, write and checksum errors
# Note that on ZoL 0.8.0 we could use zpool status -p to get rid of the suffixes
# But -p is not supported on 0.7 and earlier, so, we just convert them manually
$errors->{read_errors} += convert_suffix($+{'read'},$+{'read_suffix'}); $errors->{read_errors} += convert_suffix($+{'read'},$+{'read_suffix'});
$errors->{write_errors} += convert_suffix($+{'write'},$+{'write_suffix'}); $errors->{write_errors} += convert_suffix($+{'write'},$+{'write_suffix'});
$errors->{cksum_errors} += convert_suffix($+{'write'},$+{'write_suffix'}); $errors->{cksum_errors} += convert_suffix($+{'write'},$+{'write_suffix'});

@ -21,7 +21,7 @@ my $pools = 1;
my $fs = 0; my $fs = 0;
my $zvol = 0; my $zvol = 0;
my $snap = 0; my $snap = 0;
my $sanoidsnap = 0; my $sanoidmon = 0;
my $pretty = 0; my $pretty = 0;
GetOptions( GetOptions(
@ -29,17 +29,17 @@ GetOptions(
"fs|filesystems" => \$fs, "fs|filesystems" => \$fs,
"zvols|volumes" => \$zvol, "zvols|volumes" => \$zvol,
"snapshots" => \$snap, "snapshots" => \$snap,
"sanoidsnap" => \$sanoidsnap, "sanoid" => \$sanoidmon,
"pretty" => \$pretty "pretty" => \$pretty
); );
if ($fs or $zvol or $snap or $sanoidsnap){ if ($fs or $zvol or $snap or $sanoidsnap){
$pools = 0; $pools = 0;
} }
if ($pools + $fs + $zvol + $snap + $sanoidsnap != 1){ if ($pools + $fs + $zvol + $snap + $sanoidmon != 1){
die "One and only one type of discovery should be provided\n"; die "One and only one type of discovery should be provided\n";
} }
if ($sanoidsnap and not $sanoid){ if ($sanoidmon and not $sanoid){
print to_json($json); print to_json($json);
exit 0; exit 0;
} }
@ -67,7 +67,7 @@ if ($pools){
$_ =~ s/\@/%40/g; $_ =~ s/\@/%40/g;
push @{$json->{data}}, { '{#ZFS_SNAP}' => $_ }; push @{$json->{data}}, { '{#ZFS_SNAP}' => $_ };
} }
} elsif ($sanoidsnap){ } elsif ($sanoidmon){
push @{$json->{data}}, { '{#ZFS_SANOID}' => 1 }; push @{$json->{data}}, { '{#ZFS_SANOID}' => $_ } foreach (qw(snapshot capacity health));
} }
print to_json($json, { pretty => $pretty }); print to_json($json, { pretty => $pretty });

Loading…
Cancel
Save