def check_metric(self, metric_name, thresholds): """ Check one specific metric against a list of thresholds. Updates self.status() and writes to summary or longout as appropriate. Arguments: metric_name -- A string representing the name of the metric (the label part of the performance data) thresholds -- a list in the form of [ (level,range) ] where range is a string in the format of "start..end" Examples: >>> thresholds = [(warning,'2..5'),(critical,'5..inf')] >>> p = PluginHelper() >>> p.check_metric('load15',thresholds) Returns: None """ metric = self.get_metric(label=metric_name) # If threshold was specified but metric not found in our data, set status unknown if metric is None: self.status(unknown) self.add_summary("Metric %s not found" % (metric_name)) return metric_status = -1 # by default assume nothing metric_was_outside_ok_range = False # Will go to true only if ok range is specified highest_level = ok # highest threshold range seen for level, threshold_range in thresholds: highest_level = max(highest_level, level) if metric.warn == '' and level == warning: metric.warn = threshold_range elif metric.crit == '' and level == critical: metric.crit = threshold_range if new_threshold_syntax.check_range(metric.value, threshold_range): metric_status = max(metric_status, level) self.debug('%s is within %s range "%s"' % (metric_name, state_text[level], threshold_range)) else: self.debug('%s is outside %s range "%s"' % (metric_name, state_text[level],threshold_range)) metric_was_outside_ok_range = True # If no thresholds were specified, lets put state to OK metric_status = max(metric_status, OK) # If an ok range was specified, and value was outside of it, # we should return critical if warn or crit were specified: if metric_was_outside_ok_range == True and highest_level == ok: metric_status = max(metric_status, critical) # OK's go to long output, errors go directly to summary self.add_status(metric_status) message = '%s on %s' % (state_text[metric_status], metric_name) # Errors are added to the summary: if metric_status > 0: self.add_summary(message) if self.verbose == True: self.add_long_output(message)
def check_metric(self, metric_name, thresholds): """ Check one specific metric against a list of thresholds. Updates self.status() and writes to summary or longout as appropriate. Arguments: metric_name -- A string representing the name of the metric (the label part of the performance data) thresholds -- a list in the form of [ (level,range) ] where range is a string in the format of "start..end" Examples: >>> p = PluginHelper() >>> thresholds = [(warning,'2..5'), (critical,'5..inf')] >>> p.get_plugin_output() 'Unknown -' >>> p.add_metric('load15', '3') >>> p.check_metric('load15',thresholds) >>> p.get_plugin_output() "Warning - Warning on load15 | 'load15'=3;2..5;5..inf;;" >>> p = PluginHelper() >>> thresholds = [(warning,'2..5'), (critical,'5..inf')] >>> p.add_metric('load15', '3') >>> p.verbose = True >>> p.check_metric('load15',thresholds) >>> p.get_plugin_output() "Warning - Warning on load15 | 'load15'=3;2..5;5..inf;;\\nWarning on load15" Invalid metric: >>> p = PluginHelper() >>> p.add_status(ok) >>> p.add_summary('Everythings fine!') >>> p.get_plugin_output() 'OK - Everythings fine!' >>> thresholds = [(warning,'2..5'), (critical,'5..inf')] >>> p.check_metric('never_added_metric', thresholds) >>> p.get_plugin_output() 'Unknown - Everythings fine!. Metric never_added_metric not found' Invalid threshold: >>> p = PluginHelper() >>> thresholds = [(warning, 'invalid'), (critical,'5..inf')] >>> p.add_metric('load1', '10') >>> p.check_metric('load1', thresholds) Traceback (most recent call last): ... SystemExit: 3 Returns: None """ metric = self.get_metric(label=metric_name) # If threshold was specified but metric not found in our data, set status unknown if metric is None: self.status(unknown) self.add_summary("Metric %s not found" % (metric_name)) return metric_status = -1 # by default assume nothing default_state = 0 # By default if no treshold matches, we assume OK highest_level = ok # highest threshold range seen # Iterate through all thresholds, and log down warn and crit for perfdata purposes for level, threshold_range in thresholds: if metric.warn == '' and level == warning: metric.warn = threshold_range elif metric.crit == '' and level == critical: metric.crit = threshold_range if level == ok: default_state = 2 # Iterate all threshold and determine states for level, threshold_range in thresholds: highest_level = max(highest_level, level) # If ok threshold was specified, default state is critical according to spec # If value matches our threshold, we increment the status try: in_range = new_threshold_syntax.check_range(metric.value, threshold_range) except PynagError: self.set_summary( "Could not parse threshold %s=%s for metric %s" % (state_text[level], threshold_range, metric_name) ) self.set_long_output("Thresholds should be in the format metric=<metric_name>,ok=0..90,warning=90..95") self.add_long_output("Example: ") self.add_long_output("--th metric=load,ok=0..1,warning=1..5,critical=5..inf") self.status(unknown) self.exit() if in_range: metric_status = max(metric_status, level) self.debug('%s is within %s range "%s"' % (metric_name, state_text[level], threshold_range)) if level == ok: self.debug("OK threshold matches, not checking any more thresholds") metric_status = ok break else: self.debug('%s is outside %s range "%s"' % (metric_name, state_text[level],threshold_range)) # If no thresholds matched, set a default return code if metric_status < 0: metric_status = default_state # OK's go to long output, errors go directly to summary self.add_status(metric_status) message = '%s on %s' % (state_text[metric_status], metric_name) # Errors are added to the summary: if metric_status > 0: self.add_summary(message) if self.verbose == True: self.add_long_output(message)
def check_metric(self, metric_name, thresholds): """ Check one specific metric against a list of thresholds. Updates self.status() and writes to summary or longout as appropriate. Arguments: metric_name -- A string representing the name of the metric (the label part of the performance data) thresholds -- a list in the form of [ (level,range) ] where range is a string in the format of "start..end" Examples: >>> thresholds = [(warning,'2..5'),(critical,'5..inf')] >>> p = PluginHelper() >>> p.check_metric('load15',thresholds) Returns: None """ metric = self.get_metric(label=metric_name) # If threshold was specified but metric not found in our data, set status unknown if metric is None: self.status(unknown) self.add_summary("Metric %s not found" % (metric_name)) return metric_status = -1 # by default assume nothing default_state = 0 # By default if no treshold matches, we assume OK highest_level = ok # highest threshold range seen # Iterate through all thresholds, and log down warn and crit for perfdata purposes for level, threshold_range in thresholds: if metric.warn == '' and level == warning: metric.warn = threshold_range elif metric.crit == '' and level == critical: metric.crit = threshold_range if level == ok: default_state = 2 # Iterate all threshold and determine states for level, threshold_range in thresholds: highest_level = max(highest_level, level) # If ok threshold was specified, default state is critical according to spec # If value matches our threshold, we increment the status if new_threshold_syntax.check_range(metric.value, threshold_range): metric_status = max(metric_status, level) self.debug('%s is within %s range "%s"' % (metric_name, state_text[level], threshold_range)) if level == ok: self.debug("OK threshold matches, not checking any more thresholds") metric_status = ok break else: self.debug('%s is outside %s range "%s"' % (metric_name, state_text[level],threshold_range)) # If no thresholds matched, set a default return code if metric_status < 0: metric_status = default_state # OK's go to long output, errors go directly to summary self.add_status(metric_status) message = '%s on %s' % (state_text[metric_status], metric_name) # Errors are added to the summary: if metric_status > 0: self.add_summary(message) if self.verbose == True: self.add_long_output(message)
def check_metric(self, metric_name, thresholds): """ Check one specific metric against a list of thresholds. Updates self.status() and writes to summary or longout as appropriate. Arguments: metric_name -- A string representing the name of the metric (the label part of the performance data) thresholds -- a list in the form of [ (level,range) ] where range is a string in the format of "start..end" Examples: >>> p = PluginHelper() >>> thresholds = [(warning,'2..5'), (critical,'5..inf')] >>> p.get_plugin_output() 'Unknown -' >>> p.add_metric('load15', '3') >>> p.check_metric('load15',thresholds) >>> p.get_plugin_output() "Warning - Warning on load15 | 'load15'=3;@2:5;~:5;;" >>> p = PluginHelper() >>> thresholds = [(warning,'2..5'), (critical,'5..inf')] >>> p.add_metric('load15', '3') >>> p.verbose = True >>> p.check_metric('load15',thresholds) >>> p.get_plugin_output() "Warning - Warning on load15 | 'load15'=3;@2:5;~:5;;\\nWarning on load15" Invalid metric: >>> p = PluginHelper() >>> p.add_status(ok) >>> p.add_summary('Everythings fine!') >>> p.get_plugin_output() 'OK - Everythings fine!' >>> thresholds = [(warning,'2..5'), (critical,'5..inf')] >>> p.check_metric('never_added_metric', thresholds) >>> p.get_plugin_output() 'Unknown - Everythings fine!. Metric never_added_metric not found' Invalid threshold: >>> p = PluginHelper() >>> thresholds = [(warning, 'invalid'), (critical,'5..inf')] >>> p.add_metric('load1', '10') >>> p.check_metric('load1', thresholds) Traceback (most recent call last): ... SystemExit: 3 Returns: None """ metric = self.get_metric(label=metric_name) # If threshold was specified but metric not found in our data, set # status unknown if metric is None: self.status(unknown) self.add_summary("Metric %s not found" % (metric_name)) return metric_status = -1 # by default assume nothing default_state = 0 # By default if no treshold matches, we assume OK highest_level = ok # highest threshold range seen # Iterate through all thresholds, and log down warn and crit for # perfdata purposes for level, threshold_range in thresholds: if metric.warn == '' and level == warning: metric.warn = threshold_range elif metric.crit == '' and level == critical: metric.crit = threshold_range if level == ok: default_state = 2 # Iterate all threshold and determine states for level, threshold_range in thresholds: highest_level = max(highest_level, level) # If ok threshold was specified, default state is critical according to spec # If value matches our threshold, we increment the status try: in_range = new_threshold_syntax.check_range( metric.value, threshold_range) except PynagError: self.set_summary( "Could not parse threshold %s=%s for metric %s" % (state_text[ level], threshold_range, metric_name) ) self.set_long_output( "Thresholds should be in the format metric=<metric_name>,ok=0..90,warning=90..95") self.add_long_output("Example: ") self.add_long_output( "--th metric=load,ok=0..1,warning=1..5,critical=5..inf") self.status(unknown) self.exit() if in_range: metric_status = max(metric_status, level) self.debug('%s is within %s range "%s"' % (metric_name, state_text[level], threshold_range)) if level == ok: self.debug( "OK threshold matches, not checking any more thresholds") metric_status = ok break else: self.debug('%s is outside %s range "%s"' % (metric_name, state_text[level], threshold_range)) # If no thresholds matched, set a default return code if metric_status < 0: metric_status = default_state # OK's go to long output, errors go directly to summary self.add_status(metric_status) message = '%s on %s' % (state_text[metric_status], metric_name) # Errors are added to the summary: if metric_status > 0: self.add_summary(message) if self.verbose is True: self.add_long_output(message)