Об чем
RRD и RRDTool прочно вошли в нашу жизнь как средство хранения статистических данных данных и отрисовки графиков по ним. Если с графиками в принципе все понятно, то из поля легенды можно извлечь еще немного пользы. В частности, можно выводить сумму всех значений источника данных (datasource), например входящий траффик за промежуток времени, что можно использовать в дальнейшем для приблизительных прикидок. Мой пример для pnp4nagios, но верно для всех остальных систем на основе rrdtool.
Как сделать
rrdtool позволяет задавать пользовательские представления данных при помощи встроенных функций на основе исходных, в частности есть функции MIN, MAX, сложения, вычитания и так далее, в данном случае нам пригодится функция TOTAL. Что она делает понятно из названия — возвращает уровень из каждого промежутка умноженный на размер шага, что и даст общую сумму показателя.
Исходный шаблон выглядел примерно так:
$opt[1] = " --vertical-label \"Traffic\" -b 1000 --title \"Interface Traffic for $hostname / $servicedesc\" ";
$def[1] = "DEF:var1=$rrdfile:$DS[1]:AVERAGE " ;
$def[1] .= "DEF:var2=$rrdfile:$DS[2]:AVERAGE " ;
$def[1] .= "LINE1:var1#003300:\"in \" " ;
$def[1] .= "GPRINT:var1:LAST:\"%7.2lf %Sb/s last\" " ;
$def[1] .= "GPRINT:var1:AVERAGE:\"%7.2lf %Sb/s avg\" " ;
$def[1] .= "GPRINT:var1:MAX:\"%7.2lf %Sb/s max\\n\" " ;
$def[1] .= "LINE1:var2#00ff00:\"out \" " ;
$def[1] .= "GPRINT:var2:LAST:\"%7.2lf %Sb/s last\" " ;
$def[1] .= "GPRINT:var2:AVERAGE:\"%7.2lf %Sb/s avg\" " ;
$def[1] .= "GPRINT:var2:MAX:\"%7.2lf %Sb/s max\\n\" ";
Определяем два новых источника данных из var1 (input traffic) и var2 (output traffic)
$def[1] .= "VDEF:totalin=var1,TOTAL ";
$def[1] .= "VDEF:totalout=var2,TOTAL ";
Теперь в переменных totalin & totalout у нас как раз суммы, осталось вывести их в легенды, для этого добавляем
$def[1] .= "GPRINT:totalin:\"%3.2lf %s ttl\\n\" ";
$def[1] .= "GPRINT:totalout:\"%3.2lf %s ttl\\n\" ";
Попутно убираем переводы строк и в итоге получается:
$opt[1] = " --vertical-label \"Traffic\" -b 1000 --title \"Interface Traffic for $hostname / $servicedesc\" ";
$def[1] = "DEF:var1=$rrdfile:$DS[1]:AVERAGE " ;
$def[1] .= "DEF:var2=$rrdfile:$DS[2]:AVERAGE " ;
$def[1] .= "VDEF:totalin=var1,TOTAL ";
$def[1] .= "VDEF:totalout=var2,TOTAL ";
$def[1] .= "LINE1:var1#003300:\"in \" " ;
$def[1] .= "GPRINT:var1:LAST:\"%7.2lf %Sb/s last\" " ;
$def[1] .= "GPRINT:var1:AVERAGE:\"%7.2lf %Sb/s avg\" " ;
$def[1] .= "GPRINT:var1:MAX:\"%7.2lf %Sb/s max\" " ;
$def[1] .= "GPRINT:totalin:\"%3.2lf %s ttl\\n\" ";
$def[1] .= "LINE1:var2#00ff00:\"out \" " ;
$def[1] .= "GPRINT:var2:LAST:\"%7.2lf %sb/s last\" " ;
$def[1] .= "GPRINT:var2:AVERAGE:\"%7.2lf %Sb/s avg\" " ;
$def[1] .= "GPRINT:var2:MAX:\"%7.2lf %Sb/s max\" ";
$def[1] .= "GPRINT:totalout:\"%3.2lf %s ttl\\n\" ";
Итого, было:
стало:
Ну и как же без нгинкса
было:
стало: