вторник, 18 января 2011 г.

Cacti не рисует графики - что делать?

imageОчень часто, когда мы начинаем писать свои скрипты получения данных, нас начинает преследовать так называемая проблема NaN - график не отображает данные. Когда я делал первые свои графики это просто ужас как бесило и заставляло меня ругать Cacti. Тратил кучу времени на то что вновь и вновь заново создавал источники данных, переписывал скрипт, искал чорт знает что вобщем. Потом, всеже успокоившись, решил перейти к методическому убийству данной проблемы. В результате набрел на хороший англоязычный ман по лечению данной проблемы и вольно перевел его для себя и глядишь тем пригодится кто только отправляется в битву за графики с Cacti. Итак пошаговое руководство в борьбе с NaN в Cacti.

Проверка Cacti логфайла

В первую очередь следует заглянуть в него. Обычно он находится по адресу /log/cacti.log. В противном случае необходимо заглянуть в настройки - Settings, Paths. В случае если в данном лог файле будет встречаться

SPINE: Host[...] DS[....] WARNING: SNMP timeout detected [500 ms], ignoring host '...'

Это означает вероятнее всего, что опрашиваемое вами устройство не может полностью отработать, то количество SNMP OID в SNMP запросе, которое к нему приходит. Для устранения этой ошибки следует уменьшит количество SNMP OID в запросе. Идем в Settings, Poller и уменьшаем значение The Maximum SNMP OID's Per SNMP Get Request. Следует установить значение в 1 и после того как poller начнет собирать требуемую статистику, следует его постепенно увеличить, выбрав подходящее для вашего случая значение.

Проверка функционирования вашего скрипта

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

su - cactiuser
/full/path/to/perl your-perl-script.pl p1 p2
... (проверяем ответ)

Если вы получаете данные посредством snmp запроса, то для проверки следует использовать snmpget, в запросе укажите OID, используйте тоже значение community и укажите версию snmp, туже что вы определили в cacti. Например опрос OID of .1.3.6.1.4.blablabla, со значением community "very-secret" и версией 2 SNMP опрашиваемый хост target это будет выглядеть вот так:

snmpget -c very-secret -v 2c target .1.3.6.1.4.blablabla
.... (проверяем ответ)


Проверяем Cacti Poller

В первую очередь проверьте наличие poller.php в cron. Эта программа вызывает базовый скрипт cmd.php, или spine, альтернативный метод запросов данных, написанный на C. Установить какой поллер используется встроенный или spine можно в настройках - Settings, Poller. Если вы хотите использовать Spine, то его следует установить отдельно, в базовую установку Cacti он не входит.
Теперь следует очистить лог файл /log/cacti.log (ну или переименуйте его, чтобы не было "старого мусора"). Затем измените настройки - Settings, Poller Logging Level установив значение DEBUG.
Теперь вам следует определить ID вашего запроса и ID вашего хоста. Найти требуемый вам ID запроса следует в меню Data Sources. ID хоста определяется в меню Devices.
Теперь следует запустить наш poller вручную и только для выбранного нами запроса данных. Делается это следующим образом -

php -q cmd.php id id

если вы используете Spine, то запустить такую проверку в режиме логгирования на уровне Debug можно вот так:

./spine --verbosity=5 id id

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

Проверка состояние MySQL

В большинстве своем данная проверка является излишней, и ее можно на первом этапе дабага проблемы просто опустить, но в случае если все далее описанные шаги, показывают что все работает правильно, то следует ее всеже сделать.
В дебаг логе, найдите запрос MySQL update соответствующий исследуемому хосту. Там будет SQL запрос который следует выполнить непосредственно на сервере mysql либо через терминал, либо средствами phpmyadmin. Проверьте что запрос сервером mysql выполняется корректно.

Проверка обновления RRD файла

Проверьте лог файл, в нем должны быть примерно такие строки:

rrdtool update filename --template ...

Для каждого RRD файла должна быть одна строка в логе.
RRD файлы должны создаваться изначально самим поллером. Если он их не создал то соответственно не пойдет и их обновление. Если их нет, проверьте Poller Cache в меню Utilities и проверьте там запрос к файлу.

Проверка владельца RRD файлов

Если rrd файлы были созданы с правами root-а, а поллер запущен в системи с привилегиями cactiuser , то естественно поллер не сможет обновить данные в RRD файле.

cd /var/www/html/cacti/rra
ls -l localhost*
-rw-r--r-- 1 root root 463824 May 31 12:40 localhost_load_1min_5.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_mem_buffers_3.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_mem_swap_4.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_proc_7.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_users_6.rrd


Выполните следующую команду для решения такой проблемы, если она у вас присутствует:

chown cactiuser:cactiuser *.rrd

Проверка пределов в RRD файле

Возможно причиной ваших проблем являются некорректно установленные пределы MAXIMUM и MINIMUM в RRD файле данных. Выполните следующее:

rrdtool fetch rrd_file AVERAGE

просмотрите 10-20 строк и если вы там видите NaN, то:

rrdtool info rrd_file

нас интересуют значения ds[loss].min ds[loss].max (loss - это частный пример - у вас будет имя ваших данных) и в результате вы увидите например такую картину:

ds[loss].min = 0.0000000000e+00
ds[loss].max = 1.0000000000e+02


В данном примере мы имеем MINIMUM = 0 и MAXIMUM = 100. Теперь следует сравнить значение ds.[…].type=ВЕЛИЧИНА, то есть мы убеждаемся что полученная нами ВЕЛИЧИНА находится в установленных значениях максимума и минимума.
Если значение не укладывается в установленные пределы , то недостаточно изменить пределы в Data Template, следует выполнить :

rrdtool tune rrd_file --maximum ds-name:new_ds_maximum>

где ds_name имя для данных определенное внутри RRD файла, а new_ds_maximum - новое значение максимума для данных. (Изменение минимума делается аналогично).
На этом шаге следует также проверить значения step и heartbeat интересующего нас RRD файла.

Проверка связи RRD файла и графика


Наконец следует проверить те ли хранилища данных использует график, который мы пытаемся получить. Идем в Graph Management и выбираем наш график. В данном режиме выбираем Turn On Graph Debug Mode и в появивишемся окне RRDTool Command: видим к каким RRD файлам обращается наш график (на это указывает выражение DEF).

Разное

До версии 0.8.6j, poller_output мог "вылезти за грани разума" ).
Эо обычно происходило из-за параметров настройки памяти в php.ini в значение 8 МБ. Измените данное значение по крайней мере на 64 MB.
Чтобы проверить это, выполните sql запрос через mysql cli (или phpmyadmin)
select count(*) from poller_output;
Для устранения проблемы выполните:
truncate table poller_output;
Данная проблема решена, начиная с версии 0.8.7

Установка через RPM

Некоторые RPM инсталяции некорректно встраивают поллер в cron - в результате поллер присутствует в cron в двух таблицах. Необходимо сделать проверку /etc/crontab и таблицы cron пользователя cactiuser (ну или как вы там у себя его назвали) и настроить cron так чтобы вызов шол однократно.

Не Nan , но значение 0

Во первых, внимательно пишите свои скрипты. Если в ы в скрипте используете внешние команды, то не надо надеятся на переменную $PATH. Указывайте нормальный, полный путьдо команды /full/path/to/external/command

Во вторых, следите чтобы скрипт выполнялся быстро. Если в логах cacti вы видите “U”, это значит что Cacti устал ждать выполнения скрипта , и в результате вы словите NaN. Скрипт должен выполняться быстро! Но это уже ваша забота по его оптимизации.

Удачи вам в ваших графопостроениях c Cacti!

З.Ы. Данную статью когдато писал для Хабра, но так как аккаунт там ушел в вечный бан, по просьбам нормальных людей статью восстановил.

Комментариев нет:

Отправить комментарий