Sharing my mind…

Андрей Бородийчук

Cacti для нестандартных объектов

Статья для  www.hostinfo.ru.

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

Рассмотрим реальную задачу. Есть большая сеть, разбитая маршрутизаторами на более мелкие подсети. Необходимо отслеживать, сколько пользователей обслуживается каждым маршрутизатором и сколько из них блокированы за неуплату. В нашем распоряжении база данных биллинга, в которой есть таблица, где каждой машине поставлен в соответствие IP-адрес маршрутизатора.

Для начала создается скрипт, который сможет вывести в консоль требуемые величины в формате name1:value1 name2:value2 (количество переменных может быть любым) в зависимости от переданного ему параметра.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  # Подключение к базе данных
  $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-адрес маршрутизатора):

1
2
3
  $ /usr/bin/php -q
  /home/www/cacti/scripts/routers.php 10.1.0.22
  clients:315 blocked:29

Когда скрипт сбора данных готов, следует привязать его к 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. (допустим, что все наши маршрутизаторы находятся в подсети 10.1.0.0/24). Редактирование окончено, нажимаем Save и сохраняем сделанные настройки.

Переходим к шаблонам графиков — Graph Templates. Снова создаем новый шаблон. В таблице Template даем ему имя (Name) — Router graph: Clients, Blocked. Заполняем таблицу Graph Template.

  • Title — это заголовок, который будет отображен над графиком. Ставим его значение по умолчанию в Router 10.1.0.: Clients, Blocked и ставим галочку Use Per-Graph Value, чтобы можно было отдельно для каждого графика указать, к какому маршрутизатору он относится.
  • Поле Vertical Label — метка оси ординат, установим в Clients (не в попугаях же нам измерять количество клиентов).

Все остальные параметры в принципе можно оставить как есть, однако если вам захочется их изменить — они достаточно информативно подписаны, поэтому разобраться в них не составит труда.

Щелкаем Create, и у нас появляются две дополнительные таблицы. Graph Template Items задает внешний вид графика: каждый элемент этой таблицы — это отдельный отображаемый объект, будь то график, либо подпись, либо комментарий. Graph Item Inputs указывает, из каких хранилищ берется информация для создания графика. Начнем с Graph Template Items — нажимаем Add и начинаем заполнять открывшуюся таблицу.

  • Data Source — источник данных. Для начала берем Router stats — (clients).
  • Color — выбираем цвет, которым он будет отображаться.
  • Graph Item Type — тип объекта. Пусть это будет AREA — кривая с закрашенной областью под ней. Можно было выбрать LINE1-LINE3 — это линии разной толщины. Значение COMMENT — это статический текст, HRULEVRULE — соответственно горизонтальная или вертикальная линии, координаты которых задаются в поле Value этой же таблицы,GPRINT — какая-либо функция от отслеживаемой величины с комментарием (например, максимальное значение).
  • Consolidation Function — какое из значений отображать на графике. Выбираем AVERAGE — среднее значение.
  • CDEF Function — математическое преобразование, применяемое к значению. В нашем случае выбирать ничего не нужно.
  • Value, соответственно, тоже оставляем пустым, поскольку данный параметр не является ни вертикальной, ни горизонтальной линией.
  • Аналогично поступаем с GPRINT Type.
  • Text Format — легенда к графику. Впишем туда Clients — на графике внизу появится маленький квадратик выбранного цвета с подписью Clients.
  • Галочка Insert Hard Return говорит о том, что после этого текста следует поставить перевод строки.

Нажимаем Create и аналогичным образом создаем кривую для заблокированных клиентов, выбрав для нее тип, к примеруLINE1. Кроме того, отобразим на графике текущее значение отображаемой величины. Для этого создадим еще четыре объекта для тех же источников данных, только с типом GPRINT и Consolidation Function — LAST и MAX. Поскольку наши величины — целые числа, то GPRINT Type выберем Exact Numbers.

В таблице Graph Template Items вы можете расставить очередность наложения объектов, то есть какой график будет поверх какого рисоваться или как будут следовать надписи друг за другом. Здесь широкое поле для экспериментов, поскольку все вносимые изменения можно сразу же видеть на графике, если таковой уже заведен. Табличка Graph Item Inputs заполнилась автоматически, и ее трогать не нужно.

Заключительный этап — создание графиков. Заводим новое устройство с адресом 127.0.0.1 и именем, к примеру, Routers Info. Шаблон хоста устанавливаем в none и SNMP-community не прописываем вообще. Далее в таблицу связанных с устройством шаблонов графиков Associated Graph Templates добавляем шаблон Router graph: Clients, Blocked и переходим по ссылке Create Graphs for this Host. Из таблички Graph Template выбираем единственный и нажимаем Create, после чего у нас появляется возможность вручную задать все то, что было ранее отмечено галочками Use Per-Graph Value, — заголовок графика и IP-адрес маршрутизатора. Прописываем туда нужные параметры, нажимаем Save и, если нужно, повторяем процедуру, пока не создадим графики для всех маршрутизаторов.

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

В этой статье автор попытался на простом примере показать механизм расширения возможностей системы Cacti для мониторинга любой нестандартной величины. Подключив фантазию, вы сможете практически неограниченно расширить возможности сбора информации с любых объектов и систем. Все в ваших руках!

Ссылки по теме