[система 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. (допустим, что все