运维自动化之报表模块rrdtool(下)实践

2022-04-26 00:00:00 数据 网卡 流量 绘制 平均值


根据上一篇《运维自动化之报表模块rrdtool(上)》中,我们所了解的rrdtool的参数,现在我们来实践一个绘制网卡流量图表的例子。

直接上代码:

  • 创建rrdtool数据库方法示例:

    create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:heartbeat:min:max] [RRA:CF:xff:steps:rows]

完整的一个创建代码:

  • crt.py

# -*- coding: utf-8 -*-
#!/usr/bin/python
import rrdtool  #载入模块
import time  #载入时间模块

cur_time=str(int(time.time())) #获取当前Ubuntu时间戳作为rrd起始时间

rrd=rrdtool.create('SvrFlow.rrd','--step','30','--start',cur_time,\
#数据写频率--step为300秒(即5分钟一个数据点)
 'DS:eth0_in:COUNTER:600:0:U',\
 'DS:eth0_out:COUNTER:600:0:U',\
 #定义数据源eth0_in(入流量)、eth0_out(出流量);类型均为COUNTER(递增);心跳值600秒,
 #其含义是600秒没有收到值,则会用UNKNOWN代替;0为小值;大值用U代替,表示不确定。
 #
 'RRA:AVERAGE:0.5:1:576', \
 'RRA:AVERAGE:0.5:6:672',\
 'RRA:AVERAGE:0.5:24:720',\
 'RRA:AVERAGE:0.5:288:365',\
 'RRA:MAX:0.5:1:576', \
 'RRA:MAX:0.5:6:672',\
 'RRA:MAX:0.5:24:720',\
 'RRA:MAX:0.5:288:365',\
 'RRA:MIN:0.5:1:576',\
 'RRA:MIN:0.5:6:672',\
 'RRA:MIN:0.5:24:720',\
 'RRA:MIN:0.5:288:365')
 #RRA定义格式为[RRA:CF:xff:steps:rows],CF定义了AVERAGE、MAX、MIN三种数据合并方式
 #xff定义为0.5,表示一个CDP(Consolidation Data Point)中的PDP值如超过一半值为UNKNOWN,则该CDP的值就被标为UNKNOWN。
 #
 #上面前4个RRA的定义说明如下,其他定义与AVERAGE方式相似,区别是存大值与小值
 #每隔5分钟(1*300秒)存一次数据的平均值,存576笔,即2天
 #每隔30分钟(6*300秒)存一次数据的平均值,存672笔,即14天(2周)
 #每隔2小时(24*300秒)存一次数据的平均值,存720笔,即60天(2个月)
 #每隔24小时(288*300秒)存一次数据的平均值,存365笔,即365天(1年)
 #
if rrd:
   print (rrdtool.error())

我们来运行一下(Python版本为3.6.2):

python /PyEnv/rrdtool/crt.py

下面我们采用updatev方法更新上面创建的rrd数据库:

  • updt.py

# -*- coding: utf-8 -*-
#!/usr/bin/python
import rrdtool
import time,psutil #我们使用psutil获取网卡流量。

Recev_total = psutil.net_io_counters()[1]    #获取Ubuntu网卡入流量
Send_total = psutil.net_io_counters()[]    #获取Ubuntu网卡出流量
startT=int(time.time())    #获取Ubuntu时间戳

update=rrdtool.updatev('/PyEnv/rrdtool/SvrFlow.rrd','%s:%s:%s' % (str(startT),str(Recev_total),str(Send_total)))
print (update)
#将获取到的三个数据作为updatev的参数,返回{'return_value': 0L}则说明更新成功,反之失败

另外,我们在执行的时候,可能会出现一些问题例如找不到模块等等,我这里举例如下:

$ pyenv global 3.6.2
$ python -V
Python 3.6.2
$ python /PyEnv/rrdtool/updt.py 
Traceback (most recent call last):
  File "/PyEnv/rrdtool/updt.py", line 4, in <module>
    import time,psutil #\u6211\u4eec\u4f7f\u7528psutil\u83b7\u53d6\u7f51\u5361\u6d41\u91cf\u3002
ModuleNotFoundError: No module named 'psutil'
$ pip install psutil (重新安装psutil模块)
Collecting psutil
  Downloading psutil-5.3.1.tar.gz (397kB)
     |################################| 399kB 856kB/s 
Installing collected packages: psutil
  Running setup.py install for psutil ... done
Successfully installed psutil-5.3.1
$ python /PyEnv/rrdtool/updt.py 
{'return_value': 0L} (出现这个结果说明我们运行成功了。)

完成以后,将该代码进行计划任务放到crontab中,这里配置5分钟作为采集频率,crontab配置如下:

$crontab -e
*/5 * * * * /usr/bin/python /PyEnv/rrdtool/updt.py > /dev/null 2>&1
$crontab -l (查看已经定制的计划任务)
$ sudo service cron restart (重启计划任务)
 pgrep cron (查看计划任务是否在运行)

这些完成以后,我们使用graph方法绘制图表。代码如下:

  • grph.py

# -*- coding: utf-8 -*-
#!/usr/bin/python
import rrdtool
import time
#定义图表上方主标题
title="Ubuntu network traffic  ("+time.strftime('%Y-%m-%d',time.localtime(time.time()))+")"
#
rrdtool.graph( "SvrFlow.png", "--start", "-1d","--vertical-label=Bytes/s",\
"--x-grid","MINUTE:12:HOUR:1:HOUR:1:0:%H",\
#“MINUTE:12”表示控制每隔12分钟放置一根次要格线
##“HOUR:”表示控制1个小时输出一个label标签
#“0:%H”0表示数字对齐格线,%H表示标签以小时显示
"--width","660","--height","240","--title",title,
"DEF:inoctets=SvrFlow.rrd:eth0_in:AVERAGE",    #指定网卡入流量数据源DS及CF
"DEF:outoctets=SvrFlow.rrd:eth0_out:AVERAGE",    #指定网卡出流量数据源DS及CF
"CDEF:total=inoctets,outoctets,+",    #通过CDEF合并网卡出入流量,得出总流量total
"LINE1:total#FF8633:Total traffic",    #以线条方式绘制总流量
"AREA:inoctets#0FFF00:In traffic",    #以面积方式绘制入流量
"LINE1:outoctets#000FFF:Out traffic",    #以线条方式绘制出流量
"HRULE:6144#FF6600:Alarm value\\r",    #绘制水平线,作为告警线,阈值为6.1k
"CDEF:inbits=inoctets,8,*",    #将入流量换算成bit,即*8,计算结果给inbits
"CDEF:outbits=outoctets,8,*",    #将出流量换算成bit,即*8,计算结果给outbits
"COMMENT:\\r",    #在网格下方输出一个换行符
"COMMENT:\\r",
"GPRINT:inbits:AVERAGE:Avg In traffic\: %6.2lf %Sbps",    #绘制入流量平均值
"COMMENT:   ",
"GPRINT:inbits:MAX:Max In traffic\: %6.2lf %Sbps",    #绘制入流量大值
"COMMENT:  ",
"GPRINT:inbits:MIN:MIN In traffic\: %6.2lf %Sbps\\r",    #绘制入流量小值
"COMMENT: ",
"GPRINT:outbits:AVERAGE:Avg Out traffic\: %6.2lf %Sbps",    #绘制出流量平均值
"COMMENT: ",
"GPRINT:outbits:MAX:Max Out traffic\: %6.2lf %Sbps",    #绘制出流量大值
"COMMENT: ",
"GPRINT:outbits:MIN:MIN Out traffic\: %6.2lf %Sbps\\r")    #绘制出流量小值

执行一下这个命令:

$ python /PyEnv/rrdtool/grph.py

因为我们是做测试,因此上面创建数据库的参数时间相对缩短一下,间隔时间也调整一下。

  • crt.py调整如下:

    • step 调整为60

    • DS:eth0_in:COUNTER:120:0:U’,

    • DS:eth0_out:COUNTER:120:0:U’,

  • 计划任务改为1分钟执行一次。

为了显示网络信息明显,我们可以打开另外一个客户端,ping一下我们的其他站点,增加网络流量。

另外,在此过程中,我们再来使用rrdtool的几个工具随时查看生成数据的结构、更新等状况。如下:

$ rrdtool ifo SvrFlow.rrd (查看生成的rrd文件结构信息)
$ rrdtool first SvrFlow.rrd (查看rrd文件个数据更新的时间)
$ rrdtool last SvrFlow.rrd (查看rrd文件近一次数据更新的时间)
$ rrdtool fetch SvrFlow.rrd MIN (根据指定时间、CF查询rrd文件)

举例来看:

$ rrdtool fetch SvrFlow.rrd MIN
                        eth0_in            eth0_out
(部分数据略)
1505359800: -nan -nan
1505360160: 3.5168613889e+03 5.7366277778e+02
1505360520: 3.2378097222e+03 3.4044638889e+02
1505360880: 3.1765477778e+03 1.6325222222e+02
1505361240: 3.2123516667e+03 1.5985027778e+02
1505361600: 3.4970841667e+03 3.3394583333e+02
1505361960: 3.9546438559e+03 8.4214596045e+02
1505362320: 4.2476900000e+03 1.0813019444e+03
1505362680: 1.7767832778e+04 1.7342154167e+04
(部分数据略)
1505365920: 6.3255527778e+02 1.8173472222e+02
1505366280: 6.7605500000e+02 3.7693722222e+02

终我们得到的截图SvrFlow.png如下所示:

到此,我们完成了一个网卡流量图表绘制的小程序。大家可以根据自己的需求进行调整。


来自:https://mp.weixin.qq.com/s/6YqZkBKokX1iMMj4zlkqJw

相关文章