У меня есть статус конкретного приложения, о котором сообщается в виде строки по SNMP.
Когда все работает, как ожидалось, этот мониторинг сообщает о пустой строке, а когда у некоторых источников данных возникают проблемы, он возвращает строку с именами затронутых источников данных.
Я хочу отображать эту строку как предупреждение / информацию на консоли событий Zenoss, если она не пуста.
Проблема в том, что всякий раз, когда я добавляю источник данных типа SNMP в шаблон мониторинга, он принимает числовое значение.
Идея заключалась в том, чтобы использовать StatusThreshold только для того, чтобы видеть, когда значение изменяется.
Такая настройка не приводит к появлению событий в консоли событий.
Насколько я понимаю, пороговые значения оцениваются по значению в базе данных RRD, которое является только числовым, поэтому строка последовательно превращается в «NaN».
Интерфейс шаблонов мониторинга Zenoss не показывает интуитивно понятный способ работы со строками. Как это можно сделать?
Одно из возможных решений оказывается очень простым, но поиск в Интернете дает множество похожих вопросов, на которые либо нет ответа, либо в конечном итоге используется другой подход, либо возникает другая проблема.
Zenoss предлагает возможность интеграции с плагинами Nagios, которые могут не привлечь ваше внимание, если вы не знаете, как работает эта интеграция.
По сути, это означает, что вы можете вызывать произвольную команду, если она возвращает код выхода 0 для успеха (событие очистки) и 1, 2 или 3 для ошибки (создание события), а также правильно отформатированную строку в STDOUT.
Вооружившись этой информацией, вы можете написать простой скрипт, который считывает ваши данные SNMP, используя snmpget
, анализирует его и печатает сообщение, которое вы хотите отобразить в событии.
Простой и общий пример Perl может быть таким:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
my ( $target, $oid, $msg ) = @ARGV;
my $value = `snmpget -v1 -c <comunity> $target $oid`;
$value =~ /STRING: "([^"]*)"/;
exit 0 unless $1;
say "$msg $1";
exit 1;
сохраните это как $ZENHOME/libexec/string_monitor
на вашем сервере zenoss и chmod +x $ZENHOME/libexec/string_monitor
Затем в шаблонах мониторинга добавьте источник данных типа КОМАНДА и заполните поле Шаблон команды следующим образом:
string_monitor ${here/manageIp} <OID> "Error reported on:"
Несколько вещей, которые следует помнить, если вы не знакомы с Zenoss:
Если у вас есть установка с сервером zenoss и множеством сборщиков, он будет вызываться из коллектора, которому назначено ваше устройство, а не из вашего основного сервера, поэтому не забудьте, что сценарий должен быть доступен на всех сборщиках. Когда он пытается позвонить string_monitor
на сборщике, а его там нет, вы получите событие на консоли событий, которое гласит: «Код: 2 - Сообщение: неправильное использование встроенных команд оболочки»
Это очень вводит в заблуждение, поскольку легко предположить, что в вашем скрипте есть проблема, когда ошибка заключалась в том, что $ZENHOME/libexec/string_monitor
не был найден. :-)
Это может быть особенно запутанным, если вы используете кнопку «Тест» при настройке источника данных, и в этом случае запрос будет сделан с главного сервера, и он будет работать, а затем вместо этого отобразит указанную выше ошибку на консоли.
Кроме того, чтобы ускорить процесс, вы можете использовать ssh в сборщике, sudo -i -uzenoss
и беги zencommand run -d your.targetdevice.com -v 10
Это должно привести к полному запуску на этом устройстве, и ваше событие должно появиться на консоли событий (при условии, что оно не было пустым).
После того, как вы заставите его работать, также возможно передать фактические числовые данные из вашего скрипта в Zenoss, формат для печатной строки:
Error string to display|failing=7 warning=31 good=24
ошибка, исправность и предупреждение будут переданы как точки данных в этот источник данных, и вы можете использовать пороги MinMax или построить на них графику.
Для простого начала я рекомендую заставить его работать с минимальным / фиктивным скриптом и расширяться оттуда:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
say "We got an error|my=1 sample=6 values=10";
exit 1;