Русский

little-brother edited this page Apr 6, 2018 · 28 revisions

Список устройств

Статус устройств в веб-интерфейсе поддерживается в актуальном состоянии автоматически. При этом фон списка отражает наихудший статус по всем устройствам.

В фильтре можно выбрать несколько меток, если удерживать Control.

Информационная панель

Список меток формируется из меток, найденных числовых переменных (тип number или size), и специальной метки latency, если есть пингуемые устройства. Можно выбрать несколько меток, если удерживать Control.

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

Используя таблицу-легенду можно отсортировать собранные данные по одному из критериев. Параметр up указывает примерный процент времени, когда устройство было доступно за выбранный интервал.
Если итоговых графиков больше 10, то будут показаны только первые 10 строк.

Если в фильтре устройств выбраны все устройства (All), то в доступен просмотр сборной информации только за последний час.

Следует иметь в виду, что полученные графики автоматически не обновляются.

Вычисление статуса устройства

Если у устройства нет переменных, для которых задано условие вычисления статуса и проверка пингом, то вычисление статуса

  • Не выполняется: статус всегда unknown (серый, 0).
  • Выполняется: статус normal (зеленый, 1), если проверка пройдена. Иначе значение статуса принудительно изменяется на выбранное "On polling error force status to".

Если переменные с условиями есть, то устройство опрашивается по выбранным протоколам. Если результатом опроса всех протоколов будет ошибка, то значение статуса изменяется на выбранное "On polling error force status to". Иначе для каждой переменной вычисляется статус и статус самого устройства определяется как самый плохой из всех.

Игнорирование смены статуса устройства, если родитель недоступен

Если для устройства установлена галочка "Don't trigger alarm if parent is down", то при сохранении устройства при помощи arp выполняется трассировка. Среди полученных ip адресов выбирается то устройство, которые уже есть среди зарегистрированных устройств с одним из ip и имеет максимальный HOP. Идентификатор найденного устройства сохраняется как parent_id для исходного. Если подходящего нет, то parent_id остается незаполненным.

При изменении статуса устройства пингом проверяется доступно ли родительское устройство. Если нет, то соответствующая команда on-warning или on-critical не выполняется.

Проверка устройств пингом

Все устройства, имеющие галочку "Ping check", перед получением значений проверяются ping-ом. Если пинг не прошел, то устройство далее не опрашивается.

Устройство будет проверено, если оно "родительское" для другого дочернего устройства, при смене дочерним устройством статуса.

Доступ

Управление доступом на просмотр и редактирование осуществляется в конфигурационном файле в секции access атрибутами edit и view, задающими пароль на запись (администратор) или чтение (оператор). Пароли могут быть не заданы. В этом случае вход будет выполняться автоматически.

Для смены роли можно нажать Ctrl + Shift + L и перейти на страницу авторизации.

Задание переменных (varbind)

Делитель (divider) - это на что необходимо разделить полученное значение прежде чем записать его в базу и провести определение статуса. Это может быть

  • любое число, напр. -0.02

  • число с буквой на конце

    • R - округлить после деления до 2-х знаков после запятой, напр. 0.02R;
    • F и C выполнить преобразование из градусов Цельсия в Фаренгейта и наоборот.

    При этом сначала будет применен делитель, а потом выполнено преобразование.

  • Число, r и регулярное выражение, напр. 10rПамять ([\d]*) (найти Память и получить следующее за этим число).

    При этом сначала будет применено регулярное выражение, а потом делитель.

В случае, если применить делитель невозможно, напр. потому что полученное значение ошибка, то делитель игнорируется.

Тип данных (value type) - определяет каким образом будут отображаться данные в интерфейсе. На хранение данных или вычисление статуса не влияет.

Условия вычисления статуса (status conditions) - все условия обрабатываются последовательно до первого подходящего. При этом надо иметь в виду, что перед вычислением статуса, если условия есть, статус сбрасывается в неизвестно (0), т.е. задав одно условие > 10, то норма, при значении 5 или Ошибка статус будет равен 0.

Пусть для вычисления статуса переменной используются следующие условия: есть значение меньше или равно 25, то норма, а если больше, то внимание. Чтобы избежать переключения статуса, а вместе с ним и появления оповещений, если значение колеблется возле граничного значения 25, необходимо использовать параметр условия Gap. Так, если он равен 2, то при росте значения от 20 до 27 (25 + Gap) статус будет норма. При прохождении 27 статус изменится на внимание и будет удерживаться пока значение не упадет до 23 (25 - Gap).

Метки (tags) - допустимо задать несколько меток, разделив их ;.

Групповые проверки

Можно задать проверку (check) для всех устройств, имеющих нужный тег. Создание проверки эквивалентно созданию у всех подходящих устройств дополнительной переменной, которая не будет доступна для редактирования в карточке устройства.

Для вызова экрана устройства необходимо нажать Ctrl + Shift + C. В полях Including и Excluding задаются группы тегов, например DB;PRODUCTION и WIN;HOME, что определит устройства, имеющие один из тегов DB или PRODUCTION и не имеющих тегов WIN или HOME.

Ограничения

Поскольку пересоздание переменных происходит только при запуске, то приложение требуется перезапустить

  • После редактирования списка проверок, чтобы применить изменения для устройств.
  • Для обновления групповых проверок устройства, после его создания или редактирования его тегов.

Хранение истории переменных

Для числовых переменных типов number и size сохраняются все получаемые значения, для других - только изменения. Если имя переменной начинается на $, то такая переменная временная и не история её изменений не сохраняется совсем. Также она не отображается при просмотре карточки устройства.

Данные хранятся в базе SQLite. Для минимизации занимаемого места и ускорения выборки данные по числовым и не числовым переменным хранятся в разных структурах в файлах history.sqlite и changes.sqlite, соответственно. При необходимости данные файлы можно удалить. При перезапуске приложения они, а также их таблицы, будут пересозданы.

Сглаживание пиков через усреднение данных значений переменных

Для игнорирования пиков, которые могут быть выбросами, как например разовая 100% загрузка CPU при старте какого-либо приложения, предусмотрено усреднение значений. Для этого необходимо воспользоваться временной переменной, напр. $CPU, в которую читать данные с устройства, и использовать её значение в переменной протокола Expression, задав адрес, как $CPU.avg(10) (усреднить последние 10 значений).

Данные с переменной типа счетчик

Если, например, требуется получать скорость передачи данных, а доступно только число переданных байт, то как и в прошлом варианте можно использовать временную переменную и Expression-переменную с адресом: $ReadKB.speed (используется специальное свойство speed, которое вычисляет скорость изменения переменной в секунду).

Если предыдущее значение было ошибка, то скорость будет NaN (не число) и такое значение будет проигнорировано на графике. Если этот момент хочется видеть, то можно сбросить скорость в ноль, используя уточненное адресное выражение $ReadKB.speed || 0.

Если устройство было перегружено, то счетчик будет сброшен и начнет отчет с нуля. В данном случае скорость будет отрицательной, что неверно. Для избежания этого, используйте Math.max($ReadKB || 0, 0).

Подробнее о проблеме здесь.

Отображение истории за большой период

Данные графиков фильтруются методом Largest-Triangle-Three-Buckets(LTTB), и при необходимости подгружаются при увеличении масштаба.

Следует иметь в виду, что поскольку история хранится полностью, то для её отображения необходимо прочитать все данные за интересующий период, отфильтровать LTTB-методом и передать в браузер. Это ресурсоёмкая операция, требующая времени, поэтому она выполняется в отдельном потоке.

Виртуальные машины

Статистику по использованной памяти, дисковому месту и процессорам, можно собирать используя системные консольные команды, такие как top или free, разбирая их вывод и отправляя данные в обработчик типа collector, командой echo "<VM-ip> <var> <val>" >dev/tcp/<cicada-ip>/<port> по cron.

Второй способ: использовать консольную утилиту virsh из пакета libvirt, и обработчик типа external, как SNMP v3.

Третий способ: включить поддержку SNMP и опрашивать через него.

Свой обработчик данных

Все обработчики располагаются в папке /protocols/ и состоят из трех файлов:

  • help.html - файл справки, содержащий любой html-текст.
  • index.html - задает как будет отображаться обработчик в интерфейсе, какие будут поля при его настройке и какие поля имеет адрес переменной.
  • index.js - js-реализация. Данный файл должен экспортировать как минимум одну функцию getValues(opts, address_list, callback), которая вызывает callback и передает ему объект Error, в случае ошибки, или же массив, равный по длине address_list, элементов вида {value: Значение, isError: true или false}. Примеры использования результатов вывода консольной утилиты можно посмотреть в обработчиках snmp-v3, ipmi и wmi.

Настройка базы данных (config.json, секция db)

При старте приложения имеется возможность указать какие параметры будут использованы для работы с базой данных, посредством выполнения команд PRAGMA. Наиболее важная - это 'PRAGMA synchronous = 0`, которая говорит базе, что информацию стоит считать записанной, как только отдали её операционной системы, и подтверждения от нее ждать не требуется. Эта настройка значительно увеличивает скорость записи данных, но имеется вероятность потери данных в случае, если работа операционной системы была завершена аварийно.

Пример настройки базы данных

"db" : {
  "synchronous": 0,
  "cache_size": 4000
}

Настройка оповещений (config.json, секция alerter-list)

Каждый оповещатель (alerter) имеет три значимые настройки: тип события, на которое он сработает, команда, которая будет выполнена, а так же список меток устройств, на события которых данный оповещатель срабатывает.

Пример настройки

"alerter-list": [
     "event": "on-critical",
     "command": "sendmail some@mail.com Device ${device.name} is down!"
     "active": "1-5,9:00-19:00",
     "tag-list": ["$EMAIL", "DB"]
  }
]

Если у оповещателя список меток пуст (не задан), то оповещатель сработает для всех устройств.

Поиск аномалий (config.json, секция anomaly-detector)

Значения переменных при проблемах не всегда достигают критичных значений и потому проблемы проходят незамеченными, без оповещений. Так, например, будут пропущены увеличение среднего время отклика http-сервера или нетипичная загрузка портов ночью, если не отслеживать их графики. Если переменных много, то просмотр даже только ключевых переменных займет значительное время. Большую часть потенциальных проблем, таких как пики, сдвиги среднего значения и поведение, отличное от предыдущего дня/недели, можно обнаружить статистическими методами, выполняя периодичные проверки.

Обычно обнаруживаются группы аномалий. Чтобы уменьшить количество оповещений, фиксируется только первая в группе, а остальные, обнаруженные в течении следующих 5 минут, игнорируются.

Для поиска аномалий используется отдельное приложение Watchtower - простой сервис, получающий значения переменных по tcp-протоколу, анализирующий несколько последних значений (по умолчанию 100) и сигнализирующий, если обнаружены аномалии.

Пример конфигурации для подключения к сервису Watchtower

"anomaly-detection": {
  "host": "127.0.0.1",
  "port": 8000,
  "tags": "CPU;MEM"
}

Настройка ловцов (config.json, секция catchers)

Каждый ловец - это демон, выводящий в свой лог информацию о входящих событиях. Приложение читает лог, выделяет в новой порции данных ip-адрес устройства и принудительно запускает опрос устройства.

Ниже приведен пример использования демона snmptrapd для приема оповещений по SNMP ловушек, выводящего в лог

2017-01-23 23:35:11 UDP: [127.0.0.1]:56632->[0.0.0.0]:0 [UDP: [127.0.0.1]:56632->[0.0.0.0]:0]:DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (3002705848) 347 days, 12:50:58.48 SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::org.3.3.3.3.3.3    iso.2.2.2.2.2.2 = STRING: "Aliens opened the door"

для каждого пойманного события.

"catchers": {
  "snmp-traps": {
    "command": "snmptrapd",
    "args": "["-A", "-n", "-f", "-Lo"]",
    "pattern": "\\[(.*?)\\]"
  }
}
Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.