diff options
author | ndarshan <dnarayan@redhat.com> | 2014-11-13 13:55:24 +0530 |
---|---|---|
committer | Bala FA <barumuga@redhat.com> | 2014-11-18 02:12:20 -0800 |
commit | bc2106ee7ea6cd9f243c40c9d15596f555c45505 (patch) | |
tree | 56f2c0ce168ce7503e8f4c8e03ab1003ea9460bd /plugins | |
parent | 9f572a260da19cb6ae6f2f3ee5c1a58ba6c48de7 (diff) |
gluster-nagios-addons: Add thin lv details to check_disk_and_inode plugin.
check_disk_and_inode plugin is modified to show the
underlying thin pool details when invoked with -t
option. This is used to get the brick utilization.
If the brick is made up of thin lv then it returns
the virtual and actual utilization detail else
the plugin returns the normal output.
Change-Id: I2a2853a1b6e3e91c0178c3ed1cbc34de88ce3da2
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1143995
Signed-off-by: ndarshan <dnarayan@redhat.com>
Reviewed-on: http://review.gluster.org/9115
Reviewed-by: Sahina Bose <sabose@redhat.com>
Reviewed-by: Bala FA <barumuga@redhat.com>
Diffstat (limited to 'plugins')
-rwxr-xr-x | plugins/check_disk_and_inode.py | 126 |
1 files changed, 104 insertions, 22 deletions
diff --git a/plugins/check_disk_and_inode.py b/plugins/check_disk_and_inode.py index 393bd94..813fbc5 100755 --- a/plugins/check_disk_and_inode.py +++ b/plugins/check_disk_and_inode.py @@ -37,6 +37,34 @@ def getVal(val): return 0 +def getLVdetails(filename, lvs): + dev_name = os.path.realpath(filename) + + pool = "" + disk = {} + for a in lvs: + dev = os.path.realpath(a['LVM2_LV_PATH']) + if dev_name == dev: + if a['LVM2_LV_ATTR'][0] == 'V': + pool = a['LVM2_POOL_LV'] + disk['thinLv'] = True + break + else: + disk['thinLv'] = False + return disk + else: + return None + for b in lvs: + if b['LVM2_LV_NAME'] == pool: + disk['actualUsedPercent'] = float(b['LVM2_DATA_PERCENT']) + disk['actualTotalSize'] = float(b['LVM2_LV_SIZE']) + disk['actualUsed'] = disk['actualTotalSize'] * disk[ + 'actualUsedPercent'] / 100 + return disk + else: + return None + + def getUsageAndFree(command, path, crit, warn, lvm): disk = {'path': None, 'usePcent': 0, 'avail': 0, 'used': 0, 'size': 0, 'fs': None, @@ -78,6 +106,7 @@ def getUsageAndFree(command, path, crit, warn, lvm): disk['size'] = getVal(status[-5]) disk['fs'] = status[-6] disk['usePcent'] = getVal(status[-2]) + if disk['usePcent'] >= crit: disk['statusCode'] = utils.PluginStatusCode.CRITICAL elif disk['usePcent'] >= warn: @@ -85,7 +114,6 @@ def getUsageAndFree(command, path, crit, warn, lvm): elif disk['usePcent'] < warn: disk['statusCode'] = utils.PluginStatusCode.OK disk['availPcent'] = 100 - disk['usePcent'] - return disk @@ -150,6 +178,10 @@ def parse_input(): parser.add_option('-s', action="store_true", default=False, dest='showErrorDisk', help='Show critical or warning disks in the status') + parser.add_option('-t', '--thinPool', action="store_true", + dest='thinPool', + help='Lists detail of underlying thin pool', + default=False) return parser.parse_args() @@ -182,7 +214,8 @@ def _getUnitAndType(val): def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False, - isLvm=False, ignoreError=False, showErrorDisk=True): + isLvm=False, ignoreError=False, showErrorDisk=True, + thinPool=False): diskPerf = [] warnList = [] critList = [] @@ -194,9 +227,42 @@ def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False, noOfMounts = len(mountPaths) maxPercentUsed = 0 + if thinPool: + rc, out, err = utils.execCmd(["lvm"] + + ("vgs --unquoted --noheading " + + "--nameprefixes --separator : " + + "--nosuffix --units g -o " + + "lv_path,data_percent,pool_lv,lv_attr," + "lv_size,lv_name").split()) + if rc == 0: + res = [] + for i in out: + tem = i.split(":") + dct = {} + for j in tem: + tp = j.split("=") + dct[tp[0].replace(" ", "")] = tp[1] + res.append(dct) + else: + thinPool = False + for path in mountPaths: disk = getDisk(path, crit, warn, usage, isLvm) inode = getInode(path, crit, warn, isLvm) + if thinPool: + thinLv = getLVdetails(disk['fs'], res) + if thinLv and thinLv['thinLv']: + if disk['usePcent'] >= crit or thinLv[ + 'actualUsedPercent'] >= crit: + disk['statusCode'] = utils.PluginStatusCode.CRITICAL + elif disk['usePcent'] >= warn or thinLv[ + 'actualUsedPercent'] >= warn: + disk['statusCode'] = utils.PluginStatusCode.WARNING + elif disk['usePcent'] < warn or thinLv[ + 'actualUsedPercent'] < warn: + disk['statusCode'] = utils.PluginStatusCode.OK + else: + thinPool = False if disk['path'] in mounts: continue @@ -223,13 +289,24 @@ def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False, crit * inode['used'] / 100, inode['size']) elif disk['path']: - data = "%s=%.2f%%;%s;%s;0;%s" % ( - disk['path'], - disk['usePcent'], - warn, - crit, - disk['size']) - + if thinPool and thinLv['thinLv']: + data = "Virtual=%.2f%%;%s;%s;0;%s" % ( + disk['usePcent'], + warn, + crit, + disk['size']) + data += " Thin-pool=%.2f%%;%s;%s;0;%.1f" % ( + thinLv['actualUsedPercent'], + warn, + crit, + thinLv['actualTotalSize']) + else: + data = "%s=%.2f%%;%s;%s;0;%s" % ( + disk['path'], + disk['usePcent'], + warn, + crit, + disk['size']) if toListInode: data += " %s=%.2f%%;%s;%s;0;%s" % ( inode['path'], @@ -299,22 +376,26 @@ def showDiskUsage(warn, crit, mountPaths, toListInode, usage=False, if not usage: totUsedSz, totUsedSzUnit = _getUnitAndType(totalUsed) totSpaceSz, totSpaceSzUnit = _getUnitAndType(totalSize) - usageMsg = "%.1f%% used (%s%s out of %s%s)\n" % (totUsagePercent, - totUsedSz, - totUsedSzUnit, - totSpaceSz, - totSpaceSzUnit) + usageMsg = "%.1f%% used (%s%s out of %s%s)" % (totUsagePercent, + totUsedSz, + totUsedSzUnit, + totSpaceSz, + totSpaceSzUnit) + if thinPool and thinLv['thinLv']: + usageMsg += " [Thin-pool: %.1f%% (%.1fG out of %.1fG)]" % ( + thinLv['actualUsedPercent'], + thinLv['actualUsed'], + thinLv['actualTotalSize']) else: - usageMsg = "%.1f%% used (%s%s out of %s%s)\n" % (totUsagePercent, - totalUsed, - usage, - totalSize, - usage) - + usageMsg = "%.1f%% used (%s%s out of %s%s)" % (totUsagePercent, + totalUsed, + usage, + totalSize, + usage) if showErrorDisk: msg = "%s\n:mount(s): (%s)" % (errorDiskMsg, msg) else: - msg = "%s:mount(s): (%s)" % (usageMsg, msg) + msg = "%s\n:mount(s): (%s)" % (usageMsg, msg) return statusCode, msg, diskPerf @@ -337,7 +418,8 @@ if __name__ == '__main__': options.usage, options.lvm, options.ignore, - options.showErrorDisk) + options.showErrorDisk, + options.thinPool) if utils.PluginStatusCode.CRITICAL == statusCode: sys.stdout.write("%s : %s | %s\n" % ( |