python模块rrdtool
1.安装rrdtool
pip install python-rrdtool
2.常用模块方法
create创建 update更新 graph绘图 fetch查询
2.1 create方法
create filename [–start|-b start time] [–step|-s step] [DS:ds-name:DST:heartbeat:min:max][RRA:Cf:xff:step:rows]
filename 文件名 后缀rrd
–start 起始时间 timestamp格式
–step 多长时间收到一个值 默认5min
DS 定义数据源
DST 定义数据源类型, COUNTER 递增类型 DERIVE可递增可递减 ABSOLUTE前一个时间间隔为0 计算平均值 GUAGE收到值直接存入RRA COMPUTE定义表达式 引用DS自动计算某个值
RRA 指定数据如何存放,
CF 统计合并数据 支持AVERAGE平均值 MAX最大值 MIN最小值 LAST最新值
2.2 update方法
update filename [–template|-t ds-name[:ds-name]….] N|timestamp:value[:value….][timestamp:value[:value….]….] 存储一个新值到rrdtool数据库
filename 指定文件名
-t ds-name[:ds-name] 指定要更新的DS
N[Timestamp] 数据采集的时间戳,N表示当前
value[:value…] 更新的数据值,多个DS则多个值
2.3 graph方法
graph filename [-s|–start seconds] [-e|–end seconds] [-x|–x-grid x-axis grid and label] [-y|–y-grid y-axis grid and label] [–alt-y-grid] [–alt-y-mrtg] [–alt-autoscale] [–alt-autoscale-max] [–units-exponent] value [-v|–vertical-label text] [-w|–width pixels] [-h|–height pixels] [-i|–interlaced] [-f|–imginfo formatstring] [-a|–imgformat GIF|PNG|GD] [-B|–background value] [-O|–overlay value] [-U|–unit value] [-z|–lazy] [-o|–logarithmic] [-u|–upper-limit value] [-l|–lower-limit value] [-g|–no-legend] [-r|–rigid] [–step value] [-b|–base value] [-c|–color COLORTAG#rrggbb] [-t|–title title] [DEF:vname=rrd:ds-name:CF] [CDEF:vname=rpn-expression] [PRINT:vname:CF:format] [GPRINT:vname:CF:format] [COMMENT:text] [HRULE:value#rrggbb[:legend]] [VRULE:time#rrggbb[:legend]] [LINE{1|2|3}:vname[#rrggbb [:legend]]] [AREA:vname[#rrggbb[:legend]]] [STACK:vname[#rrggbb[:legend]]]方法,根据指定的rrdtool数据库进行绘图,关键参数说明如下:
filename指定输出图像的文件名,默认是PNG格式;
–start指定起始时间;
–end指定结束时间;
–x-grid控制X轴网格线刻度、标签的位置;
–y-grid控制Y轴网格线刻度、标签的位置;
–vertical-label指定Y轴的说明文字;
–width pixels指定图表宽度(像素);
–height pixels指定图表高度(像素);
–imgformat指定图像格式(GIF|PNG|GD);
–background指定图像背景颜色,支持#rrggbb表示法;
–upper-limit指定Y轴数据值上限;
–lower-limit指定Y轴数据值下限;
–no-legend取消图表下方的图例;
–rigid严格按照upper-limit与lower-limit来绘制;
–title图表顶部的标题;
DEF:vname=rrd:ds-name:CF指定绘图用到的数据源;
CDEF:vname=rpn-expression合并多个值;
GPRINT:vname:CF:format图表的下方输出最大值、最小值、平均值等;
COMMENT:text指定图表中输出的一些字符串;
HRULE:value#rrggbb用于在图表上面绘制水平线;
VRULE:time#rrggbb用于在图表上面绘制垂直线;
LINE{1|2|3}:vname使用线条来绘制数据图表,{1|2|3}表示线条的粗细;
AREA:vname使用面积图来绘制数据图表。
2.4. fetch方法
fetch filename CF [–resolution|-r resolution] [–start|-s start] [–end|-e end]方法,根据指定的rrdtool数据库进行查询,关键参数说明如下:
filename指定要查询的rrd文件名;
CF包括AVERAGE、MAX、MIN、LAST,要求必须是建库时RRA中定义的类型,否则会报错;
–start –end指定查询记录的开始与结束时间,选项的值必是 timestamp 的格式,默认可省略。
示例:
实现网卡流量图表绘制
流程:
A、用create方法创建rrd数据库
B、用update方法更新rrd库内的数据(定时任务去采集并写入数据)
C、查询数据,绘制图表graph
代码实现:
create.py
参数指定了一个rrd文件、更新频率setp、起始时间–start、数据源DS、数据源类型DST、数据周期定义RRA等
import rrdtool
import time
cur_time = str(int(time.time())) # 获取当前Linux时间戳作为rrd起始时间
# 数据写频率--step为300秒(即5分钟一个数据点)
rrd = rrdtool.create('/root/xls/Flow.rrd', '--step', '300', '--start', cur_time,
#定义数据源ens32_in(入流量)、ens32_out(出流量);类型都为COUNTER(递增);600秒为心跳值,其含义是600秒没有收到值,则会用UNKNOWN代替;0为最小值;最大值用U代替,表示不确定
'DS:ens32_in:COUNTER:600:0:U', 'DS:ens32_out:COUNTER:600:0:U',
#RRA定义格式为[RRA:CF:xff:steps:rows],CF定义了AVERAGE、MAX、MIN三种数据合并方式
#xff定义为0.5,表示一个CDP中的PDP值如超过一半值为UNKNOWN,则该CDP的值就被标为UNKNOWN
#下列前4个RRA的定义说明如下,其他定义与AVERAGE方式相似,区别是存最大值与最小值
'RRA:AVERAGE:0.5:1:600',
'RRA:AVERAGE:0.5:6:700',
'RRA:AVERAGE:0.5:24:775',
'RRA:AVERAGE:0.5:288:797',
'RRA:MAX:0.5:1:600', # 每隔5分钟(1*300秒)存一次数据的最大值,存600笔,即2.08天
'RRA:MAX:0.5:6:700', # 每隔30分钟(6*300秒)存一次数据的最大值,存700笔,即14.58天(2周)
'RRA:MAX:0.5:24:775', # 每隔2小时(24*300秒)存一次数据的最大值,存775笔,即64.58天(2个月)
'RRA:MAX:0.5:444:797', # 每隔24小时(288*300秒)存一次数据的最大值,存797笔,即797天(2年)
'RRA:MIN:0.5:1:600',
'RRA:MIN:0.5:6:700',
'RRA:MIN:0.5:24:775',
'RRA:MIN:0.5:444:797')
if rrd:
print (rrdtool.error())
update.py
采用updatev方法更新rrd数据库,参数指定了当前的Linux时间戳,以及指定eth1_in、eth1_out值(当前网卡的出入流量),网卡流量我们通过psutil模块来获取,如psutil.network_io_counters()[1]为入流量
#!/usr/bin/env python
#-*-coding:utf-8 -*-
import rrdtool
import time
import psutil
total_input_traffic = psutil.net_io_counters()[1] # 获取网卡入流量,
total_output_traffic = psutil.net_io_counters()[0] # 获取网卡出流量
starttime = int(time.time()) # 获取当前Linux时间戳
# 将获取到的三个数据作为updatev的参数,返回{'return_value': 0L}则说明更新成功,反之失败
update = rrdtool.updatev('/root/xls/Flow.rrd',
'%s:%s:%s' % (str(starttime), str(total_input_traffic), str(total_output_traffic)))
print (update)
将脚本放到计划任务中
*/5 * * * * /usr/local/bin/python3 /root/update.py > /dev/null 2>&1
创建图表
采用graph方法绘制图表,此示例中关键参数使用了–x-grid定义X轴网格刻度;DEF指定数据源;使用CDEF合并数据;HRULE绘制水平线(告警线);GPRINT输出最大值、最小值、平均值等
#!/usr/bin/env python
#-*-coding:utf-8 -*-
import rrdtool
import time
# 定义图表上方大标题
title = "Server network traffic flow (" + time.strftime('%Y-%m-%d', time.localtime(time.time())) + ")"
# 重点解释"--x-grid","MINUTE:12:HOUR:1:HOUR:1:0:%H"参数的作用(从左往右进行分解)
"MINUTE:12" # 表示控制每隔12分钟放置一根次要格线
"HOUR:1" # 表示控制每隔1小时放置一根主要格线
"HOUR:1" # 表示控制1个小时输出一个label标签
"0:%H" # 0表示数字对齐格线,%H表示标签以小时显示
rrdtool.graph("/root/Flow.png", "--start", "-1d", "--vertical-label=Bytes/s",
"--x-grid", "MINUTE:12:HOUR:1:HOUR:1:0:%H",
"--width", "650", "--height", "230", "--title", title,
"DEF:inoctets=/root/xls/Flow.rrd:ens32_in:AVERAGE", # 指定网卡入流量数据源DS及CF
"DEF:outoctets=/root/xls/Flow.rrd:ens32_out:AVERAGE", # 指定网卡出流量数据源DS及CF
"CDEF:total=inoctets,outoctets,+", # 通过CDEF合并网卡出入流量,得出总流量total
"LINE1:total#FF8833:Total traffic", # 以线条方式绘制总流量
"AREA:inoctets#00FF00:In traffic", # 以面积方式绘制入流量
"LINE1:outoctets#0000FF:Out traffic", # 以线条方式绘制出流量
"HRULE:6144#FF0000: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") # 绘制出流量最小值
以上代码将生成一个flow.png文件