rrdtool(round robin database)工具为环状数据库的存储格式,round robin是一种处理定量数据以及当前元素指针的技术。rrdtool主要用来跟踪对象的变化情况,生成这些变化的走势图,比如业务的访问流量、系统性能、磁盘利用率等趋势图,很多流行监控平台都使用到rrdtool,比较有名的为Cacti、Ganglia、Monitorix等。更多rrdtool介绍见官网http://oss.oetiker.ch/rrdtool/。rrdtool是一个复杂的工具,涉及较多参数概念,本节主要通过Python的rrdtool模块对rrdtool的几个常用方法进行封装,包括create、fetch、graph、info、update等方法,本节对rrdtool的基本知识不展开说明,重点放在Python rrdtool模块的常用方法使用介绍上。

rrdtool模块的安装方法如下:

    1. easy_install python-rrdtool    #pip安装方法
    2. pip install python-rrdtool    #easy_install安装方法
    3. #需要rrdtool工具及其他类包支持,CentOS环境推荐使用yum安装方法
    4. # yum install rrdtool-python

3.2.1 rrdtool模块常用方法说明

下面介绍rrdtool模块常用的几个方法,包括create(创建rrd)、update(更新rrd)、graph(绘图)、fetch(查询rrd)等。

1. Create方法

create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:heartbeat:min:max] [RRA:CF:xff:steps:rows]方法,创建一个后缀为rrd的rrdtool数据库,参数说明如下:

filename创建的rrdtool数据库文件名,默认后缀为.rrd;

--start指定rrdtool第一条记录的起始时间,必须是timestamp的格式;

--step指定rrdtool每隔多长时间就收到一个值,默认为5分钟;

DS用于定义数据源,用于存放脚本的结果的变量;

DST用于定义数据源类型,rrdtool支持COUNTER(递增类型)、DERIVE(可递增可递减类型)、ABSOLUTE(假定前一个时间间隔的值为0,再计算平均值)、GUAGE(收到值后直接存入RRA)、COMPUTE(定义一个表达式,引用DS并自动计算出某个值)5种,比如网卡流量属于计数器型,应该选择COUNTER;

RRA用于指定数据如何存放,我们可以把一个RRA看成一个表,保存不同间隔的统计结果数据,为CF做数据合并提供依据,定义格式为:[RRA:CF:xff:steps:rows];

CF统计合并数据,支持AVERAGE(平均值)、MAX(最大值)、MIN(最小值)、LAST(最新值)4种方式。

2. update方法

update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...] [timestamp:value[:value...] ...] 方法,存储一个新值到rrdtool数据库,updatev和update类似,区别是每次插入后会返回一个状态码,以便了解是否成功(updatev用0表示成功,–1表示失败)。参数说明如下:

filename指定存储数据到的目标rrd文件名;

-t ds-name[:ds-name]指定需要更新的DS名称;

N|Timestamp表示数据采集的时间戳,N表示当前时间戳;

value[:value...]更新的数据值,多个DS则多个值。

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使用面积图来绘制数据图表。

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 的格式,默认可省略。

获取当前时间的时间戳:date +%s

3.2.2 实践:实现网卡流量图表绘制

在日常运营工作当中,观察数据的变化趋势有利于了解我们的服务质量,比如在系统监控方面,网络流量趋势图直接展现了当前网络的吞吐。 CPU、内存、磁盘空间利用率趋势则反映了服务器运行健康状态。通过这些数据图表管理员可以提前做好应急预案,对可能存在的风险点做好防范。本次实践通过rrdtool模块实现服务器网卡流量趋势图的绘制,即先通过create方法创建一个rrd数据库,再通过update方法实现数据的写入,最后可以通过graph方法实现图表的绘制,以及提供last、first、info、fetch方法的查询。图3-12为rrd创建到输出图表的过程。

第一步 采用create方法创建rrd数据库,参数指定了一个rrd文件、更新频率setp、起始时间--start、数据源DS、数据源类型DST、数据周期定义RRA等,详细源码如下:

【/root/xls/create.py】

 # -*- coding: utf-8 -*-
#!/usr/bin/python
import rrdtool
import time cur_time=str(int(time.time())) #获取当前Linux时间戳作为rrd起始时间
#数据写频率--step为300秒(即5分钟一个数据点)
rrd=rrdtool.create('Flow.rrd','--step','','--start',cur_time,
#定义数据源eth1_in(入流量)、eth1_out(出流量);类型都为COUNTER(递增);600秒为心跳值,
#其含义是600秒没有收到值,则会用UNKNOWN代替;0为最小值;最大值用U代替,表示不确定
'DS:eth1_in:COUNTER:600:0:U',
'DS:eth1_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方式相似,区别是存最大值与最小值
# 每隔5分钟(1*300秒)存一次数据的平均值,存600笔,即2.08天
# 每隔30分钟(6*300秒)存一次数据的平均值,存700笔,即14.58天(2周)
# 每隔2小时(24*300秒)存一次数据的平均值,存775笔,即64.58天(2个月)
# 每隔24小时(288*300秒)存一次数据的平均值,存797笔,即797天(2年)
'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',
'RRA:MAX:0.5:6:700',
'RRA:MAX:0.5:24:775',
'RRA:MAX:0.5:444:797',
'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()

第二步 采用updatev方法更新rrd数据库,参数指定了当前的Linux时间戳,以及指定eth1_in、eth1_out值(当前网卡的出入流量),网卡流量我们通过psutil模块来获取,如psutil.network_io_counters()[1]为入流量,关于psutil模块的介绍见第1.1。详细源码如下:

【/root/xls/update.py】

 # -*- coding: utf-8 -*-
#!/usr/bin/python
import rrdtool
import time,psutil total_input_traffic = psutil.network_io_counters()[1] #获取网卡入流量
total_output_traffic = psutil.network_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

将代码加入crontab,并配置5分钟作为采集频率,crontab配置如下:

*/5 * * * * /usr/bin/python /root/xls/update.py > /dev/null 2>&1

第三步 采用graph方法绘制图表,此示例中关键参数使用了--x-grid定义X轴网格刻度;DEF指定数据源;使用CDEF合并数据;HRULE绘制水平线(告警线);GPRINT输出最大值、最小值、平均值等。详细源码如下:

【/root/xls/graph.py】

 # -*- coding: utf-8 -*-
#!/usr/bin/python
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( "Flow.png", "--start", "-1d","--vertical-label=Bytes/s",
"--x-grid","MINUTE:12:HOUR:1:HOUR:1:0:%H",
"--width","","--height","","--title",title,
"DEF:inoctets=Flow.rrd:eth1_in:AVERAGE", #指定网卡入流量数据源DS及CF
"DEF:outoctets=Flow.rrd:eth1_out:AVERAGE", #指定网卡出流量数据源DS及CF
"CDEF:total=inoctets,outoctets,+", #通过CDEF合并网卡出入流量,得出总流量total 19 "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
25 "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文件,如图3-13所示。

查看rrd文件内容有利于观察数据的结构、更新等情况,rrdtool提供几个常用命令:

info查看rrd文件的结构信息,如rrdtool info Flow.rrd;

first查看rrd文件第一个数据的更新时间,如rrdtool first Flow.rrd;

last查看rrd文件最近一次更新的时间,如rrdtool last Flow.rrd;

fetch根据指定时间、CF查询rrd文件,如rrdtool fetch Flow.rrd AVERAGE (必须为大写)

3.2.1rrdtool参数说明参考http://bbs.chinaunix.net/thread-2150417-1-1.htmlhttp://oss.oetiker.ch/rrdtool/doc/index.en.html

参考资料:http://my.oschina.net/u/1458120/blog/208857 里面有关于时间戳的相关信息。

Python与rrdtool的结合模块的更多相关文章

  1. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  2. Python 学习笔记(6)--常用模块(2)

    一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.p ...

  3. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  4. Python 之路 Day5 - 常用模块学习

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  5. Python导入自定义包或模块

    一般我们会将自己写的 Python 模块与 Python 自带的模块分开存放以达到便于维护的目的. Python 运行环境在查找模块时是对 sys.path 列表进行遍历,如果我们想在运行环境中添加自 ...

  6. python几个重要的模块备忘

    一:模块使用方法 二:时间模块time 三:系统接口模块os和sys 四:数据保存的几个模块json,pickle,xml,configparse 五:数据复制移动模块shutil 六:日志模块log ...

  7. 【python】IP地址处理模块IPy

    来源:https://pypi.python.org/pypi/IPy IPy模块 该模块可以方便的处理IPv4和IPv6地址. 以下是从来源中拷贝的一些例子: >>> from I ...

  8. Python标准库之Sys模块使用详解

    sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sy ...

  9. Python学习(14)模块一

    目录 Python 模块 import语句 from ... import 语句 from ... import * 语句 定位模块 PYTHONPATH变量 命名空间和变量 dir()函数. glo ...

随机推荐

  1. 乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

    乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻 ...

  2. 绕过安全狗狗的WebShell for PHP

    最近发现一款过狗shell,分享下...     本地搭建2008SERVER+php5+阿帕奇+网站安全狗+服务器安全狗+防护全开 测试可用... 默认密码:p0tt1 使用方法: ,没关系,按p键 ...

  3. python第三十九课——面向对象(二)之初始化属性

    设计Car类,初始化属性speed,提供一个run函数 import time class Car: def __init__(self,speed): self.speed=speed #将Road ...

  4. Breaking Down Type Erasure in Swift

    Type Erasure Pattern We can use the type erasure pattern to combine both generic type parameters and ...

  5. Netty入门(五)ChanneHandler

    本节主要讨论了 Netty 的数据处理组件 ChannelHandler. 一.Channel 生命周期 Channel 有个简单但强大的状态模型,下面是 Channel 的四个状态: Channel ...

  6. Linux平台安装Oracle11gR2数据库

    1. 数据库安装先决条件 1.1 认证的操作系统检查确认 o RHEL4,OEL4 - update 7 or greater o RHEL5,OEL5 - 5.2 or greater o RHEL ...

  7. 【转】Fiddler工作原理

    原文章链接:Web代码网chinabit.org Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断 ...

  8. AddHandler php5-script .php\AddType text/html .php和AddType application/x-httpd-php .php的区别?

    让apache支持php文件的解释,有2种方法配置,RPM装的默认配置是:AddHandler php5-script .phpAddType text/html .php网上很多人的配置方法是:Ad ...

  9. pyspider爬取数据存入redis--1.安装驱动

    首先安装pyredis的驱动 wget https://pypi.python.org/packages/source/r/redis/redis-2.9.1.tar.gz 解压并cd python  ...

  10. PRML5-神经网络(2)

    本节来自<pattern recognition and machine learning>第5章. 接(PRML5-神经网络(1)) 5.5NN中的正则化 NN的输入层和输出层的单元个数 ...