Как стать автором
Обновить

Сумма измерений показателя в rrdtool

Время на прочтение3 мин
Количество просмотров2.3K
Об чем

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\" ";


Итого, было:
было

стало:

стало

Ну и как же без нгинкса и подсчета миллионов показов на нашем хайлоад сайте и его статистики!
было:

было

стало:

image
Теги:
Хабы:
Всего голосов 5: ↑3 и ↓2+1
Комментарии1

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн