Module: check_mk
Branch: master
Commit: 38574a882bb7e6187c5dc9587e250dca54c25861
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=38574a882bb7e6…
Author: Simon Betz <si(a)mathias-kettner.de>
Date: Fri Jan 13 11:02:21 2017 +0100
4292 FIX oracle_asm_diskgroup: fixed handling if disk status is DISMOUNTED
Change-Id: Idbe2b2cd469efa1746eed1aa9ed8a9a1d8f20591
---
.werks/4292 | 10 +++
ChangeLog | 1 +
checks/oracle_asm_diskgroup | 178 ++++++++++++++++++++++++++++----------------
3 files changed, 123 insertions(+), 66 deletions(-)
diff --git a/.werks/4292 b/.werks/4292
new file mode 100644
index 0000000..c46702b
--- /dev/null
+++ b/.werks/4292
@@ -0,0 +1,10 @@
+Title: oracle_asm_diskgroup: fixed handling if disk status is DISMOUNTED
+Level: 1
+Component: checks
+Class: fix
+Compatible: compat
+State: unknown
+Version: 1.4.0i4
+Date: 1484301711
+
+
diff --git a/ChangeLog b/ChangeLog
index b54b158..25c9bbc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -54,6 +54,7 @@
* 4275 FIX: ibm_imm_voltage: Fixed not working perfdata processing
* 4010 FIX: netapp_api_qtree_quota: now only includes quotas where disk-limits are
set
* 4278 FIX: check_mail_loop: Added missing Date header to sent mails
+ * 4292 FIX: oracle_asm_diskgroup: fixed handling if disk status is DISMOUNTED
Multisite:
* 4169 View action: Default values of sticky, notification and persistent options can
now be configured via global settings....
diff --git a/checks/oracle_asm_diskgroup b/checks/oracle_asm_diskgroup
index 3a74d31..3286513 100644
--- a/checks/oracle_asm_diskgroup
+++ b/checks/oracle_asm_diskgroup
@@ -24,13 +24,21 @@
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
+
# Example output from asmcmd lsdg:
# State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB
Usable_file_MB Offline_disks Voting_files Name
# MOUNTED NORMAL N 512 4096 1048576 512000 92888 0
46444 0 N DATA/
# MOUNTED NORMAL N 512 4096 1048576 3072 2146 309
918 0 Y OCR_VOTE/
# DISMOUNTED N 0 0 0 0 0 0 0 0 N DB_DG1/
+# DISMOUNTED N 0 4096 0 0 0 0 0 0 N ABC/
+# MOUNTED EXTERN N 512 4096 1048576 2047984 163379 0 163379 0 N XYZ/
+# MOUNTED EXTERN N 512 4096 1048576 307092 291710 0 291710 0 N HUHU/
+# DISMOUNTED N 0 4096 0 0 0 0 0 0 N FOO/
+# DISMOUNTED N 0 4096 0 0 0 0 0 0 N BAR/
+
# The agent section <<<oracle_asm_diskgroup>>> does not output the
header line
+
factory_settings["asm_diskgroup_default_levels"] = {
"levels" : (80.0, 90.0), # warn/crit in percent
"magic_normsize" : 20, # Standard size if 20 GB
@@ -40,92 +48,130 @@ factory_settings["asm_diskgroup_default_levels"] = {
"req_mir_free" : False, # Ignore Requirre mirror free space in DG
}
-def inventory_oracle_asm_diskgroup(info):
- return [ (line[-1].rstrip("/"), {}) for line in info
- if len(line) in [ 12, 13 ] and line[0] in [ "MOUNTED",
"DISMOUNTED" ] ]
-def check_oracle_asm_diskgroup(item, params, info):
+def parse_oracle_asm_diskgroup(info):
+ parsed = {}
for line in info:
- voting_files = 'N'
-
- if len(line) == 13:
- state, typ, rebal, sector, block, au, total_mb, \
- free_mb, req_mir_free_mb, usable_file_mb, offline_disks, \
- voting_files, name = line
- elif len(line) == 12:
- state, typ, rebal, sector, block, au, total_mb, \
- free_mb, req_mir_free_mb, usable_file_mb, offline_disks, \
- name = line
- else:
- continue # Invalid data, skip this line
-
- if state not in [ "MOUNTED", "DISMOUNTED" ]:
- continue # Invalid data, skip this line
-
- dg_name = name.rstrip('/')
-
- if dg_name == item:
-
- # Indices are wrong: TYPE missing, only critical if block==0 (T.Bruhns)
- if state == "DISMOUNTED" and line[3] == "0":
- return 2, "Disk dismounted"
-
- add_text = ""
- if typ in ('NORMAL', 'HIGH'):
- if typ == 'NORMAL':
- if voting_files == 'Y':
- # NORMAL Redundancy Disk-Groups with Voting requires 3
Failgroups
- dg_factor = 3
- else:
- dg_factor = 2
+ diskstate = line[0]
+ if diskstate == "DISMOUNTED":
+ disktype = None
+ index = 1
- elif typ == 'HIGH':
- if voting_files == 'Y':
- # HIGH Redundancy Disk-Groups with Voting requires 5 Failgroups
- dg_factor = 5
- else:
- dg_factor = 3
+ elif diskstate == "MOUNTED":
+ disktype = line[1]
+ index = 2
- total_mb = int(total_mb)/dg_factor
- free_space_mb = int(free_mb)/dg_factor
-
- if params.get('req_mir_free'):
-
- req_mir_free_mb = int(req_mir_free_mb)
+ else:
+ continue
- if req_mir_free_mb < 0:
- # requirred mirror free space could be negative!
- req_mir_free_mb = 0
+ stripped_line = line[index:]
- free_space_mb = int(req_mir_free_mb)
+ if len(stripped_line) == 10:
+ rebal, sector, block, au, total_mb, free_mb, req_mir_free_mb, \
+ usable_file_mb, offline_disks, diskname = stripped_line
+ voting_files = "N"
- add_text = ', required mirror free space used'
+ elif len(stripped_line) == 11:
+ rebal, sector, block, au, total_mb, free_mb, req_mir_free_mb, \
+ usable_file_mb, offline_disks, voting_files, diskname = stripped_line
- else:
- # EXTERNAL Redundancy
- free_space_mb = int(free_mb)
+ else:
+ continue
+
+ parsed.setdefault(diskname.rstrip("/"), {
+ "diskstate" : diskstate,
+ "disktype" : disktype,
+ "rebal" : rebal,
+ "sector" : sector,
+ "block" : block,
+ "au" : au,
+ "total_mb" : total_mb,
+ "free_mb" : free_mb,
+ "req_mir_free_mb" : req_mir_free_mb,
+ "usable_file_mb" : usable_file_mb,
+ "offline_disks" : offline_disks,
+ "voting_files" : voting_files,
+ })
+
+ return parsed
+
+
+def inventory_oracle_asm_diskgroup(parsed):
+ for asm_diskgroup_name, attrs in parsed.items():
+ if attrs["diskstate"] in [ "MOUNTED", "DISMOUNTED"
]:
+ yield asm_diskgroup_name, {}
+
+
+def check_oracle_asm_diskgroup(item, params, parsed):
+ if item in parsed:
+ data = parsed[item]
+ diskstate = data["diskstate"]
+ disktype = data["disktype"]
+ block = data["block"]
+ total_mb = data["total_mb"]
+ free_mb = data["free_mb"]
+ req_mir_free_mb = data["req_mir_free_mb"]
+ offline_disks = data["offline_disks"]
+ voting_files = data["voting_files"]
+
+ if diskstate == "DISMOUNTED" and block == "0":
+ return 2, "Disk dismounted"
+
+ add_text = ""
+ if disktype in ('NORMAL', 'HIGH'):
+ if disktype == 'NORMAL':
+ if voting_files == 'Y':
+ # NORMAL Redundancy Disk-Groups with Voting requires 3 Failgroups
+ dg_factor = 3
+ else:
+ dg_factor = 2
+
+ elif disktype == 'HIGH':
+ if voting_files == 'Y':
+ # HIGH Redundancy Disk-Groups with Voting requires 5 Failgroups
+ dg_factor = 5
+ else:
+ dg_factor = 3
+
+ total_mb = int(total_mb)/dg_factor
+ free_space_mb = int(free_mb)/dg_factor
+
+ if params.get('req_mir_free'):
+ req_mir_free_mb = int(req_mir_free_mb)
+ if req_mir_free_mb < 0:
+ # requirred mirror free space could be negative!
+ req_mir_free_mb = 0
+
+ free_space_mb = int(req_mir_free_mb)
+ add_text = ', required mirror free space used'
- status, infotext, perfdata = df_check_filesystem(g_hostname, item,
int(total_mb),
- free_space_mb, 0, params)
+ else:
+ # EXTERNAL Redundancy
+ free_space_mb = int(free_mb)
- infotext += ', %s redundancy' % typ.lower()
- infotext += add_text
+ status, infotext, perfdata = df_check_filesystem(g_hostname, item,
int(total_mb),
+ free_space_mb, 0, params)
+ if disktype is not None:
+ infotext += ', %s redundancy' % disktype.lower()
+ infotext += add_text
- offline_disks = int(offline_disks)
- if offline_disks > 0:
- status = max(2, status)
- infotext += ', %d Offline disks found(!!)' % offline_disks
+ offline_disks = int(offline_disks)
+ if offline_disks > 0:
+ status = max(2, status)
+ infotext += ', %d Offline disks found(!!)' % offline_disks
- return (status, infotext, perfdata)
+ return status, infotext, perfdata
# In case of missing information we assume that the ASM-Instance is
# checked at a later time.
# This reduce false notifications for not running ASM-Instances
raise MKCounterWrapped("Diskgroup %s not found" % item)
+
check_info["oracle_asm_diskgroup"] = {
- 'check_function' : check_oracle_asm_diskgroup,
+ 'parse_function' : parse_oracle_asm_diskgroup,
'inventory_function' : inventory_oracle_asm_diskgroup,
+ 'check_function' : check_oracle_asm_diskgroup,
'service_description' : 'ASM Diskgroup %s',
'has_perfdata' : True,
'group' : 'asm_diskgroup',