zoukankan      html  css  js  c++  java
  • 对python-rrdtool模块的浅研究。

    一,python-rrdtool模块安装。

    切记!!! 这个rrdtool模块,在windows环境下安装太费劲,就是因为没安装上所以现在改成了在ubuntu环境下开发,原来没有体会过,现在可真是体会过了。。。。。。

    安装命令:pip install python-rrdtool

    二,python 封装的rrdtool方法解析

         # 1,rrdtool.first(filename) 返回第一个rra 第一次数据更新(采集)的时间戳
            fist_time = rrdtool.first('static/rrdfiles/downloads.rrd')
            print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(fist_time))
            # 2017-02-21 14:13:00
    
            # 2,rrdtool.last(filename)  返回第一个rra 最近一次数据更新(采集)的时间戳
            last_time = rrdtool.last('static/rrdfiles/downloads.rrd')
            print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(last_time))
            # 2017-02-22 02:12:00
    
            # 3, rrdtool.damps() 将rrd文件转换成xml文件
            # damps = rrdtool.dump('static/rrdfiles/downloads.rrd')
            # print(damps)
    
            # 4, rrdtool.info(filename)  将rrd文件的结构信息以字典的形式表现起来.
            info = rrdtool.info('static/rrdfiles/downloads.rrd')
            # print(info)
            # print(info["ds[metric].type"])  # GAUGE
            # print(info["ds[metric].value"]) # 0.0
    
            # 5, rrdtool.fecth  fetch(args..): fetch data from an rrd.
            mge1 = rrdtool.fetch("static/rrdfiles/downloads.rrd","AVERAGE")
            print(mge1[1][0])  # metric 一个ds名,如果要是监测多个ds,应该是一个元祖多个值.
    
            # 6, rrdtool.graph() # 绘图(下面会详细说明)
         
         # 7,rrdtool.create() #创建一个rrd文件(还没有具体用到,以后学习在补充)
         #create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:heartbeat:min:max] [RRA:CF:xff:steps:rows
            # 8, rrdtool.resize()指定-->为rrd文件中的rra数据增加或者减少行数,并生成新文件resize.rrd 不改变源文件。
              # size = rrdtool.resize("static/rrdfiles/downloads.rrd","1",'GROW',["10",])(文件,具体哪个rra(从0开始),增加|减少,["具体多少行",])
         #9,rrdtool.tune(args___) 可对原rrd文件进行更改,更改心跳值,最大值,最小值,数据源,ds变量名.
    #tune filename [--heartbeat|-h ds-name:heartbeat] [--minimum|-i ds-name:min] [--maximum|-a ds-name:max] [--data-source-type|-d ds-name:DST] [--data-source-rename|-r old-name:new-name]   # 举例 更改变量名:
    # tune = rrdtool.tune("static/rrdfiles/resize.rrd",'-r','metric:memory')
    mge1 = rrdtool.fetch("static/rrdfiles/resize.rrd","AVERAGE")
    print(mge1[1][0]) # memory

    ##########还有一些方法,rrdtool.xport()可以编写一个xml格式的数据保存在一个或者多个rrd文件中。 rrdtool.update() 更新,为新创建的rrd文件 插入数据。这些方法目前用不到,先就不用了。

     三,rrdtool绘图即rrdtool.graph()参数的解析:

    1,单参数单主机绘图详解:

    title = "test (" + time.strftime('%Y-%m-%d', time.localtime(time.time())) + ")"
            rrdpath = "static/rrdfiles/downloads.rrd"
            rrdtool.graph("static/RRDpng/unirrd.png",
    
                          # start,end x轴的起始结束时间:
                          #  如果都不写,默认是从当前算起一天内的。
                          #  如果没有指定end,默认是从start起到现在。
                          #  如果没有指定start,默认是1天前到end。
                          #对于选取数据时:rrd文件的rra有 一天,两天,一个星期,三个月,十二个月五种(我认为可变)。
                          #针对你的start end 时间的设定,graph自动从相对应的rra中提取数据。
    
                          "--start","20170214",  # 监测的起始时间.
                          "--end","20170223",  # 检测的结束时间.
    
    
                          "--vertical-label=Bytes/s",  #图片左侧竖着写的一段字
    
                          "--width", "650", "--height", "230",  # 图片的宽高设置.
                          # "--full-size-mode",  # 图片自适应.
                          # "--only-graph",  # 图片微缩图. 一会试一下!
    
                          "--title",title,  # 图片的题目.
    
                          "--upper-limit","2",
                          "--lower-limit","0",  # y 轴的最高最低限制,默认最低限制就是0.
    
                          # "--x-grid", "MINUTE:12:HOUR:1:HOUR:1:0:%H",  # x轴配置是很复杂的配置,如果没有极特殊,就按照默认的配置。
                          # "MINUTE:12"表示控制每隔12分钟放置一根次要格线 "HOUR:1"表示控制每隔1小时放置一根主要格线 "HOUR:1"  # 表示控制1个小时输出一个label标签"0:%H"  # 0表示数字对齐格线,%H表示标签以小时示
    
                          "DEF:ds0=%s:metric:AVERAGE"%rrdpath,  # DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>]
    
                          # "DEF:max=%s:metric:MAX"%rrdpath,
                          # "DEF:min=%s:metric:MIN"%rrdpath,  # DEF就是指定数据源,和CF字段.后面也可加step,start,end,用的比较少.
    
                          "AREA:ds0#00FF00",   # 以面积的方式将ds0变量绘制成图表.AREA:value[#color[#color2]][:[legend][:STACK][:skipscale][:gradheight=y]
                          # "LINE:dso#00FF00",  # 以折线的方式将ds0变量绘制成图表.LINE[width]:value[#color][:[legend][:STACK][:skipscale]
    
                          # 图表(下方罗列最大最小平均值)表现方式1:
                          # "VDEF:ds0max=ds0,MAXIMUM",  # VDEF:vname=RPN VDEF就是通过RPN函数,返回给vname一个计算后结果.
                          # "VDEF:ds0aver=ds0,AVERAGE",
                          # "VDEF:ds0min=ds0,MINIMUM",
                          #
                          # "COMMENT:Classified display",  # COMMENT就是设置图表下面的文本.
                          # "COMMENT:Maximum",
                          # "COMMENT:Average",
                          # "COMMENT:Minimum\r",  # 这四个是设置图标下面的显示标题.
                          # "AREA:ds0#00FF00:metric",
                          # "GPRINT:ds0max:%6.2lf %Sbps",  # GPRINT:vname:CF:format GPRINT就是可将变量进行格式化输出,可以有很多指定参数.
                          # "GPRINT:ds0aver:%6.2lf %Sbps",
                          # "GPRINT:ds0min:%6.2lf %Sbps",
    
                          #图表(下方罗列最大最小平均值)表现方式2:
                          "HRULE:65535#FF0000:Alarm value",
                          # "AREA:ds0#FF0000:Alarm value",
                          # HRULE:value#color[:[legend][:dashes[=on_s[,off_s[,on_s,off_s]...]][  :dash-offset=offset]]]
                          "COMMENT:\r",  # 在网格下方输出一个换行符
                          "COMMENT:\r",
                          "GPRINT:ds0:AVERAGE:Avg In metric: %6.2lf %Sbps",  # 绘制入流量平均值
                          "COMMENT:   ",
                          "GPRINT:ds0:MAX:Max In metric: %6.2lf %Sbps",  # 绘制入流量最大值
                          "COMMENT:  ",
                          "GPRINT:ds0:MIN:MIN In metric: %6.2lf %Sbps\r",  # 绘制入流量最
    
                                                        # 绘制水平线,作为告警线,阈值为10
                          )

    2,单参数多主机的绘图详解:

    这个跟上面那个差不度,将多个rrd文件中的检测对象绘制成一个图:

    a,这些参数的单位量级必须差不多。(举例:不能一个是3200k,一个0.32k)

    b,需要更改的地方也不多,只需根据rrd文件数量设定DEF数量,根据不同的vname,设定不同的柱状图或者折线图就行了。

    title = "UNIpic (" + time.strftime('%Y-%m-%d', time.localtime(time.time())) + ")"
            #1,设置多个 rrd 文件
            rrdpath1 = "static/rrdfiles/f2_GAUGE_60.rrd"
            rrdpath2 = "static/rrdfiles/f5_GAUGE_60.rrd"
            
            rrdtool.graph("static/RRDpng/unirrd.png",
                          "--start", "20170221",
                          "--end", "20170222",
                          "--vertical-label=Bytes/s",
                          "--width", "650", "--height", "230",  # 图片的宽高设置.
                          "--title", title,  # 图片的题目.
                          
                          #2,给不同的导入多个rrd文件源及ds名。
                          "DEF:ds0=%s:metric:AVERAGE" % rrdpath1,
                          "DEF:ds1=%s:metric:AVERAGE" % rrdpath2,
                          
                          #3,根据不同的ds名进行绘图。
                          "LINE:ds0#FF0000",
                          "LINE:ds1#00FF33",
    
                          # 图表(下方罗列最大最小平均值)表现方式2:
                          "COMMENT:\r",  # 在网格下方输出一个换行符
                          "COMMENT:\r",
                          "GPRINT:ds0:AVERAGE:Avg In metric: %6.2lf %Sbps",  # ds0绘制平均值
                          "COMMENT:   ",
                          "GPRINT:ds0:MAX:Max In metric: %6.2lf %Sbps",  # ds0绘制最大值
                          "COMMENT:  ",
                          "GPRINT:ds0:MIN:MIN In metric: %6.2lf %Sbps\r",  # ds0绘制入流量最小值
                          "COMMENT:\r",  # 在网格下方输出一个换行符
                          "COMMENT:\r",
                          "GPRINT:ds1:AVERAGE:Avg In metric: %6.2lf %Sbps",  # ds1绘制平均值
                          "COMMENT:   ",
                          "GPRINT:ds1:MAX:Max In metric: %6.2lf %Sbps",  # ds1绘制最大值
                          "COMMENT:  ",
                          "GPRINT:ds1:MIN:MIN In metric: %6.2lf %Sbps\r",  # ds1绘制最小值
                        
                          )

    3,针对与网卡流量(多参数单主机涉及简单计算的)的绘图详解:

            title = "test (" + 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表示 标签以小时显示
            PNG = rrdtool.graph("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=static/rrdfiles/downloads.rrd:eth0_in:AVERAGE",  # 指定网卡入流量数据源DS及CF
                          "DEF:outoctets=static/rrdfiles/downloads.rrd:eth0_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")  # 绘制出流量最小值

     

     参考文献:http://www.cnblogs.com/wjoyxt/p/5035185.html

            http://oss.oetiker.ch/rrdtool/doc/rrdgraph_examples.en.html

  • 相关阅读:
    一、基础篇--1.1Java基础-反射的用途和实现
    一、基础篇--1.1Java基础-抽象类和接口的区别
    一、基础篇--1.1Java基础-重载和重写的区别
    一、基础篇--1.1Java基础-String、StringBuilder、StringBuffer
    一、基础篇--1.1Java基础-包装类的装箱和拆箱
    一、基础篇--1.1Java基础-int 和 Integer 有什么区别,Integer的值缓存范围
    一、基础篇--1.1Java基础-Exception、Error、RuntimeException与一般异常有何异同
    一、基础篇--1.1Java基础-final, finally, finalize 的区别
    c++ 中 *++ptr,++*ptr等的区别
    c++ new与char*,动态数组,sizeof的注意点总结
  • 原文地址:https://www.cnblogs.com/jin-xin/p/6774828.html
Copyright © 2011-2022 走看看