Source code for alignak.misc.perfdata

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright (C) 2015-2015: Alignak team, see AUTHORS.txt file for contributors
#
# This file is part of Alignak.
#
# Alignak is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Alignak is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Alignak.  If not, see <http://www.gnu.org/licenses/>.
#
#
# This file incorporates work covered by the following copyright and
# permission notice:
#
#  Copyright (C) 2009-2014:
#     Hartmut Goebel, h.goebel@goebel-consult.de
#     Sebastien Coavoux, s.coavoux@free.fr
#     aviau, alexandre.viau@savoirfairelinux.com
#     Nicolas Dupeux, nicolas@dupeux.net
#     Grégory Starck, g.starck@gmail.com
#     Jean-Claude Computing, jeanclaude.computing@gmail.com
#     Thibault Cohen, titilambert@gmail.com
#     Jean Gabes, naparuba@gmail.com
#     Romain Forlot, rforlot@yahoo.com

#  This file is part of Shinken.
#
#  Shinken is free software: you can redistribute it and/or modify
#  it under the terms of the GNU Affero General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  Shinken is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU Affero General Public License for more details.
#
#  You should have received a copy of the GNU Affero General Public License
#  along with Shinken.  If not, see <http://www.gnu.org/licenses/>.
"""
This module provide classes to handle performance data from monitoring plugin output
"""
import re
from alignak.util import to_best_int_float

PERFDATA_SPLIT_PATTERN = re.compile(r'([^=]+=\S+)')
# TODO: Improve this regex to not match strings like this:
# 'metric=45+e-456.56unit;50;80;0;45+-e45e-'
METRIC_PATTERN = \
    re.compile(
        r'^([^=]+)=([\d\.\-\+eE]+)([\w\/%]*)'
        r';?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE]+)?;?([\d\.\-\+eE]+)?;?\s*'
    )


[docs]def guess_int_or_float(val): """Wrapper for Util.to_best_int_float Basically cast into float or int and compare value If they are equal then there is no coma so return integer :param val: value to cast :return: value casted into int, float or None :rtype: int | float | NoneType """ try: return to_best_int_float(val) except Exception, exp: return None
[docs]class Metric: """ Class providing a small abstraction for one metric of a Perfdatas class """ def __init__(self, string): self.name = self.value = self.uom = \ self.warning = self.critical = self.min = self.max = None string = string.strip() # print "Analysis string", string matches = METRIC_PATTERN.match(string) if matches: # Get the name but remove all ' in it self.name = matches.group(1).replace("'", "") self.value = guess_int_or_float(matches.group(2)) self.uom = matches.group(3) self.warning = guess_int_or_float(matches.group(4)) self.critical = guess_int_or_float(matches.group(5)) self.min = guess_int_or_float(matches.group(6)) self.max = guess_int_or_float(matches.group(7)) # print 'Name', self.name # print "Value", self.value # print "Res", r # print r.groups() if self.uom == '%': self.min = 0 self.max = 100 def __str__(self): string = "%s=%s%s" % (self.name, self.value, self.uom) if self.warning: string += ";%s" % (self.warning) if self.critical: string += ";%s" % (self.critical) return string
[docs]class PerfDatas: """ Class providing performance data extracted from a check output """ def __init__(self, string): string = string or '' elts = PERFDATA_SPLIT_PATTERN.findall(string) elts = [e for e in elts if e != ''] self.metrics = {} for elem in elts: metric = Metric(elem) if metric.name is not None: self.metrics[metric.name] = metric def __iter__(self): return self.metrics.itervalues() def __len__(self): return len(self.metrics) def __getitem__(self, key): return self.metrics[key] def __contains__(self, key): return key in self.metrics