ZABBIX: сделаем жизнь красивее

PHP
Здравствуйте, с недавнего времени в нашей конторе внедряется система мониторинга ZABBIX. Всем она хороша да прекрасна (споры можно везти долго на эту тему), только вот нас никак не устраивало две вещи:
1. Хотелось, чтобы на странице «Последние данные» каждый элемент данных подсвечивался бы цветом в зависимости от статуса триггера. Это очень наглядно.
2. На графиках вертикальная ось по умолчанию отображает только цифры (это конечно логично), но не очень удобно, когда смотришь, к примеру, пинг узла… Можно еще привыкнуть к нулям и единицам там, но вот значения в виде 0.1, 0.2, 0.3… совсем выглядят дико. Поэтому мы и задались целью сделать так, чтобы лишние значения не отображались, а нужные показывались, к примеру, «Доступен» или «Не доступен».

Как у нас это получилось смотреть под хабракатом.
Последние данные
Для решения задачи открываем в редакторе файл latest.php. В самом начале, сразу после второго
<?php
вставляем
$max=array();

и затем ищем строчку примерно 274. Там должен быть уже имеющийся код:
$db_app['item_cnt']++;

if(isset($showAll) $$ !empty($apps) $$ !isset($apps[$db_app['applicationid']])) continue;

и вставляем между этими строчками свой кусок кода:
$val=0;
$sql = 'SELECT DISTINCT t.value'.
 ' FROM functions f, triggers t'.
 ' WHERE f.itemid='.$db_item['itemid'].
 ' AND t.triggerid=f.triggerid'.
order_by('t.value');
while ($db_trig = DBfetch($db_trigs)){
if (!isset($max[$db_app['applicationid']])) $max[$db_app['applicationid']]=0;
if ($db_trig['value'] > $max[$db_app['applicationid']]) $max[$db_app['applicationid']]=$db_trig['value'];
$val=$db_trig;
}

Тем самым, мы извлекли из БД значения триггеров для каждого элемента данных и определили максимальное значение из них (0 соответствует не сработавшему триггеру). Спускаемся ниже по коду на 30-40 строк до:
$item_status = $db_item['status']==3?'unknown': null;
array_push($app_rows, new CRow(array(

И опять начинаем править:
array_push($app_rows, new CRow(array(
SPACE,
is_show_all_nodes()?SPACE:null,
($_REQUEST[hostid]>0)?NULL:SPACE/
new CCol(SPACE.SPACE.$description, get_severity_style($val['value']*4,1)),
new CCol($lastclock, get_severity_style($val['value']*4,1)),
new CCol($lastvalue, get_severity_style($val['value']*4,1)),
new CCol($actions, get_severity_style($val['value']*4,1)),
)));

Стоит отметить, что мы убрали столбец «Изменение», если он нужен, то просто добавьте строчку
new CCol($change, get_severity_style($val['value']*4,1)),

Умножать можно не только на 4, поиграйтесь с этим параметром для получения наиболее красивого цвета по вашему мнению.
Но это еще не все. Пока что, цвет изменять строчки только если развернуть список, но мы же хотим, чтобы цвет меняла и строчка, содержащая название узла сети, для этого идем еще чуть ниже по коду (еще строчек 40) и находим:
$link = new Clink($img,$url);
$col = new CCol(array(bold($db_app['name']),SPACE.'('.$db_app['item_cnt'].SPACE.S_ITEMS.')')));

Меняем на:
$link = new Clink($img,$url);
if (max[$appid] > 0) $max[$appid]=1;
if (isset($max[$appid])) $col = new CCol(array(bold($db_app['name']),SPACE.'('.$db_app['item_cnt'].SPACE.S_ITEMS.')'),get_severity_style($max[$appid]*5,1)));
else $col = new CCol(array(bold($db_app['name']),SPACE.'('.$db_app['item_cnt'].SPACE.S_ITEMS.')'),get_severity_style($max[$appid]*2,1)));
$col->setColSpan(5);

Ну вот и все. Как это выглядит у нас, представлено на картинке:image

Графики
Тут тоже нет ничего сложного. Единственное условие: должны быть назначено преобразование значений (Администрирование->Общие->Преобразование значений).
Открываем файл ./inlude/class/class.cchart.php на 1323 строчке и вставляем туда этот код:
$sql = 'SELECT DISTINCT m.valuemapid, m.value, m.newvalue'.
 ' FROM items i, mappings m'.
 ' WHERE i.itemid = '.this->items[0]['itemid'].
 ' AND m.valuemapid=i.valuemapid'.
 ' ORDER BY m.value';
$db_mapping = DBselect($sql);
while (%mapping = DBfetch($db_mappings)){

Закрывающуюся фигурную скобку надо поставить 30-ю строчками ниже, сразу после окончания цикла
for($i=0; $i<=$hstr_count; $i++){

Теперь внутри этого цикла вставляем строки (отмечены жирным):
$val = $i * %step + $minY;
if (bccomp(исфвв($val, bcdiv($dev,2)), $maxY) == 1) continue;
<b>$str='';
id ($mapping['valuemapid'] == 0) $str = convert_units($val, $units, ITEM_CONVERT_NO_UNITS);
if ($val == $mapping['value'])
 $str=$mapping['newvalue'];
</b>

После этого цикла
for
идут строчки кода, которые выводят максимальное значение. Мы его убрали, закомментировав там сточку
$str
.
Правда теперь, на тех графиках, где нет преобразования значений, ничего не будет подписываться на оси. Решается это вставкой одного значения в БД заббикса.
# mysql -u zabbix -p *****
use zabbix;
INSERT INTO `zabbix`.`mappings` (`mappingid`, `valuemapid`, `value`, `newvalue`) VALUES ('4', '0', '0', '0');

Результат на рисунке:
image

P.S. У нас используется ZABBIX v.1.83. Наше решение не претендует на гениальность, но оно вполне рабочее и достаточно простое.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.