對python-rrdtool模塊的淺研究。

一,python-rrdtool模塊安裝。

切記!!! 這個rrdtool模塊,在windows環境下安裝太費勁,就是由於沒安裝上因此如今改爲了在ubuntu環境下開發,原來沒有體會過,如今可真是體會過了。。。。。。html

安裝命令:pip install python-rrdtoolpython

二,python 封裝的rrdtool方法解析ubuntu

     # 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,單參數單主機繪圖詳解:windows

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)fetch

b,須要更改的地方也很少,只需根據rrd文件數量設定DEF數量,根據不一樣的vname,設定不一樣的柱狀圖或者折線圖就好了。spa

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,針對與網卡流量(多參數單主機涉及簡單計算的)的繪圖詳解:code

        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.htmlorm

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

相關文章
相關標籤/搜索