最近需要用python根据收集到的数据进行绘图,决定使用rrd数据库,然后配合rrdtool来绘图,故学习一下rrdtool的用法。

用法如下:

创建:create(...)

create(args..): Set up a new Round Robin Database

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

filename:是rrd的文件名,可以以rrd结尾。

--step:rrdtool期望每隔多长事件收到一个值,默认是5分钟。

--start:rrdtool第一个记录的起始时间,rrdtool不会接收任何数据的时间小于起始时间。例如你在update时给出的时间小于起始时间,则rrdtool会拒绝该值

DS:DS用于定义数据源,是用来存放结果的变量名。该变量名在画图时会用到。

DST:用来设置数据源的类型,有COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE等5种类型。

COUNTER:数值必须是递增的

DERIVE:和COUNTER类似,不过数据可递增可递减

ABSOLUTE:他每次假定前一个时间间隔的值是0,然后计算平均值

GAUGE:不做任何变化,直接存入rra中

COMPUTE:他不接收具体值,而是定义一个表达式,然后算出某个值

heartbeat:

min:

max:

RRA:rra指定数据如何存放,他可以保存不同时间间隔的数据。力图每5分钟产生一条数据,这样一小时就是12条,如果每30分钟一条数据,这样一小时就是两条数据,这样一天,一年下来会有很多条数据,但是rrd数据库的大小是固定的,所以就有一个合并数据的方式了。这就是rra的功能。合并方式由CF指定。

CF:CF就是用来设置数据合并的功能,有AVERAGE、MAX、MIN、LAST等4种类型,分别表示对PDP取平均、最大、最小、当前值。

xff:xff字段设置一个比例值,rrdtool会把多个PDP合并为一个CDP,如果这写PDP中有值为UNKNOW的PDP,那么CDP的值该怎么计算,xff就是设置一个比例,当PDP中UNKNOW的比例超过多少是,就无法合成正常的CPD,合成的CPD值也为UNKNOW。

steps:表示多少个PDP合成一个CDP

rows:表示总共存多少个CDP?也就是可以保存多少数据?

PDP:在每个规定的时间间隔内rrdtool都会收到一个值,rrdtool在收到该值后,根据DST的设置,会计算出另一个值,这个值就是PDP。

CDP:rrdtool使用多个PDP合并出一个CDP,也就是执行CF的后果,然后把这个CDP的值存入rra中。

查看第一次/最后一次数据更新时间:first(...)

first(filename): Return the timestamp of the first data sample in an RRD

last(...)

last(filename): Return the timestamp of the last data sample in an RRD

查看rrd结构信息:info(...)

info(filename): extract header information from an rrd

取出rrd的值:fetch(...)

fetch(args..): fetch data from an rrd.

fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end|-e end]

filename:要取出数据的rrd文件

--start:可选,默认是end-1day

--end:可选,默认是now

CF:AVERAGE、MAX、MIN、LAST。前提是你的rrd中有该类型的rra才可以。

更新rrd数据:update(...)

update(args..): Store a new set of values into the rrd

update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...] [timestamp:value[:value...] ...]

filename:要更新的rrd文件

--template:

-t ds-name[:ds-name]:设置更新那个DS的数据

N|timestamp:时间戳,表示数据在哪个时间点采集的,N表示now。

value[:value...]:一个rrd文件可以有多个DS,所以一次update可以更新多个value。

update插入值后,并不会有返回,无法知道插入是否正常,可以用updatev

带返回值的插入:updatev(...)

updatev is called in the same manner as update

和update类似,不过每次插入后会返回一个状态码。

画图:graph(...)

graph(args..): Create a graph based on data from one or several RRD

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]]]

filename:图片的名称,默认是PNG格式

--start:图片X轴数据的起始时间

--end:图片X轴数据的结束时间

--x-grid x-axis grid and label:

--y-grid y-axis grid and label:

--alt-y-grid

--alt-y-mrtg

--alt-autoscale

--alt-autoscale-max

--units-exponent

--vertical-label text  Y轴的文字说明

--width pixels  X轴的大小

--height pixels  Y轴的大小

--interlaced

--imginfo formatstring

--imgformat GIF|PNG|GD  图片格式

--background value

--overlay value

--unit value

--lazy

--logarithmic

--upper-limit value  Y轴数据值的上限,默认会自动调整Y轴的数字

--lower-limit value  Y轴数据值的下限

--no-legend  取消图表下方的图例

--rigid  严格按照upper-limit/lower-limit来绘制

--step value

--base value  默认1K=1000 可以调整1K=1024

--color COLORTAG#rrggbb

--title title  图表上方的标题

DEF:vname=rrd:ds-name:CF 定义绘图用的数据源,也就是从那个RRD中取数据,因为RRA有多种类型,所以需要指定CF

CDEF:vname=rpn-expression  定义合并值,

PRINT:vname:CF:format

GPRINT:vname:CF:format  在图表的下方输出最大值、最小值之类

COMMENT:text  用来输出一些字符串

HRULE:value#rrggbb  在图表上绘制水平线

VRULE:time#rrggbb  在图表上绘制垂直线

LINE{1|2|3}:vname  使用线条来绘制vname的数据图

AREA:vname  使用方块来绘制vname的数据图

STACK:vname

下面附上一个例子:

###创建rrd

#!/usr/bin/python

import rrdtool

rrdb=rrdtool.create('rest.rrd','--step','60','--start','1369982786',

'DS:input:GAUGE:120:U:U',

'DS:output:GAUGE:120:U:U',

'RRA:LAST:0.5:1:600',

'RRA:AVERAGE:0.5:5:600',

'RRA:MAX:0.5:5:600',

'RRA:MIN:0.5:5:600')

if rrdb:

print rrdtool.error()

###rrd插入数据

#!/usr/bin/python

import time

import psutil

import rrdtool

for keys in psutil.network_io_counters(pernic=True):

if keys == 'em1':

sent=psutil.network_io_counters(pernic=True)[keys][0]

recv=psutil.network_io_counters(pernic=True)[keys][1]

up=rrdtool.updatev('rest.rrd','N:%d:%d' % (sent,recv))

print up

###根据rrd绘图

#!/usr/bin/python

import rrdtool

rrdtool.graph('rest.png','--start','1369983960',

'--title','my rrd graph test',

'--vertical-label','bits',

'DEF:input=rest.rrd:input:LAST',

'DEF:output=rest.rrd:output:LAST',

'LINE1:input#0000FF:In traffic',

'LINE1:output#00FF00:Out traffic\\r',

'CDEF:bytes_in=input,8,*',

'CDEF:bytes_out=output,8,*',

'COMMENT:\\n',

'GPRINT:bytes_in:LAST:LAST in traffic\: %6.2lf %Sbps',

'COMMENT: ',

'GPRINT:bytes_out:LAST:LAST out traffic\: %6.2lf %Sbps')

java rrdtool_Python下rrdtool模块的基本使用方法相关推荐

  1. yum 卸载 java,CentOS下安装JDK的四种方法和卸载JDK,centosjdk

    CentOS下安装JDK的四种方法和卸载JDK,centosjdk 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# m ...

  2. java多线程下LongAdder、CountDownLatch、CyclicBarrier、Phaser 的用法

    前言 一文读懂java多线程下常用常考的阻塞方法LongAdder.CountDownLatch.CyclicBarrier.Phaser 包含演示代码 高并发模拟,性能比较实例代码 前言 LongA ...

  3. 自定义ClassLoader实现java应用核心逻辑模块热部署

    http://waterdh.iteye.com/blog/520399 本文主要是根据classloader的特性,结合实际产品环境中遇到的问题,来探讨下JAVA应用中局部模块热部署的可行性. 我们 ...

  4. Java selenium操作下拉滚动条的几种方法

    数据采集中,经常遇到动态加载的数据,我们经常使用selenium模拟浏览器操作,需要多次下拉刷新页面才能采集到所有的数据,就此总结了几种selenium操作下拉滚动条的几种方法 我这里演示的是Java ...

  5. java 模块化_Java模块化方法–模块,模块,模块

    java 模块化 我想每个人都会同意,编写模块化应用程序和模块化通常是一件好事. 但是,从Java和Scala语言以及各种Java / Scala框架来看,对模块化的支持看起来如何? 有很多不同的方法 ...

  6. java9 javafx_无法在java 9下针对java 8构建javafx应用程序

    我正在尝试构建一个应用程序,该应用程序具有使用JavaFX构建的GUI,并使用java 9的新版本标记来定位Java 8. 编译 import javafx.application.Applicati ...

  7. Java微服务开发指南 -- Java环境下的微服务

    Java环境下的微服务 本文涉及的内容,能让你学到什么? 本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布 ...

  8. java双下划线改单下划线_单下划线与双下划线的区别

    内容目录 单下划线与双下划线的区别 ​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式: 单下划线(_) 名称前的单下划线(如:_name) 名称前的双下划线(如:__n ...

  9. java osgi 文件_OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统

    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...

最新文章

  1. BYOD安全保护的“原生态”方法
  2. 读logback源码系列文章(五)——Appender --转载
  3. VS2012+7600配置驱动环境
  4. Unity3D ShaderLab 内发光防护罩
  5. TensorFlow 笔记5--模型复用
  6. Minio分布式集群示例:8个节点,每节点1块盘
  7. 搞懂function(*args,**kwargs)
  8. java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改
  9. Sentinel如何通过限流实现服务的高可用性
  10. HDU2032 杨辉三角【入门+趣味程序】
  11. xftp找不到匹配的outgoing encryption 算法 怎么解决
  12. uniapp 按钮固定在底部
  13. linux下svn安装与版本控制
  14. python进阶-argparse
  15. 排队论模型(六):非生灭过程排队模型、爱尔朗(Erlang)排队模型
  16. html查看ie版本,如何查看ie版本?三种IE版本查看方法介绍
  17. 第二语言教学的5c标准是哪5c,第二语言教学法知识小结(一)
  18. 景深决定照相机什么特性_浅析决定景深之四大因素
  19. imutils基础(7)使用 OpenCV 查找轮廓中的极值点
  20. SQLMAP-Tamper之较为通用的双写绕过

热门文章

  1. PlantSimulation数据处理
  2. 在macOS中同时安装jdk8、jdk9、jdk11、jdk12并自由切换
  3. 苹果手机用计算机怎么表白,隐藏在iphone短信中的自带功能,超适合表白,快学起来...
  4. UnityShader入门精要——Unity中的渲染优化技术(二)
  5. 标题隐藏_平静的标题下隐藏着不平静的天气,敢不敢点开?
  6. 怎么使用openbabel的pybel?
  7. mysql 列转行 unpivot_Unpivot 列转行
  8. 白话说CC--五分钟带你了解EAL4+与EAL5+的区别
  9. 中小型企业网络规划设计方案_案例讲解 | 某企业物流网络规划案例(上)
  10. 计算机四级网络工程师学几天,计算机四级网络工程师学习笔记