切記!!! 這個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() # 繪圖(下面會詳細說明)# 8, rrdtool.resize()指定-->爲rrd文件中的rra數據增長或者減小行數,並生成新文件resize.rrd 不改變源文件。
# 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
#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文件 插入數據。這些方法目前用不到,先就不用了。
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") # 繪製出流量最小值