Jump to content

Recommended Posts

Posted

Использую 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

Posted

А зачем у вас минимальное значение прописано? Я не думаю, что 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>

Posted

Странно, я вроде бы прописывал максимальное значение, а не минимум.

 

P.S. Да, опечатка в программном коде библиотеки.

$res->{$ds->{'name'}} .= ":" . uc($fld->{'min'}||$ds->{'default-max'}||'0');                                                                                                  
$res->{$ds->{'name'}} .= ":" . uc($fld->{'max'}||$ds->{'default-min'}||'U');                                                                                                  

Спасибо, исправлю.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.