alibek Posted June 21, 2016 · Report post Использую Cacti для рисования графика по некоторым характеристикам. Часть данных для графиков получаем сам Cacti (по SNMP). Часть данных получает скрипт и сохраняет прямо в RRD-файлы. С одним из таких файлов непонятная проблема, график пустой, выводит по всем показателям nan. В файле данные вроде бы есть, сам файл прикрепил аттачем. Скрипт (на Perl) работает следующим образом: 1. Формируется и запускается задание для опроса, примерно таким образом: my $lib = NetViewLib->new(); $lib->host('BRAS11-C7201', 'host'=>'10.1.10.211', 'snmp-community'=>'c1'); $lib->ds('cpu', 'path'=>'core', 'fields' => [{ 'name' => 'cpu_5sec', 'max'=>100 },{ 'name' => 'cpu_1min', 'max'=>100 },{ 'name' => 'cpu_5min', 'max'=>100 }]); $lib->ds('status', 'path'=>'core', 'fields' => [qw(sys_uptime int_count)]); $lib->ds('memory', 'path'=>'core', 'fields' => [qw(mem_size mem_used mem_free)]); $lib->ds('temperature', 'path'=>'core', 'default-max'=>200, 'fields' => [qw(temp_value_core temp_value_inlet temp_value_outlet temp_alarm_core temp_alarm_inlet temp_alarm_outlet temp_last_core temp_last_inlet temp_last_outlet)]); $lib->task('cpu_5sec', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.2.1.56.0'); $lib->task('cpu_1min', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.2.1.57.0'); $lib->task('cpu_5min', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.2.1.58.0'); $lib->task('mem_free', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.48.1.1.1.6.1'); $lib->task('mem_used', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.48.1.1.1.5.1'); $lib->task('mem_size', 'method'=>'calc', 'proc'=>sub{my $data = shift; return $data->{'mem_used'}+$data->{'mem_free'}}); $lib->task('temp_value_inlet', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.3.1'); $lib->task('temp_value_outlet', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.3.2'); $lib->task('temp_value_core', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.3.3'); $lib->task('temp_alarm_inlet', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.4.1'); $lib->task('temp_alarm_outlet', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.4.2'); $lib->task('temp_alarm_core', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.4.3'); $lib->task('temp_last_inlet', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.5.1'); $lib->task('temp_last_outlet', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.5.2'); $lib->task('temp_last_core', 'method'=>'snmp', 'oid'=>'.1.3.6.1.4.1.9.9.13.1.3.1.5.3'); $lib->task('int_count', 'method'=>'snmp', 'oid'=>'.1.3.6.1.2.1.2.1.0'); $lib->task('sys_uptime', 'method'=>'snmp', 'oid'=>'.1.3.6.1.2.1.1.3.0', 'proc'=>sub{return int($_[0]/100)}); $lib->start(); 2. Сформированное задание запускается в несколько потоков. По итогам завершения отдельных потоков результаты фиксируются в файл, причем в лог-файле дублируется полученная в опросе информация: my $rrd = RRD::Editor->new(); my $file = "$config->{'RRD-DATA'}/" . ($ds->{'path'} ? "$ds->{'path'}/" : "") . ($host && !$local->{'host'}->[&_index_host($host)]->{'nosubpath'} ? "$host/" : "") . "$ds->{'name'}.rrd"; my $tpl = "--template " . join(':',map {$_->{'name'}} @{$ds->{'fields'}}); my $output = ($clock||'N') . ":" . join(':', map {(defined $data->{($_->{'task'}||$_->{'name'})} ? $data->{($_->{'task'}||$_->{'name'})} : 'U')} @{$ds->{'fields'}}); unless (-e $file) { my $rra = &_rrd_rra(); my $def = &_rrd_ds(); $rrd->create("--start " . ($clock - $rrdstep) . " --step $rrdstep $def->{$ds->{'name'}} $rra"); $rrd->save($file); $rrd->close(); } print "[$ds->{'name'}] $output\n" if $config->{'OUTPUT'}->{'ECHO'}; $rrd->open($file); $rrd->update("$tpl $output"); $rrd->close(); Логику скрипта по фрагменту не понять, поэтому покажу примером. Результатом работы скрипта будут примерно такие строки: [cpu] 1466493601:10:11:10 [status] 1466493601:8553284:611 [memory] 1466493601:1883875148:35416236:1848458912 [temperature] 1466493601:38:22:25:105:59:64:37:22:25 В квадратных скобках указано имя DS, затем идет timestamp, а затем идут значения полей. Эти данные сохраняются в соответствующий DS RRD-файл. Судя по этим данным, скрипт значения температуры получает. Но на графике температуры эти значения почему-то не отображаются, там везде nan. Хотя графики для cpu и memory, которые устроены таким же образом и их обрабатывает тот же программный код, отображаются нормально. temperature.zip cpu.zip Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Mystray Posted June 22, 2016 · Report post А зачем у вас минимальное значение прописано? Я не думаю, что 200+ градусов - это норма, и туда вообще могут влетать подобные значения:) <ds> <name> temp_value_core </name> <type> GAUGE </type> <minimal_heartbeat>120</minimal_heartbeat> <min>2.0000000000e+02</min> <max>NaN</max> <!-- PDP Status --> <last_ds>38</last_ds> <value>NaN</value> <unknown_sec> 1 </unknown_sec> </ds> Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted June 22, 2016 · Report post Странно, я вроде бы прописывал максимальное значение, а не минимум. P.S. Да, опечатка в программном коде библиотеки. $res->{$ds->{'name'}} .= ":" . uc($fld->{'min'}||$ds->{'default-max'}||'0'); $res->{$ds->{'name'}} .= ":" . uc($fld->{'max'}||$ds->{'default-min'}||'U'); Спасибо, исправлю. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...