Module: check_mk
Branch: master
Commit: d925e9070fd82c4c77ff179d11cb1d424c82827e
URL: http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d925e9070fd82c…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Tue Oct 23 14:16:16 2012 +0200
zfslist: new check for monitoring ZFS disk usage for Linux, Solaris, FreeBSD
---
ChangeLog | 2 +
agents/check_mk_agent.freebsd | 16 ++++---
agents/check_mk_agent.linux | 8 +++-
agents/check_mk_agent.solaris | 8 +++-
checkman/zfslist | 13 ++++++
checks/zfslist | 83 ++++++++++++++++++++++++++++++++++++
pnp-templates/check_mk-zfslist.php | 1 +
web/plugins/perfometer/check_mk.py | 1 +
8 files changed, 124 insertions(+), 8 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 2499f45..350990f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -73,6 +73,8 @@
counters if a base value is set
* win_dhcp_pools: do not inventorize empty pools any more. You can switch
back to old behaviour with win_dhcp_pools_inventorize_empty = True
+ * zfslist: new check for monitoring ZFS disk usage for Linux, Solaris, FreeBSD
+ (you need to update your agent as well)
1.2.0p3:
Mulitisite
diff --git a/agents/check_mk_agent.freebsd b/agents/check_mk_agent.freebsd
index 6172422..20027fd 100755
--- a/agents/check_mk_agent.freebsd
+++ b/agents/check_mk_agent.freebsd
@@ -82,12 +82,16 @@ osver="$(uname -r)"
echo '<<<df>>>'
# no special zfs handling so far, the ZFS.pools plugin has been tested to
# work on FreeBSD
-df -T >/dev/null
-if [ $? -eq 0 ]
- then
- df -kTP -t ufs | egrep -v '(Filesystem|devfs|procfs|fdescfs|basejail)'
- else
- df -kP -t ufs | egrep -v '(Filesystem|devfs|procfs|fdescfs|basejail)' | awk '{ print $1,"ufs",$2,$3,$4,$5,$6 }'
+if df -T > /dev/null ; then
+ df -kTP -t ufs | egrep -v '(Filesystem|devfs|procfs|fdescfs|basejail)'
+else
+ df -kP -t ufs | egrep -v '(Filesystem|devfs|procfs|fdescfs|basejail)' | awk '{ print $1,"ufs",$2,$3,$4,$5,$6 }'
+fi
+
+# Filesystem usage for ZFS
+if type zfs > /dev/null 2>&1 ; then
+ echo '<<<zfslist>>>'
+ zfs list -H -o name,used,avail,mountpoint
fi
# Check NFS mounts by accessing them with stat -f (System
diff --git a/agents/check_mk_agent.linux b/agents/check_mk_agent.linux
index fe192e9..6c60d8e 100755
--- a/agents/check_mk_agent.linux
+++ b/agents/check_mk_agent.linux
@@ -76,7 +76,7 @@ fi
echo '<<<df>>>'
# The exclusion list is getting a bit of a problem. -l should hide any remote FS but seems
# to be all but working.
-excludefs="-x smbfs -x tmpfs -x cifs -x iso9660 -x udf -x nfsv4 -x nfs -x mvfs"
+excludefs="-x smbfs -x tmpfs -x cifs -x iso9660 -x udf -x nfsv4 -x nfs -x mvfs -x zfs"
df -PTlk $excludefs | sed 1d
# VMWare shows its own filesystems with 'vdf'. Just one
@@ -86,6 +86,12 @@ then
vdf -P | grep ^/vmfs/volumes | sed 's/ / vmfs /'
fi
+# Filesystem usage for ZFS
+if type zfs > /dev/null 2>&1 ; then
+ echo '<<<zfslist>>>'
+ zfs list -H -o name,used,avail,mountpoint
+fi
+
# Check NFS mounts by accessing them with stat -f (System
# call statfs()). If this lasts more then 2 seconds we
# consider it as hanging. We need waitmax.
diff --git a/agents/check_mk_agent.solaris b/agents/check_mk_agent.solaris
index 36f0d3d..f005b4d 100755
--- a/agents/check_mk_agent.solaris
+++ b/agents/check_mk_agent.solaris
@@ -60,7 +60,7 @@ else
fi
echo '<<<df>>>'
-for fs in ufs zfs vxfs
+for fs in ufs vxfs
do
df -lk -F $fs 2>/dev/null | sed 1d | \
while read Filesystem kbytes used avail capacity Mountedon
@@ -70,6 +70,12 @@ do
done
done
+# Filesystem usage for ZFS
+if type zfs > /dev/null 2>&1 ; then
+ echo '<<<zfslist>>>'
+ zfs list -H -o name,used,avail,mountpoint
+fi
+
# Processes
echo '<<<ps>>>'
ps -A -o user,vsz,rss,pcpu,args | sed -e 1d -e 's/ *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) */(\1,\2,\3,\4) /'
diff --git a/checkman/zfslist b/checkman/zfslist
new file mode 100644
index 0000000..0fffdd1
--- /dev/null
+++ b/checkman/zfslist
@@ -0,0 +1,13 @@
+title: Check used space in ZFS
+agents: linux, solaris, freebsd
+author: Mathias Kettner <mk(a)mathias-kettner.de>
+license: GPL
+distribution: check_mk
+description:
+ This check monitors the usage of ZFS filesystems using the output
+ of the command {zfslist}. This is done in a separate check since
+ the output of {df} does not show the required metrics when ZFS
+ is used with quotas.
+
+ The check is fully compatible with {df} with respect to its configuration,
+ output and logic. Please refer to the manual of {df} for details.
diff --git a/checks/zfslist b/checks/zfslist
new file mode 100644
index 0000000..9130850
--- /dev/null
+++ b/checks/zfslist
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+# +------------------------------------------------------------------+
+# | ____ _ _ __ __ _ __ |
+# | / ___| |__ ___ ___| | __ | \/ | |/ / |
+# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
+# | | |___| | | | __/ (__| < | | | | . \ |
+# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
+# | |
+# | Copyright Mathias Kettner 2012 mk(a)mathias-kettner.de |
+# +------------------------------------------------------------------+
+#
+# This file is part of Check_MK.
+# The official homepage is at http://mathias-kettner.de/check_mk.
+#
+# check_mk is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation in version 2. check_mk is distributed
+# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
+# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. See the GNU General Public License for more de-
+# ails. You should have received a copy of the GNU General Public
+# License along with GNU Make; see the file COPYING. If not, write
+# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301 USA.
+
+# Example output from agent:
+# <<<zfslist>>>
+# bpool 12.0T 19.1T /bpool
+# bpool/diskcache_fs 12.0T 19.1T /backup/diskcache
+# rpool 20.2G 893G /rpool
+# rpool/ROOT 3.33G 4.67G legacy
+# rpool/ROOT/zfsroot 3.33G 4.67G /
+# rpool/ROOT/zfsroot/var 1.84G 4.67G /var
+# rpool/dump 8.00G 893G -
+# rpool/export 845M 887G /export
+# rpool/export/home 3.67M 887G /home
+# rpool/export/opt 842M 887G /opt
+# rpool/swap 8.00G 893G -
+#
+# The columns are: name, used, avail, mountpoint
+
+
+def inventory_zfslist(info):
+ mplist = []
+ for name, used, avail, mountpoint in info:
+ if mountpoint not in inventory_df_exclude_mountpoints \
+ and mountpoint != '-':
+ mplist.append(mountpoint)
+ return df_inventory(mplist)
+
+def convert_zfssize(txt):
+ units_to_mb = {
+ 'K' : 1/1024.0,
+ 'M' : 1.0,
+ 'G' : 1024.0,
+ 'T' : 1024 * 1024.0,
+ 'P' : 1024 * 1024 * 1024.0,
+ }
+ return float(txt[:-1]) * units_to_mb[txt[-1]]
+
+
+def check_zfslist(item, params, info):
+ fslist = []
+ for name, used_txt, avail_txt, mountpoint in info:
+ if "patterns" in params or item == mountpoint:
+ used_mb = convert_zfssize(used_txt)
+ avail_mb = convert_zfssize(avail_txt)
+ size_mb = used_mb + avail_mb
+ fslist.append((mountpoint, size_mb, avail_mb))
+
+ return df_check_filesystem_list(item, params, fslist)
+
+
+check_info['zfslist'] = {
+ "check_function" : check_zfslist,
+ "inventory_function" : inventory_zfslist,
+ "service_description" : "fs_%s",
+ "has_perfdata" : True,
+ "group" : "filesystem",
+ "default_levels_variable" : "filesystem_default_levels",
+ "includes" : [ "df.include" ],
+}
diff --git a/pnp-templates/check_mk-zfslist.php b/pnp-templates/check_mk-zfslist.php
new file mode 120000
index 0000000..28b85a4
--- /dev/null
+++ b/pnp-templates/check_mk-zfslist.php
@@ -0,0 +1 @@
+check_mk-df.php
\ No newline at end of file
diff --git a/web/plugins/perfometer/check_mk.py b/web/plugins/perfometer/check_mk.py
index 32992ce..fd3f1fd 100644
--- a/web/plugins/perfometer/check_mk.py
+++ b/web/plugins/perfometer/check_mk.py
@@ -67,6 +67,7 @@ perfometers["check_mk-vms_diskstat.df"] = perfometer_check_mk_df
perfometers["check_disk"] = perfometer_check_mk_df
perfometers["check_mk-df_netapp"] = perfometer_check_mk_df
perfometers["check_mk-df_netapp32"] = perfometer_check_mk_df
+perfometers["check_mk-zfslist"] = perfometer_check_mk_df
perfometers["check_mk-hr_fs"] = perfometer_check_mk_df
perfometers["check_mk-oracle_asm_diskgroup"] = perfometer_check_mk_df
perfometers["check_mk-mysql_capacity"] = perfometer_check_mk_df