[система Cacti – мониторинг нестандартных объектов]материал подготовил: Андрей Бородийчук 25.05.2006
В процессе работы с Cacti рано или поздно приходит такой момент, когда вы прекрасно осознаете, что эта система способна делать гораздо больше, нежели то, чем она сейчас у вас занимается. Есть еще десятки и сотни параметров, историю изменения которых вам хотелось бы видеть в любое время дня и ночи, но их отслеживание, к сожалению, не предусмотрено в стандартном наборе функций. Как же сделать так, чтобы все они в один прекрасный момент предстали перед вами в виде красивых цветных графиков?
Рассмотрим реальную задачу. Есть большая сеть, разбитая маршрутизаторами* на более мелкие подсети. Необходимо отслеживать, сколько пользователей обслуживается каждым маршрутизатором и сколько из них блокированы за неуплату. В нашем распоряжении база данных биллинга, в которой есть таблица, где каждой машине поставлен в соответствие IP-адрес маршрутизатора.
Для начала создается скрипт*, который сможет вывести в консоль требуемые величины в формате name1:value1 name2:value2 (количество переменных может быть любым) в зависимости от переданного ему параметра.
<?php # Подключение к базе данных $db = mysql_connect (‘host’, ‘login’, ‘pass’); mysql_select_db (‘database’, $db); # Аргумент, переданный скрипту $router = $_SERVER[‘argv’][1]; # Запрос-выборка общего количества клиентов $clients = mysql_query(‘select count(*) from clients where router=”‘.$router.'”‘); # Запрос-выборка количества блокированных клиентов $blocked = mysql_query(‘select count(*) from clients where router=”‘.$router.'” and blocked=1′); # Обработка результатов $clients = mysql_fetch_row($clients); $blocked = mysql_fetch_row($blocked); # Вывод результата printf(‘clients:%d blocked:%d’, $clients, $blocked); ?>
Этот скрипт логичнее всего будет поместить в папку scripts директории, в которую установлена Cacti. Далее он тестируется вручную. При вызове из командной строки он должен возвратить требуемый результат (не забудьте передать ему обязательный аргумент – IP-адрес маршрутизатора):
Когда скрипт сбора данных готов, следует привязать его к Cacti. Для этого переходим к методам сбора данных (Data Input Methods). Щелкая по ссылке Add, создаем новый метод. Заполняем поля:
Name – это описание, которое будет вам понятно. В нашем случае логично будет написать Router: Clients, Blocked.
Input Type – способ получения данных. Выбираем Script/Command.
Input String – командная строка. Сюда следует ввести команду, которой мы тестировали скрипт, заменив обязательный параметр на имя переменной в угловых скобках: /usr/bin/php -q /home/www/cacti/scripts/routers.php <router>.
Далее нажимаем кнопку Create и замечаем, что к форме добавились две таблицы: Input Fields и Output Fields. Первая – это параметры, передаваемые скрипту. Вторая – переменные, возвращаемые скриптом. Нажимаем Add в таблице Input Fields и заполняем форму:
Field [Input] – выпадающий список, в котором перечислен
ы все переменные, передаваемые скрипту. Они берутся из строки, которую мы ввели как команду в предыдущей форме. В нашем случае там только один пункт – router. Его и следует выбрать.
Friendly Name – описание данного параметра. пишем Router IP.
Остальные поля для нас не важны, за исключением разве что галочки Allow Empty Input – разрешить запуск скрипта без данного параметра (но тогда нужно было в самом скрипте предусмотреть обработку подобной ситуации!). Снова нажимаем Create и возвращаемся в свойства этого метода ввода данных. Переходим к таблице Output Fields, нажимаем там Add и заполняем ее форму:
Name – имя возвращаемого значения. Указываем clients (должно совпадать с возвращаемым скриптом параметром, однако если он один, то допускается любое).
Friendly Name – его описание. В нашем случае – Clients count.
Галочка Update RRD File символизирует о том, что этот параметр следует отслеживать, а не игнорировать (возможен случай, когда часть параметров, возвращаемых скриптом, неинтересна в плане мониторинга).
Сохраняем и повторяем то же для переменной blocked с описанием Blocked clients count. На этом редактирование метода ввода данных окончено, остается только нажать кнопку Save.
Далее переходим к шаблонам хранения данных (Data Templates) – создаем новый, заполняем поля. В таблице Data Templates:
Name – имя, которое будет отображаться. К примеру – Router stats.
Далее таблица Data Source – это хранилища данных. Обратите внимание – здесь появляются напротив каждого поля галочки Use Per-Data Source Value. Если мы ее установим, то используемое значение можно будет впоследствии изменить уже непосредственно при создании того или иного объекта на основе этого шаблона.
Name – так будут называться хранилища статистики. пишем Router stats: Clients, Blocked.
Data Input Method – из выпадающего списка выбираем созданный нами ранее метод ввода данных: Router: Clients, Blocked.
оставшиеся поля таблицы Data Source оставляем как есть. Табличка Data Source Item содержит описание отслеживаемой переменной – одной или нескольких.
Internal Data Source Name – внутреннее название отслеживаемой переменной. Указываем blocked.
Нажимаем Create и видим результат: в эту табличку добавилась строка Output Field и появилась таблица Custom Data.
В выпадающем списке поля Output Field можно увидеть переменные и их описания, которые мы задавали в методе ввода данных. Поскольку внутреннее название переменной мы дали blocked – выбираем из списка соответствующую величину blocked – Blocked clients count.
Поля Minimum Value и Maximum Value позволяют задать пределы изменения отслеживаемой величины – если она выйдет за эти рамки, то на графике будет пробел.
В Data Source Type выбираем GAUGE – это значит, что величина будет записываться “как есть”. Если бы мы выбрали COUNTER – записывалась бы разница между прошлым и текущим ее состоянием.
Heartbeat оставляем как есть – это своеобразная внутренняя перестраховка Cacti от зависания.
Далее в этой же таблице нажимаем New – и появляется второе внутреннее хранилище. Заполняем аналогично первому, только имя даем ему clients и, соответственно, Output Field выбираем clients – Clients count. Кроме того, Cacti по умолчанию проставляет максимальное значение параметра в 100, поэтому будьте внимательны и лучше установите его в ноль, чтобы не было потом недоразумений. Далее заполняем таблицу Custom Data – она содержит пользовательские данные, передаваемые скрипту (если таковые требуются, и в нашем случае они требуются). Поскольку у нас в методе сбора данных только один параметр передается скрипту, то в этой таблице только одно поле, названное, как и наш комментарий к данному параметру: Router IP. Вот здесь однозначно следует установить галочку Use Per-Data Source Value – чтобы мы могли задать этот параметр отдельно для каждого хранилища (то есть чтобы собирать информацию одновременно с нескольких маршрутизаторов), и в качестве значения по умолчанию можно ввести, к примеру, 10.1.0. (допустим, что все