Cleanup config.nodes_of
[check_mk.git] / checks / mssql.include
blob4002c97dc37a3ee99baaddcb4caa3e861e0aa96c
1 #!/usr/bin/python
2 # -*- encoding: utf-8; py-indent-offset: 4 -*-
3 # +------------------------------------------------------------------+
4 # | ____ _ _ __ __ _ __ |
5 # | / ___| |__ ___ ___| | __ | \/ | |/ / |
6 # | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
7 # | | |___| | | | __/ (__| < | | | | . \ |
8 # | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
9 # | |
10 # | Copyright Mathias Kettner 2016 mk@mathias-kettner.de |
11 # +------------------------------------------------------------------+
13 # This file is part of Check_MK.
14 # The official homepage is at http://mathias-kettner.de/check_mk.
16 # check_mk is free software; you can redistribute it and/or modify it
17 # under the terms of the GNU General Public License as published by
18 # the Free Software Foundation in version 2. check_mk is distributed
19 # in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
20 # out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
21 # PARTICULAR PURPOSE. See the GNU General Public License for more de-
22 # ails. You should have received a copy of the GNU General Public
23 # License along with GNU Make; see the file COPYING. If not, write
24 # to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
25 # Boston, MA 02110-1301 USA.
27 # .--helper--------------------------------------------------------------.
28 # | _ _ |
29 # | | |__ ___| |_ __ ___ _ __ |
30 # | | '_ \ / _ \ | '_ \ / _ \ '__| |
31 # | | | | | __/ | |_) | __/ | |
32 # | |_| |_|\___|_| .__/ \___|_| |
33 # | |_| |
34 # '----------------------------------------------------------------------'
37 def _format_item_mssql_datafiles(inst, database, file_name):
38 if inst is None:
39 return "%s.%s" % (database, file_name)
40 elif file_name is None:
41 return "%s.%s" % (inst, database)
42 return "%s.%s.%s" % (inst, database, file_name)
45 def _mssql_datafiles_process_sizes(params, used_size, allocated_size, max_size, unlimited):
46 def calculate_levels(levels, reference_value):
47 if isinstance(levels[0], float):
48 if reference_value != -1:
49 return [(x * reference_value) / 100 for x in levels]
50 elif levels[0] is not None:
51 return [x * 1024 * 1024 for x in levels]
53 return None, None
55 if unlimited:
56 max_size = -1
58 rel_levels = False
60 for param_key, name, perf_key, value, reference_value in [
61 ('used_levels', "used", "data_size", used_size, max_size),
62 ('allocated_used_levels', "allocated used", None, used_size, allocated_size),
63 ('allocated_levels', "allocated", "allocated_size", allocated_size, max_size),
65 status = 0
67 levels = params.get(param_key, (None, None))
68 if isinstance(levels, list):
69 warn, crit = None, None
70 for level_set in levels:
71 if max_size > level_set[0]:
72 warn, crit = calculate_levels(level_set[1], reference_value)
73 break
74 else:
75 warn, crit = calculate_levels(levels, reference_value)
76 if isinstance(levels[0], float):
77 rel_levels = True
79 if crit is not None and value >= crit:
80 status = 2
81 elif warn is not None and value >= warn:
82 status = 1
84 if status > 0:
85 wc_msg = " (warn/crit at %s/%s)" % (get_bytes_human_readable(warn),
86 get_bytes_human_readable(crit))
87 else:
88 wc_msg = ""
90 if perf_key is not None or status != 0:
91 if reference_value == -1:
92 yield status, "%s %s%s" %\
93 (get_bytes_human_readable(value),
94 name, wc_msg), \
95 [(perf_key, value, warn, crit)]
96 else:
97 yield status, "%s of %s %s%s" %\
98 (get_bytes_human_readable(value),
99 get_bytes_human_readable(reference_value),
100 name, wc_msg), \
101 [(perf_key, value, warn, crit, 0, reference_value)]
103 if unlimited and rel_levels:
104 yield 0, "no maximum size", []
109 mssql_transactionlogs_discovery = []
112 def parse_mssql_datafiles(info):
113 parsed = {}
114 for line in info:
115 if line[-1].startswith("ERROR: "):
116 continue
117 if len(line) == 8:
118 inst, database, file_name, _physical_name, max_size, allocated_size, used_size, unlimited = line
119 unlimited = unlimited == '1'
120 else:
121 database, file_name, _physical_name, max_size, allocated_size, used_size = line
122 inst = None
123 unlimited = False
125 mssql_instance = parsed.setdefault((inst, database, file_name), {"unlimited": unlimited})
126 for key, value_str in [
127 ("max_size", max_size),
128 ("allocated_size", allocated_size),
129 ("used_size", used_size),
131 try:
132 value = float(value_str) * 1024 * 1024
133 except ValueError:
134 value = None
135 mssql_instance[key] = value
136 return parsed
139 def inventory_mssql_datafiles(mode, parsed):
140 settings = host_extra_conf(host_name(), mssql_transactionlogs_discovery)
141 summarize = settings and settings[0].get("summarize_%s" % mode, False)
142 for inst, database, file_name in parsed.iterkeys():
143 if summarize:
144 yield _format_item_mssql_datafiles(inst, database, None), {}
145 else:
146 yield _format_item_mssql_datafiles(inst, database, file_name), {}
149 def check_mssql_datafiles(item, params, parsed):
150 max_size_sum = 0
151 allocated_size_sum = 0
152 used_size_sum = 0
153 unlimited_sum = False
155 found = False
156 for (inst, database, file_name), values in parsed.iteritems():
157 if _format_item_mssql_datafiles(inst, database, file_name) == item or \
158 _format_item_mssql_datafiles(inst, database, None) == item:
159 found = True
160 max_size = values["max_size"]
161 allocated_size = values["allocated_size"]
162 used_size = values["used_size"]
163 if max_size:
164 max_size_sum += max_size
165 if allocated_size:
166 allocated_size_sum += allocated_size
167 if used_size:
168 used_size_sum += used_size
169 unlimited_sum = unlimited_sum or values["unlimited"]
171 if not found:
172 # Assume general connection problem to the database, which is reported
173 # by the "X Instance" service and skip this check.
174 raise MKCounterWrapped("Failed to connect to database")
176 return _mssql_datafiles_process_sizes(params, used_size_sum, allocated_size_sum, max_size_sum,
177 unlimited_sum)