The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Мониторинг интерфейсов в сети с помощью netmond и rrdtool (rrdtool monitor statistic snmp)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: rrdtool, monitor, statistic, snmp,  (найти похожие документы)
From: Кропачев Артемий <neon@insysnet.ru.> Newsgroups: email Date: Mon, 1 Sep 2006 14:31:37 +0000 (UTC) Subject: Мониторинг интерфейсов в сети с помощью netmond и rrdtool Введение С ростом размера компьютерной сети, увеличением количества работающих серверов и сервисов, увеличением числа обслуживаемых клиентов и пользователей, а так же увеличением их критичности всё более актуальной задачей является необходимость своевременного устранения сбоев, а, следовательно, своевременного их нахождения, другими словами - мониторинг сети. На мой взгляд, наиболее часто встречающимися задачами мониторинга локальной сети являются: * определение доступности/недоступности оборудования, серверов и сервисов * проверка каналов передачи данных (доступность, загруженность) * сохранение и просмотр статистики на интерфейсах коммутаторов и серверов (байты, пакеты и ошибки) * сохранение и просмотр различных параметров сервисов и объектов (например, загрузка CPU маршрутизаторов, размер свободного дискового пространства на файловых серверах, количество подключённых модемных пользователей на Cisco и другие). Существует большое количество уже готовых систем мониторинга: nagios, mrtg, zabbix,cacti. Настройка "полной" системы мониторинга является достаточно сложной задачей и выходит за рамки данной статьи. Любой системный администратор рано или поздно и ввиду различных задач сталкивается с необходимостью анализа закономерностей сетевого трафика в течении часов, суток, месяцев и т.п. Пожалуй, наиболее удобным способом является просмотр графиков пакетных и байтовых нагрузок на каналах. Данная статья ставит своей задачей донести до читателя мой личный опыт по отображению статистики на интерфейсах серверов и оборудования в наглядном виде (графики). Эта проблема может быть решена большим количеством способов (например cacti, mrtg), но я реализовал именно этот, чем и хочу поделиться. Используемое программное обеспечение Для решения поставленной задачи потребуются: - netmond - сердце системы, выполняет опрос объектов Домашняя страница производителя RINET Software Team находится по адресу http://soft.risp.ru/ , там имеется очень хорошая документация о продукте на русском языке. Netmond представляет из себя некий серверный инструмент, позволяющий собирать данные со всех объектов и сервисов сети в одном месте (сервере мониторинга) и в удобном для использования виде (в нашем случае это rrdtool, возможно хранить данные в SQL базах данных) - rrdtool - средство сохранения (база данных) и отображения статистики (утилиты построения изображений) За информацией о rrdtool можно обращаться на сайт http://www.rrdtool.org. Есть очень неплохая статья про работу с этой базой http://www.bog.pp.ru/work/rrdtool.html на русском языке. В man страницах подробно описаны все утилиты работы см. man rrdtool. Стоит более подробно ознакомится с man страницами по rrdcreate, rrdupdate, rrdgraph. - Perl - скрипты для сохранения и отображения данных - Apache - веб сервер - Пакет Net-SNMP - для удобства проверки работы протокола snmp Netmond будет выполнять роль системы получения данных по протоколу SNMP, а так же будет сохранять данные загрузки интерфейсов в базу rrdtool через внешний скрипт на Perl. Работа с сохранёнными данными возможна из командной строки и средствами скриптов. Для удобства использования написан скрипт отображения результатов в Web интерфейсе. Настройка системы мониторинга производилась на базе операционной системы FreeBSD (4.x, 5.x, 6.x), но всё ниже написанное, думаю, можно будет перенести на Linux (изменится в основном способ установки ПО и место размещения конфигурационных файлов). Установка Чтобы приступить к настройке системы ставим необходимое программное обеспечение. Вся установка велась из портов FreeBSD. Если у кого-то есть желание ставить из исходников или пакетов - пожалуйста. Perl: # cd /usr/ports/lang/perl5.8 && make install clean Ставим rrdtool (на момент написания статьи версия 1.2.15): # cd /usr/ports/net/rrdtool && make install clean Ставим netmond: # cd /usr/ports/net-mgmt/netmond && make install clean Пакет Net-SNMP: # cd /usr/ports/net-mgmt/net-snmp && make install clean Ставим, настраиваем и запускаем www сервер apache. Настройка netmond ------------------ Конфигурационный файл netmond лежит в файле /usr/local/etc/netmon.conf.sample. Переименовываем его в netmon.conf и редактируем: # mv /usr/local/etc/netmon.conf.sample /usr/local/etc/netmon.conf # vi /usr/local/etc/netmon.conf Ниже будет дан пример конфигурационного файла с описанием. RootDir "/var/netmon" # Каталог для сохранения данных Polling 60 # Время опроса объектов мониторинга (в секундах) Timeout 2 # Время ожидания ответа на запрос (в секундах) Retries 3 # Количество переповторов Saving 60 # Интервал периодического сохранения данных(60 секунд) TimeFmt "%H:%M:%S" # Формат времени # Группы доступа к netstate Group "local" { Permit "^localhost$" Permit "^127\\.0\\.0\\.1$" Deny ".*" } Group "remote" { Permit "^172\\.21\\.81\\." } NetState { Port 3333 # Порт netstate сервера Timeout 30 Group "local" Group "remote" } Save "make_dir" { # метод сохранения для создания каталога File "" When "0" 0 } Save "save_rrd_if" { # Определяем метод сохранения статистики интерфейсов в rrd базу Pipe "/usr/local/sbin/rrdsave" # Вызываем скрипт /usr/local/sbin/rrdsave и передаём ему данные на стандартный вход (директива Pipe) # Возможен вариант с Exec тогда данные будут переданы в командной строке # После директивы Data идут данные, можно писать с новой строки в кавычках # Передаём разницу показателей счётчиков байт, много- и моноадресных пакетов, ошибок, дропов на # интерфейсе, для которого данный метод сохранения прописан в разделе объектов мониторинга Data "$DATADIR/rrdint\n" "60\n" "RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:5:10080 RRA:AVERAGE:0.5:60:10080 RRA:AVERAGE:0.5:3600:10080\n" "${ifOperStatus}:ifoperstatus:GAUGE:600:0:1.25\n" "${ifInOctets.delta}:ifinoctets:GAUGE:600:0:U\n" "${ifOutOctets.delta}:ifoutoctets:GAUGE:600:0:U\n" "${ifInErrors.delta}:ifinerrors:GAUGE:600:0:U\n" "${ifOutErrors.delta}:ifouterrors:GAUGE:600:0:U\n" "${ifInDrops.delta}:ifindrops:GAUGE:600:0:U\n" "${ifOutDrops.delta}:ifoutdrops:GAUGE:600:0:U\n" "${ifInUcastPkts.delta}:ifinucastpkts:GAUGE:600:0:U\n" "${ifOutUcastPkts.delta}:ifoutucastpkts:GAUGE:600:0:U\n" "${ifInNUcastPkts.delta}:ifinncastpkts:GAUGE:600:0:U\n" "${ifOutNUcastPkts.delta}:ifoutncastpkts:GAUGE:600:0:U" } # ****Здесь начинается раздел описания объектов мониторинга******** Object "Cisco_catalyst" { # Определяем объект мониторинга - коммутатор Cisco Address "172.21.80.11" # Адрес, по которому будем опрашивать Method router "public" # Определяем стандартный метод опроса router с известной строкой community Save "make_dir" Interface "FastEthernet0/1" { # Определяем интерфейс на коммутаторе по его ifName # Предопределяем методы сохранения данных на данном интерфейсе # первый метод нужен для определения переменной DATATDIR # Второй выполняет сохранение данных Save "make_dir" Save "save_rrd_if" } Interface 2 { # Определяем интерфейс по значению ifIndex (по номеру) Save "make_dir" Save "save_rrd_if" } } Object "Server" { Address "172.21.8.1" Method router "mysnmpcommunity" Save "make_dir" Interface "fxp0" { Save "make_dir" Save "save_rrd_if" } Interface "fxp1"{ Save "make_dir" Save "save_rrd_if" } Interface "em0"{ Save "make_dir" Save "save_rrd_if" } } Структура конфигурационного файла подробно описана на сайте производителя, я остановлюсь лишь на нескольких важных деталях. Весь конфигурационный файл состоит из 5 основных частей: 1. Установка глобальных переменных. 2. Параметры работы netstate протокола. 3. Пользовательские методы опроса объектов и сервисов (в приведённом конфигурационном файле не используются) 4. Пользовательские методы сохранения данных. 5. Раздел описания объектов, сервисов и интерфейсов мониторинга. Параметр Saving изменён с 300 на 60. Необходимо для правильного сохранения минутных статистик в базу rrdtool. Переменная RootDir содержит путь до каталога куда netmond будет сохранять полученные данные прописанными методами сохранения. Следует предусмотреть достаточный объём свободного места на разделе (Файл rrdtool для одного интерфейса в нашем случае будет занимать порядка 3,5 Мб). В примере конфига добавлено для примера два объекта мониторинга: коммутатор Cisco и сервер на базе FreeBSD. В свойствах объекта мониторинга задаётся его IP адрес, метод опроса, и методы сохранения данных. Мы используем встроенный метод опроса router, который считывает по SNMP статистику с интерфейсов и некоторую другую информацию. Методу передаётся 1 параметр (выражение в кавычках после названия метода)- строка community (что то типа пароля для доступа к данным по SNMP). В параметрах объектов описано так несколько интерфейсов: один по названию (по IfName), второй по номеру (по IfIndex). Кому как удобнее пользоваться. Например, при установке службы SNMP в MS Windows у интерфейсов вообще ifName отсутствует, так что приходится пользоваться только вторым способом. Для каждого интерфейса прописано 2 метода сохранения данных: "make_dir" и "save_rrd_if". Метод сохранения данных "save_rrd_if" передаёт данные собранные встроенным методом опроса "router" (показатели счётчиков байт, пакетов, дропов, ошибок), имя файла rrdtool базы куда надо данные поместить (берётся из переменной netmond "DATADIR"), а так же параметры базы rrdtool необходимые для её создания и последующего обновления на вход скрипта /usr/local/sbin/rrdsave. Если файл базы не существует скрипт его создаёт, если существует - то добавляет/обновляет в нём данные. Опишу подробнее строки с данными (после директивы Data): - "$DATADIR/rrdint\n" путь до файла, в нашем случае rrdint, переменная DATADIR содержит путь до каталога, где хранятся данные данного объекта/сервиса/интерфейса (в нашем случае для интерфейса). - "60\n" время в секундах, как часто будет обновляется база. Параметр необходим при создании базы. - "RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:5:10080 RRA:AVERAGE:0.5:60:10080 RRA:AVERAGE:0.5:3600:10080\n" RRA строки - параметр создания базы: определяем количества ячеек тип. Общий формат: RRA:функция-консолидации:x-доля:отсчетов-на-ячейку:число-ячеек Функции консолидации определяют как и какие отсчёты группировать в одну ячейку (у нас методом усреднения, возможны так же MAX, MIN, TOTAL, LAST). Создаём 10080 ячеек под минутные отчёты (1 отсчёт по 60 секунд), 10080 ячеек под 5 минутные (5 отсчётов), сколько же под часовые (60 отсчётов) и т.д.. Если кому жалко место на диске, можно без проблем значительно уменьшить количество ячеек. Например вот так: "RRA:AVERAGE:0.5:1:1440 RRA:AVERAGE:0.5:5:2016 RRA:AVERAGE:0.5:60:720 RRA:AVERAGE:0.5:3600:365\n" - "${ifOperStatus}:ifoperstatus:GAUGE:600:0:1.25\n" передаём OperStatus для интерфейса в виде переменой ${ifOperStatus}, сохраняем как есть (тип GAUGE), максимальное значние 1.25. - "${ifInOctets.delta}:ifinoctets:GAUGE:600:0:U\n" переедем переменную разницы счётчиков входящих байт между опросами. В базе имя столбца будет названо как ifinoctets. Думаю с остальными строками уже понятно - "${ifOutOctets.delta}:ifoutoctets:GAUGE:600:0:U\n" (исходящий байты) - "${ifInErrors.delta}:ifinerrors:GAUGE:600:0:U\n" (ошибки) - "${ifOutErrors.delta}:ifouterrors:GAUGE:600:0:U\n" - "${ifInDrops.delta}:ifindrops:GAUGE:600:0:U\n" (дропы) - "${ifOutDrops.delta}:ifoutdrops:GAUGE:600:0:U\n" - "${ifInUcastPkts.delta}:ifinucastpkts:GAUGE:600:0:U\n" (моноадресные пакеты) - "${ifOutUcastPkts.delta}:ifoutucastpkts:GAUGE:600:0:U\n" - "${ifInNUcastPkts.delta}:ifinncastpkts:GAUGE:600:0:U\n" (многоадресные пакеты) - "${ifOutNUcastPkts.delta}:ifoutncastpkts:GAUGE:600:0:U" Метод "make_dir" необходимо вызывать до метода "save_rrd_if" для того лишь, чтобы определить переменную DATADIR. В противном случае без вызова метода File она будет не определена. Скрипт для сохранения данных в rrdtool Далее необходимо создать скрипт сохранения данных в базу rrd /usr/local/sbin/rrdsave. Вот его листинг: #!/usr/local/bin/perl my (@ds,$line,$exe); my $FileName=<STDIN>; my $TimeStep=<STDIN>; my $RRAString=<STDIN>; chomp($RRAString,$TimeStep,$FileName); $FileName=~s/\"//g; my $rrdtoolpath='/usr/local/bin/rrdtool'; my $num=-1; while ( defined( $line=<STDIN> ) ) { chomp($line); $num++; $ds[$num]=$line; }; if( -e($FileName) ) { $exe=$rrdtoolpath.' update '.$FileName.' --template'; my $dsname=''; my $value=''; foreach my $ds1 (@ds) { my @prom=split/:/,$ds1; $dsname=$dsname.$prom[1].':'; $value=$value.$prom[0].':'; }; $value=~s/:$//; $dsname=~s/:$//; $exe=$exe.' '.$dsname.' N:'.$value; system($exe); } else { $exe=$rrdtoolpath.' create '.$FileName.' --step '.$TimeStep; foreach my $ds1 (@ds) { $ds1=~s/^.+?://; $exe=$exe.' DS:'.$ds1; }; $exe=$exe.' '.$RRAString; system($exe); system('/bin/chmod 644 '.$FileName); }; Изменим права доступа на данный скрипт: # chmod 755 /usr/local/sbin/rrdsave Запуск приложения Приложение готово к запуску, запускаем кому как удобно: # /usr/local/sbin/netmond # /usr/local/etc/rc.d/netmond.sh start (предварительно добавив в rc.conf 'netmond_enable="YES"') # /usr/local/sbin/netmondctl start Проверяем наличие процесса в памяти (# ps auxw|grep netmond), отсутствие ошибок в /var/log/messages, а так же наличие каталогов в RootDir: # cd /var/netmon && ls Единственный минусом можно назвать факт, что каталоги создались с правами 750. Для возможности работы системы отображения необходима возможность пользователю www иметь доступ к файлам, хранящимся в каталогах в /var/netmon. Для этого необходимо сменить права доступа на все подкаталоги, находящиеся в /var/netmon на 755. Самый быстрый (но не самый правильный) вариант: # chmod -R 755 /var/netmon Следует отметить, что все скрипты вызываемые из методов сохранения запускаются с правами пользователя netmon, так что необходимо предусмотреть возможность записи в каталоги с интерфейсами: # cd /var/netmon # chown -R netmon * Через пару минут после запуска netmond можно проверить наличие файлов rrdint в подкаталогах интерфейсов. При желании можно посмотреть содержимое фалов следующим образом: # rrdtool fetch rrdint AVERAGE[[/CODE]], где rrdfilename - имя созданного файла. Вот часть результат вывода данной команды: ifoperstatus ifinoctets ifoutoctets ifinerrors ifouterrors ifindrops ifoutdrops ifinucastpkts ifoutucastpkts ifinncastpkts ifoutncastpkts 1156826040: nan nan nan nan nan nan nan nan nan nan nan 1156826100: nan nan nan nan nan nan nan nan nan nan nan 1156826160: nan nan nan nan nan nan nan nan nan nan nan 1156826220: nan nan nan nan nan nan nan nan nan nan nan 1156826280: nan nan nan nan nan nan nan nan nan nan nan Информацию о файле можно посмотреть вот так: # rrdtool info rrdint Вот чать результата вывода команды: filename = "rrdint" rrd_version = "0003" step = 60 last_update = 1156912412 ds[ifoperstatus].type = "GAUGE" ds[ifoperstatus].minimal_heartbeat = 600 ds[ifoperstatus].min = 0.0000000000e+00 ds[ifoperstatus].max = 1.2500000000e+00 ds[ifoperstatus].last_ds = "UNKN" Работа с netstate Приведу немного изменённую цитату с http://soft.risp.ru : Netmond хранит все накопленные данные о текущем состоянии сети у себя в памяти, в специально предназначенных контейнерах - переменных VARIABLE. Значения VARIABLE могут вводиться в программу по результатам работы системы сбора данных, а выводиться с помощью разнообразных методов сохранения SAVE. Однако вывод данных с помощью SAVE выполняется только по инициативе самого Netmond (периодически или в зависимости от каких-то условий) совершенно конкретных значений, предусмотренных конфигурацией программы. Что может быть очень удобно при решении задач накопления и долговременного хранения данных, но, например, практически не пригодно для задачи получения мгновенной актуальной картины состояния всей сети в реальном времени. Для решения задачи вывода любых данных в произвольные моменты времени в Netmond встроен специальный сервер NetState, который обеспечивает авторизованным сетевым клиентам асинхронный доступ ко всему массиву переменных VARIABLE на чтение. Весь массив переменных VARIABLE представляется в виде иерархии имен переменных и их владельцев, разделенных специальным символом `!': Обьект!Подобьект!Переменная = Значение Возможно получение текущих и предыдущих значений переменных, а также выбор интересующих переменных по REGEX-маскам на их имена. Netstate сервер удобен для проверки правильности работы программы, а так же получения всех текущих переменных, например текущее показание счётчика байт на интерфейсе, состояние объекта (UP,DOWN), значение пользовательских переменных и т.п. Подключение к netstate выполняется по команде: # telnet 127.0.0.1 3333 В результате отобразится окно приветствия и сервер готов в выполнению команд пользователя: NetState server ready (timeout 30 sec.) Compress: ZLIB 1.2.2 ! В процессе отладки системы неплохо бы узнать основные команды. Приведу их в примерах Any ;* - покажет все переменные которые держит в памяти netmond. Object NAME - покажет имена всех объектов. Приведу часть вывода сервера на эту команду: !OBJECT Server-Proxy!NAME = "Server-Proxy" !OBJECT Catalyst11!NAME = "Catalyst11" !OBJECT Catalyst25!NAME = "Catalyst25" !OBJECT Catalyst34!NAME = "Catalyst34" !OBJECT Catalyst45!NAME = "Catalyst45" !OBJECT Catalyst46!NAME = "Catalyst46" Interface STATUS - покажет статус интерфейсов (DOWN,UP) Object Cisco - покажет переменные которые есть у объекта "Cisco" Interface Cisco!1 - покажет данные по интерфейсу "1" у объекта "Cisco" Any Cisco!1!IfIndex - покажет значение переменной IfIndex на интерфейсе/сервисе "1" объекта "Cisco". Настройка агентов SNMP Еще хотелось бы отметить, что для работы процесса съёма статистики с сетевого оборудования (сервера, коммутаторы, маршрутизаторы) необходимо настроить их SNMP программное обеспечение и определить comminuty string, которым уже будет пользоваться Method router. Приведу примеры минимальной настройки для оборудования и некоторых сервисов для снятия статистики по SNMP. Маршрутизаторы и коммутаторы Cisco: # conf t (config)# snmp-server enable informs (config)# snmp-server community public ro (public доступ на чтение ?ro?) Cisco PIX Firewall: # conf t (config)# snmp-server enable (config)# snmp-server community public Утилита bsnmpd из состава FreeBSD 5-STABLE и 6-STABLE: Настраиваем файл /etc/snmpd.conf. host := 172.21.81.3 system := 1 # FreeBSD read := "public" %snmpd begemotSnmpdDebugDumpPdus = 2 begemotSnmpdDebugSyslogPri = 7 begemotSnmpdCommunityString.0.1 = $(read) begemotSnmpdCommunityDisable = 1 begemotSnmpdPortStatus.[$(host)].161 = 1 begemotSnmpdPortStatus.127.0.0.1.161 = 1 begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1 begemotSnmpdLocalPortType."/var/run/snmpd.sock" = 4 sysObjectId = 1.3.6.1.4.1.12325.1.1.2.1.$(system) Добавляем в rc.conf строку bsnmpd_enable="YES" и запускаем: # /etc/rc.d/bsnmpd start Проверяем /var/log/messages на наличие/отсутствие ошибок. Пакет Net-SNMP из портов: Правим файл /usr/local/share/snmp/snmpd.conf, оставляем/добавляем запись про community string: rocommunity public 172.21.81.3 Добавляем в rc.conf строку snmpd_enable="YES" и запускаем: # /usr/local/etc/rc.d/snmpd.sh start Служба SNMP в Microsoft Windows Для начала устанавливаем службу: Пуск(Start)/ Настройка(Settings)/ Панель Управления (Control Panel)/ Установка удаление программ (Add or remove programs)/ Установка компонентов Windows (Add/remove Windows Components)/ Средства управления и наблюдения (Management and Monitoring Tools)/ Протокол SNMP (Simple Network Management Protocol). После установки необходимо выполнить настройку службы Пуск/ Настройка/ Панель управления/ Администрирование/ Службы. Находим службу "Служба SNMP" ("SNMP Service"), можно сразу выполнить переход на закладку "Безопасность". Добавляем новое имя сообщества (community string) по кнопке "Добавить" для чтения. Проверка работы SNMP агентов После запуска агентов SNMP необходимо выполнить проверку работы. Я делаю это через snmpwalk из пакета Net-SNMP вот так: % snmpwalk -v версия_протокола cc communitystring IP % snmpwalk -v 1 -c public 172.21.81.3 Если данные идут (на экране появится моного информации), значит служба работает как надо. Если не идут: либо не правильно задана community string, либо агент snmp не запущен, либо данному хосту нельзя забирать данные по SNMP. Для того чтобы определить IfIndex для интерфейсов, например в MS Windows, я делаю следующее: читаю ifTable (кому удобнее можете все данные по snmp прочитать) нахожу там что-то вроде: IF-MIB::ifNumber.0 = INTEGER: 2 IF-MIB::ifIndex.1 = INTEGER: 1 IF-MIB::ifIndex.65539 = INTEGER: 65539 IF-MIB::ifDescr.1 = STRING: MS TCP Loopback interface IF-MIB::ifDescr.65539 = STRING: Realtek RTL8139 Family PCI FastEthernet NIC Тут видно что имеется 2 интерфейса - Loopback и rl, имеющие ifIndex=1 и 65539 соответственно. Мониторинг интерфейсов, имеющих IfIndex больше 65535 ----------------------------------------------------- С такой задачей я столкнулся только при мониторинге серверов MS Windows. Причина в том, что netmond отказывается принимать интерфейсы в конфигурационном файле, имеющие IfIndex больше 65535, узнать об этом можно будет после запуска в файле /var/log/messages будет строка вроде "interface index out of range". Лекарство нашлось только маленькой правкой кода netmond в файле parseconf.y. Находим там поиском 2 строки содержащие "interface index out of range" и правим в условиях: if ($2 < 1 || $2 > 65535) цифру 65535 на что то вроде 655350 (может не совсем правильно, но я сделал так). После этого пересобираем netmond. # cd /usr/ports/net-mgmt/netmond # make patch # cd work/netmond-2.2-b6 # vi parseconf.y # cd /usr/ports/net-mgmt/netmond # make install clean Сохранение в rrdtool других числовых значений Для того чтобы сохранять какие-то другие числовые параметры (загрузка CPU Cisco маршрутизаторов, свободная память, количество процессов и т.п.) в rrdtool необходимо сначала их получать, то есть написать соответствующий метод опроса (см. http://soft.risp.ru), чтобы определить переменную в netmond. Если числовое значение считывается по SNMP через известный идентификатор, то можно в конфигурационном файле netmond прописать: Save "save_var" { # Создаём новый пользовательский метод сохранения данных в rrdtool # метод принимает 2 аргумента, первый имя создаваемого файла # второй строка с сохраняемыми данными # количество ячеек RRA определено в методе сохранения Pipe "/usr/local/sbin/rrdsave" Data "$DATADIR/$1\n" "60\n" "RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:60:10080\n" "$2" } Object "Cisco" { Address "10.1.1.1" Method router "public" Save "make_dir" Interface 1 { Save "make_dir" Save "save_rrd_if" } Interface 2 { Save "make_dir" Save "save_rrd_if" } # Прописываем переменную которую нам надо считать по SNMP # ВНИМАНИЕ ЭТО ВСЕГО ЛИШЬ ПРИМЕР ИДЕНТИФИКАТОРА $testvar 1.3.6.1.2.1.2.1.0 # Получаем значение переменной Method SNMP "public" {$testvar} # Вызываем метод сохранения, передав ему 2 параметра через пробел # имя файла лучше давать такое же как название переменой # строка ${testvar}:testvar:GAUGE:600:0:U уже была рассмотрена выше Save "save_var" "testvar ${testvar}:testvar:GAUGE:600:0:U" } После запуска netmond должен будет создать файл testvar в каталоге объекта "Cisco".Можно будет просмотреть какие данные будут положены в файл: # rrdtool fetch testvar AVERAGE Построение графиков из командной строки Таким образом, мы имеем систему сбора числовых параметров и сохранения их в rrdtool базу. Теперь самое дело отобразить полученные значения. Отображение можно сделать средствами командной строки (подробнее man rrdgraph). Я приведу пример скрипта для построения графиков байтовой загрузки для файлов интерфейсов, созданных методом "save_rrd_if": #!/bin/sh /usr/local/bin/rrdtool graph $1 \ --end $4 --start $3 \ --width 600 --height 400 \ --imgformat PNG --title "Image PNG" \ --color BACK#FAFAFA \ DEF:ifin=$2:ifinoctets:AVERAGE \ DEF:ifout=$2:ifoutoctets:AVERAGE \ CDEF:ifin1=ifin,60,/ \ CDEF:ifout1=ifout,60,/ \ VDEF:sumin=ifin1,TOTAL \ VDEF:sumout=ifout1,TOTAL \ VDEF:maxin=ifin1,MAXIMUM \ VDEF:maxout=ifout1,MAXIMUM \ VDEF:avgin=ifin1,AVERAGE \ VDEF:avgout=ifout1,AVERAGE \ AREA:ifin1#00FF00:In \ GPRINT:maxin:Max=%lf%s \ GPRINT:avgin:Avg=%lf%s \ GPRINT:sumin:Sum=%lf%s\l \ LINE1:ifout1#0000FF:Out \ GPRINT:maxout:Max=%lf%s \ GPRINT:avgout:Avg=%lf%s \ GPRINT:sumout:Sum=%lf%s\l Синтаксис использования: % /path/to/script /путь_до_создаваемого_изображения /путь_до_rrd_файла начальное_время_на_графике конечное_время_на_графике Время задаётся в формате, который воспринимает rrdtool. Я пользуюсь временем в таком виде: -1m (минуту назад), -54m (54 минуты назад), -12d (12 дней назад), now (текущий момент) и т.п. Пример использования данного скрипта: % script /tmp/graph.png /var/netmon/Cisco/Interface1/rrdint -1d now Первым параметром скрипт принимает имя создаваемого файла изображения, вторым - путь до файла содержащего rrd данные, 3 и 4 параметры определяют время, за которое будет построен график. Чтобы построить график, например, по моноадресным пакетом, достаточно будет поменять 2 строки, задать другой источник данных (другой столбец в нашем случае): Находим строки: DEF:ifin=$2:ifinoctets:AVERAGE \ DEF:ifout=$2:ifoutoctets:AVERAGE \ Меняем на: DEF:ifin=$2: ifinucastpkts:AVERAGE \ DEF:ifout=$2: ifoutucastpkts:AVERAGE \ Название столбцов можно посмотреть у файла через rrdtool fetch или rrdtool info. Чтобы построить данные из одного столбца, или одной переменной (как у нас в примере testvar) скрипт придётся модифицировать. Покажу пример как это сделать: #!/bin/sh /usr/local/bin/rrdtool graph $1 \ --end $4 --start $3 \ --width 600 --height 400 \ --imgformat PNG --title "Image PNG" \ --color BACK#FAFAFA \ DEF:varname=$2:testvar:AVERAGE \ LINE1:varname#0000FF:line Параметры скрипта те же самые, только изменены несколько параметров подписи данных на графике. Думаю, по данным примерам легко написать скрипты под другие задачи. Пример Web оболочки для работы с графиками Описанный выше способ построения графиков не всегда удобен. Некоторые задачи администрирования требуют просмотра многих графических зависимостей за короткий промежуток времени, поэтому мне пришлось написать под свои нужды некоторый web интерфейс на Perl для удобной работы с графиками загрузки интерфейсов сети. Скачать пример можно вот с http://neon.heavennet.ru/shownetmon.tar.gz (~13 Kb). Данный архив содержит 2 каталога (cgi-bin,data) и описание по установке. Принцип работы скрипта сводится к следующему: получив запрос от пользователя скрипт подключается к netstate порту у netmond и считывает имена всех интерфейсов, объектов и сервисов, а так же DATADIR для них. Скрипт на основании этих данных строит дерево объктов мониторинга с интерфейсами и пользователю остаётся лишь выбрать требуемый интерфейс для просмотр графика. Скиншот смотреть Здесь (~80 Кб). Настройка скрипта отображения данных: Копируем содержимое каталога cgi-bin (файл shownetmon) в соответствующий каталог web сервера. Даём право на запуск пользователю www: # chmod 755 /usr/local/www/cgi-bin/shownetmon В скрипте shownetmon устанавливаем адрес netstate порта у netmond: $main::config{'netstateaddress'} = "127.0.0.1"; # Адресс NETSTATE сервера $main::config{'netstateport'} = 3333; # Порт NETSTATE сервера Устанавливаем в скрипе каталог куда будут скаладыватся созданные изображения: $main::config{'imgdir'} = "/usr/local/www/data/img"; # Путь до создаваемых изображений $main::config{'webimgdir'} = "/img"; # Путь до изображений в www Создаём каталог /usr/local/www/data/img. Даём пользователю www возможность записи в него: # chmod 777 /usr/local/www/data/img или # chown www /usr/local/www/data/img # chmod 755 /usr/local/www/data/img Копируем папку data/shownetmon в соответствующий каталог web сервера. Даём права доступа пользователю www на все файлы в этой папке. Запускаем netmond если не запущен. Проверяем есть ли возможность с хоста заходить на порт NetSTATE. # telnet 127.0.0.1 3333 Если не удаётся подключится, то смотрим настройки firewall и конфиг netmon.conf на предмет netstate групп. Устанавливаем модуль Net-Telnet для perl если он отсутствует: # cd /usr/ports/net/p5-Net-Telnet Обращаемся http://IP/cgi-bin/shownetmon, предварительно включив JavaScript. Заключение В заключении хотел бы отметить нагрузку на компьютер, создаваемую созданной системой. Данная система разворачивалась на компьютерах с различной тактовой частотой CPU.Как показал опыт Intel Pentium 166 мог сохранять и отображать статистику примерно по 200 интерфейсам. Компьютер на базе Intel 867 Мгц справляется без труда с 500 интерфейсами (больше просто не было), не нагружая систему больше 1%. Лишь на момент сохранения нагрузка слегка возрастает на 1-5 секунд. Если учесть, что обновление данных в базах rrdtool идёт раз в минуту, можно сказать, что полученная система требует куда меньше ресурсов системы, чем старушка mrtg. P.S.: Текст статьи находится по ссылке http://neon.heavennet.ru/netmond_rrdtool.html

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, raven428 (ok), 17:10, 03/09/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    статью вкратце можно описать следующим образом: автор не смог разобраться с cacti, поэтому написал свой велосипед.

    cacti, с cactid данную задачу решает проще, лучше, красивее и удобнее.

     
     
  • 2.2, alex (??), 01:15, 04/09/2006 [^] [^^] [^^^] [ответить]  
  • +/
    и ваш комментарий можно покритиковать
    я даже не понимаю зачем cacti, если это все можно слелат при помощи rrdtool и элементарного скрипта на shell, с котором snmpget делает опрос счетчиков и обновляет базу rrd.
     
     
  • 3.4, raven428 (ok), 07:18, 04/09/2006 [^] [^^] [^^^] [ответить]  
  • +/
    слушайте, ну по какти нечего писать, там всё описано в документации. её надо прочитать и всё получится само.

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

     
  • 3.6, NEO (??), 17:03, 04/09/2006 [^] [^^] [^^^] [ответить]  
  • +/
    Истину глаголишь :-)
     
  • 3.7, Vault_Dweller (ok), 17:34, 04/09/2006 [^] [^^] [^^^] [ответить]  
  • +/
    >и ваш комментарий можно покритиковать
    >я даже не понимаю зачем cacti, если это все можно слелат при
    >помощи rrdtool и элементарного скрипта на shell, с котором snmpget делает
    >опрос счетчиков и обновляет базу rrd.

    угу... но как только кол-во железок помноженое на кол-во портов на них превысит Ваше терпение в дописывании оного скрипта под них - Вы сразу вспомните магическое слово cacti... простой шелл скрипт хорош на 2-3 ну на 5 железок с max 2-мя портами, потом начинается гимор... все это уже пройдено...

     
     
  • 4.10, tiger (??), 11:21, 04/05/2007 [^] [^^] [^^^] [ответить]  
  • +/
    а что мешает "осилить" дефолтовый конфиг netmond? там для нерусских написано
    # Hint:
    # '%include file.name' directive reduce config and make it more readable.
    от себя даю еще хинт:
    1) cp catalist1 catalist2
    2) тупо меняем адрес и comunity string (в вашем любимом и дюрявом кактусе тоже необходимые телодвижения)
    3) echo "%include catalist2">>netmond.conf
    4) перезапускаем netmond
    5) радуемся
    p.s. юзать еще и *sql для таких дел это "пять" (я про кактус). да, автора статьи не посмотрел но интересно насколько она отличается от хаутушки от авторов:)
    по поводу гемора.. я лично считаю что более геморно тупо тыкать мышой по чексоксам. много проще делать copy-paste интерфейсов в конфиге.
     

  • 1.3, MicRO (?), 03:01, 04/09/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья ваабще гуд, тут описано как все сделать а cacti это другая история пиши статью по ней если это ненравится, автор сделал своё дело
     
     
  • 2.5, chip (ok), 11:08, 04/09/2006 [^] [^^] [^^^] [ответить]  
  • +/
    Сделал дело - гуляй смело :)?!

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

     

  • 1.8, etz (??), 10:53, 06/09/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    отличный пример использования netmond и rrdtool.
     
  • 1.9, Pikador (ok), 16:57, 12/01/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья замечательная, не надо говорить. Автор очень точно описал все свои действия. Спасибо ему. По-больше бы статей такого качества!
     
  • 1.11, Cayz (??), 01:48, 05/09/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья отличная, нет лишних соплей, всё четко и ясно. Для начинающих админов вроде меня очень познавательно и информационно ёмко.
     
  • 1.12, gentooanonimus (?), 14:44, 14/07/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    тип данных (ifInOctets,ifOutOctets..) при всовывании в базу не GAUGE а COUNTERS !!
     
  • 1.13, Simplefest (??), 09:43, 19/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Шикарная статья! Будет применяться совместно с биллинговой системой. В биллинге есть данные, кто на каком порту сидит, оттуда будем генерировать конфиг, а отображать прямо в карточке абонента.

    Cacti и прочие "поделки" для этого не подходят, так что не надо про "велосипед". Cacti - вообще комбайн, со всеми вытекающими неповоротливостями и тормозами. А это решение идеально для тех, кому нужно решить подобную задачу наилучшим образом.

    Огромное спасибо автору!

     
  • 1.14, BH (?), 13:46, 15/04/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    чтобы понимать как работает какти, надо понимать как работает RRD и с чем его едят

    Недоадмины, ставящие кактус и не понимающие основ RRD обычно получают на своих графиках 120% (чего-угодно) при 100 возможных. :)))))

    Здесь http://live.daemony.org/freebsd/rrdtools-usage-for-server-stats-full-manual-b человек расжевал RRD пусть с "соплями" но тем не менее разжевал так что понятно все даже новичку. Поймете rrd построите все что захотите без всяких кактусов-забиксов и прочего бандажа.

     
     
  • 2.15, chip (ok), 14:01, 15/04/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Здесь http://live.daemony.org/freebsd/rrdtools-usage-for-server-stats-full-manual-b человек расжевал RRD пусть с "соплями" но тем не менее
    >разжевал так что понятно все даже новичку. Поймете rrd построите все
    >что захотите без всяких кактусов-забиксов и прочего бандажа.

    Понимание основ RRD не мешает использовать cacti. Более того, никто не запрещает интегрировать сторонний RRD в cacti. Наколенные решения плохи, например, тем, что не позволяют вести политику доступа, например, по определенным графикам. Или опять предлагаете городить огород с HTTP-AUTH?

     
     
  • 3.16, BH (?), 22:34, 15/04/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Какти позволяет создавать свои шаблоны для снятия статистики чего-то там. Не понимая как работает RRD по нормальному этих шаблонов не сделаешь. Вот я об этом и говорил.

    Стандартные шаблоны которые идут уже установленные, не всегда верно рисуют статистику.

     
     
  • 4.17, chip (ok), 09:47, 16/04/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Стандартные шаблоны которые идут уже установленные, не всегда верно рисуют статистику.

    Если Вы можете написать шаблоны, охватывающие больший спектр ОС, предложите.

    cacti достаточно удачная система шаблонизации для RRD. Для новичка нужно минимум знаний для начала работы. Из действительно минусов можно отметить, что порой для создания некоторых однотипных графиков приходится осуществлять мышиную возню, чего можно было бы избежать в случае с собственным RRD. Этот минус легко побороть потратив один вечер на изучение внутренней структуры cacti (по времени не сравнимо с затратами на написание собственных sh/perl обвязок).

     
  • 2.20, Дмитрий (??), 07:35, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Уважаемый переадмин, объясните мне вот такой факт: что кактус, что ручками написанный скрипт, генерирующий графики на основе РРД, при изменении интервала времени выдают совершенно разные значения. К примеру, возьмём момент времени Среда, 18:00: за интервал "последний день" значение исследуемой величины больше 1М, а за интервал "последние 2 дня" почему-то это же значение не доходит даже до 700К.
    Вот такие вот 103% "Единой России"...
     
     
  • 3.21, Аноним (-), 16:06, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > объясните мне вот такой факт: что кактус, что ручками написанный
    > скрипт, генерирующий графики на основе РРД, при изменении интервала времени выдают
    > совершенно разные значения. К примеру, возьмём момент времени Среда, 18:00: за
    > интервал "последний день" значение исследуемой величины больше 1М, а за интервал
    > "последние 2 дня" почему-то это же значение не доходит даже до
    > 700К.

    Думаю Вам стоит все же повнимательнее почитать как работает rrd.

     
     
  • 4.22, Дмитрий (??), 06:17, 27/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >> объясните мне вот такой факт: что кактус, что ручками написанный
    >> скрипт, генерирующий графики на основе РРД, при изменении интервала времени выдают
    >> совершенно разные значения. К примеру, возьмём момент времени Среда, 18:00: за
    >> интервал "последний день" значение исследуемой величины больше 1М, а за интервал
    >> "последние 2 дня" почему-то это же значение не доходит даже до
    >> 700К.
    > Думаю Вам стоит все же повнимательнее почитать как работает rrd.

    Почитал внимательнее. Из 100 мануалов только в 1 оказался интересующий меня момент. Теперь самописный скрипт работает корректно. А кактус как врал, так и врёт.

     

  • 1.18, Arwen (?), 15:02, 28/12/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    здравствуйте. Нужна помощь. Скажите сохраняет ли RRD tool данные по которым строит графики в отдельные файлы в табличной (числовой) форме? Срочно нужны данные по сетевому трафику.
     
     
  • 2.19, chip (ok), 16:05, 28/12/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >здравствуйте. Нужна помощь. Скажите сохраняет ли RRD tool данные по которым строит
    >графики в отдельные файлы в табличной (числовой) форме? Срочно нужны данные
    >по сетевому трафику.

    rrdtool dump filename.rrd

    Формат XML.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру