Возврат информации в дополнение к метрике в нагиосплугине - PullRequest
0 голосов
/ 02 июля 2018

У меня есть проверка nagiosplugin, которая получает версию пакета, используя соль (из-за сетевой архитектуры), а затем сравнивает ее с версией, указанной в аргументе, используя метод salt.pkg_version_cmp.

Я могу вернуть результат этой проверки (-1 | 0 | 1) в метрике и отобразить строку состояния.

Но я хочу добавить актуальную версию пакета в строке состояния, и я не знаю, как вернуть ее с помощью функции nagiosplugin class |, а не с помощью глобальной переменной.

Вот мой нагиосплугин.Ресурс класс:

class CheckSaltPkgVersion(nagiosplugin.Resource):
def __init__(self, args):
    self.package = args.package
    self.rule = args.rule
    self.target = args.vm

def salt_pkg_version(self):
    sa = getSaltAdapter()
    version = sa.exec_function([{
        'client': 'local',
        'tgt': self.target,
        'fun': 'pkg.version',
        'arg': [self.package]
    }])
    compare = sa.exec_function([{
        'client': 'local',
        'tgt': self.target,
        'fun': 'pkg.version_cmp',
        'arg': [version['return'][0][self.target], self.rule]
    }])
    # depending of compare and version, mist return smth between 0 and 4
    return compare['return'][0][self.target]

def probe(self):
    """Runs"""
    yield nagiosplugin.Metric(self.package, 
                              self.salt_pkg_version(),
                              context='salt_pkg_version_compare')

Вот мой нагиосплугин. Резюме (основное)

class VersionSummary(nagiosplugin.Summary):
def ok(self, results):
    return ("ok")

def problem(self, results):
    return("warning")

Я бы хотел получить Сводку наподобие этой (игнорируя условную проверку Неизвестно / Предупреждение / Критическое):

class VersionSummary(nagiosplugin.Summary):
def ok(self, results):
    return 'the package %s is in version %s' % (results.first_significant.metric.name, version)

def problem(self, results):
    return 'the package %s is in version %s which is less that %s' % (results.first_significant.metric.name, version, rule)

Я искал, но единственное, что я нашел, было следующее: Нагиосплугин: как показать другой fmt_metric в зависимости от значения? и он делает 2 проверки (сначала в основном, затем во втором в сводке чтобы получить информацию)

Не похоже, что класс Metric (https://pythonhosted.org/nagiosplugin/api/intermediate.html#module-nagiosplugin.metric) может нести значение, отличное от значения.

1 Ответ

0 голосов
/ 03 июля 2018

Я не нашел другого решения, кроме как написать новый контекст:

class CheckContext(nagiosplugin.Context):

    def __init__(self, name, rule, critical, fmt_metric=None, result_cls=nagiosplugin.Result):
        super(CheckContext, self).__init__(name, fmt_metric, result_cls)
        self.rule = rule
        self.critical = critical

    def performance(self, metric, ressource):
        return None

    def evaluate(self, metric, resource):
        need_update = self.compare(metric.value)
        if (need_update):
            if (self.critical == 0):
                return self.result_cls(nagiosplugin.Warn, None, metric)
            else:
                return self.result_cls(nagiosplugin.Critical, None, metric)
        else:
            return self.result_cls(nagiosplugin.Ok, None, metric)

    def compare(self,metric):
        metric = re.sub("[^0-9]", '.', metric).split('.')
        rule = re.sub("[^0-9]", '.', self.rule).split('.')
        i = 0
        while (i < len(rule) and int(rule[i]) <= int(metric[i])):
            i+=1
            if (len(metric) <= i):
                metric.append(0)
        return (i < len(rule))

Требуется версия, которая возвращает первую функцию соли. Сравнение между двумя строками теперь выполняется в Сравнении.

вот краткое изложение и основное

class VersionSummary(nagiosplugin.Summary):


    def __init__(self, rule):
            self.rule = rule;

    def ok(self, results):
        return ("Package = %s, version = %s, rule = %s" % (results.__getitem__(0).metric.name, results.__getitem__(0).metric.value, self.rule))

    def problem(self, results):
        return("Package %s must be in version %s but is in version %s" % (results.__getitem__(0).metric.name, self.rule, results.__getitem__(0).metric.value))





@nagiosplugin.guarded
def main():
    args = parse_args()
    check = nagiosplugin.Check(CheckSaltPkgVersion(args.package, args.vm), 
                                CheckContext('salt_pkg_version_compare',
                                            args.rule, 
                                            args.critical),
                                VersionSummary(args.rule))
    check.main()

Правило отправляется в резюме с основной, а версия в результате. Контекст оценивает, является ли он критическим / предупреждение / хорошо, и отправляет результат в сводку.

...