根据上一篇《运维自动化之报表模块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