加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

利用perl rrdtool绘制网络流量图

发布时间:2020-12-15 20:59:56 所属栏目:大数据 来源:网络整理
导读:? ? 一直很想了解nagios中的pnp是如何工作的,正好看到这几天cu上有人问rrdtool如何图像。这几天特地的翻了翻rrd的资料,补习了下。结合perl的一些模块,获取所需要的数据,最后调用rrdtools绘制图像。好了,废话不多说了,开始讲解实现过程。 一、 所需软件

? ? 一直很想了解nagios中的pnp是如何工作的,正好看到这几天cu上有人问rrdtool如何图像。这几天特地的翻了翻rrd的资料,补习了下。结合perl的一些模块,获取所需要的数据,最后调用rrdtools绘制图像。好了,废话不多说了,开始讲解实现过程。

一、 所需软件以及安装方法
? ? 1.安装rrdtool (这里不多说了,网上文章太多了),安装默认路径/usr/local/rrdtool/
? ? 2.安装perl所需要的模块:
RRD::Simple ---------用于调用rrdtool绘制图像
Sys::Statistics::Linux ---------用于获取系统的一些动态数据(例如,网卡流量,CPU,磁盘IO)存储在yml文件中
YAML----------用于解析yml中的数据
#cpan ??
cpan>install??RRD::Simple ?Sys::Statistics::Linux YAML
二、rrdtool的简要原理
? 可能直接贴代码,很多人不理解原理。这里我就讲下rrdtool绘制图像的简要原理。


?

?

三、代码

?

 
 
  1. #!/usr/bin/perl ?
  2. use?strict; ?
  3. use?warnings; ?
  4. use?RRD::Simple?qw(:all); ?
  5. use?YAML; ?
  6. use?Sys::Statistics::Linux; ?
  7. my?$rrdfile?=??'/home/mcshell/tmp/myfile.rrd'; ?
  8. my?$rrdfile_tmp?=?'/home/mcshell/tmp/myfile_tmp.rrd'; ?
  9. my?$rrd?=?RRD::Simple->new(?file?=>?"$rrdfile"?); ?
  10. my?$rrd_tmp?=?RRD::Simple->new(?file?=>?"$rrdfile_tmp");?#建立一个临时rrd用于计算5分钟内变化的差值 ?
  11. unless(-e?$rrdfile){ ?
  12. ?$rrd->create(?????????????????????????????????????????#如果没有rrd则进行建立一个rrd ?
  13. ?????????????bytesIn?=>?"GAUGE",??????????????????????#定义数值源类型 ?
  14. ?????????????bytesOut?=>?"GAUGE",?????? ?
  15. ?????????); ?
  16. ?$rrd_tmp->create( ?
  17. ?????????????bytesIn?=>?"GAUGE",?
  18. ?????????????bytesOut?=>?"GAUGE",?
  19. ?????????); ?
  20. ?} ?
  21. my?($now_input,$now_output,$input,$output); ?
  22. ?
  23. my?$lxs?=?Sys::Statistics::Linux->new(????#这里进行获取网卡的流量(这个模块可以获取多个系统参数,如cpu,process,磁盘IO) ?
  24. ??????????????????????????????????????????#可以根据这些可以绘制这种图形。 ?
  25. netstats?=>?{ ?
  26. ????????????init?????=>?1,?
  27. ????????????initfile?=>?'/tmp/netstats.yml',??#数据存入yml文件 ?
  28. ????????},?
  29. ); ?
  30. ??? ?
  31. ????my?$stat?=?$lxs->get; ?
  32. my?$config?=?YAML::LoadFile('/tmp/netstats.yml');#解析yml文件 ?
  33. $now_input?=?$config->{eth0}->{rxbyt};?? ?
  34. $now_output?=?$config->{eth0}->{txbyt}; ?
  35. my?$info?=?$rrd->info("$rrdfile_tmp");??#获取tmp的数据 ?
  36. my?$before_input_5=$info->{ds}->{bytesIn}->{last_ds};???#获取5分钟之前的数据 ?
  37. my?$before_output_5=$info->{ds}->{bytesOut}->{last_ds}; ?
  38. if?($before_input_5??eq?'U'?||?$before_output_5?eq?'U'){ ?
  39. ????$before_input_5?=?$now_input; ?
  40. ????$before_output_5?=?$now_output; ?
  41. } ?
  42. $input?=?$now_input?-?$before_input_5;???#5分钟变化的数据 ?
  43. $output?=?$now_output?-?$before_output_5; ?
  44. ?
  45. $rrd->update( ?
  46. ?????????????bytesIn?=>?"$input",?
  47. ?????????????bytesOut?=>?"$output",?
  48. ?????????); ?
  49. $rrd_tmp->update( ?
  50. ?????????????bytesIn?=>?"$now_input",?
  51. ?????????????bytesOut?=>?"$now_output",?
  52. ?????????); ?
  53. my?$starttime?=?time;????????????????#获取当前unix时间戳 ?
  54. my?$endtime?=?$starttime?-?7200;???#2个小时之前的unix时间戳 ?
  55. my?%rtn?=?$rrd->graph(??#这里是定义每周,每月,每年的图形。 ?
  56. ????????timestamp?=>?"both",? ?
  57. ????????????????periods?=>?[?qw{????weekly?monthly?annual}??],??#定义所需的周期文件 ?
  58. ???????????????title?=>?"Network?Interface?eth0",?
  59. ???????????????vertical_label?=>?"Bytes/sec",?
  60. ???????????????line_thickness?=>?2,??????#画线的像素 ?
  61. ??????????????extended_legend?=>?1,?????#打开详细信息 ?
  62. ?????????); ?
  63. ?%rtn?=?$rrd->graph(???????????????#这里是定义一个2小时的图形,去掉下面的end,start为一天的图 ?
  64. ?????????????destination?=>?"/var/www/html",?
  65. ????????????????timestamp?=>?"both",?
  66. periods?=>?[?qw{?daily??}??],?
  67. ?????????????title?=>?"Network?Interface?eth0",?
  68. ?????????????vertical_label?=>?"Bytes/sec",?
  69. line_thickness?=>?2,?
  70. ?????????extended_legend?=>?2,?
  71. ????????end?=>?$starttime,?
  72. ???????start?=>$endtime,?
  73. ???????"COMMENT:??????????????????????????????????????????????"?=>?"",?
  74. ???????#此处的COMMENT是有空格的,尼玛真是一个一个空格来对齐下面的格式,靠O__O"… ?
  75. ???????"GPRINT:bytesOut:AVERAGE:?bytesOut平均值%8.2lf%s"=>?"",?
  76. ???????"COMMENT:????????????"?=>?"",?
  77. ???????"GPRINT:bytesIn:AVERAGE:?bytesIn平均值%8.2lf%s"=>?"",?????? ?
  78. ?????????); ?
  79. ?
  80. my?$lastUpdated?=?$rrd->last; ?
  81. ?print?"myfile.rrd?was?last?updated?at?"?. ?
  82. ???????scalar(localtime($lastUpdated))?.?"n"; ?
  83. ?

在crontab中加入每五分钟运行一次。

四、验证图像

?

五、总结
如果想定制自己的个性化颜色以及多个数据点,可以先学习下rrdtool的使用方法,只要理解了rrdtool的工作原理,
以及数据源的处理,可以更好的理解cacti,nagios是如何绘制图像的。
有什么问题,以及建议欢迎留言

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读