国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Zabbix與RRDtool繪圖篇之用RRDtool繪制圖形

2024-08-27 23:58:44
字體:
來源:轉載
供稿:網友

下面來給各位介紹一個Zabbix與RRDtool繪圖篇之用RRDtool繪制圖形例子,希望文章對各位會有所幫助.

RRDtool在python里面的繪圖函數是rrdtool.graph(),函數的各個參數代表什么意義就不講了,主要講思路,后面貼上繪圖函數的代碼就會明白了,在成千上萬的監控圖的海洋里怎樣用最短和最通用的方法將這些圖片繪出了是個問題,我目前由于水平的限制能夠想到的解決問題的方法是這樣的.

1、所有的圖形都有有限的item,將相同數目item的圖片用同一個函數來繪制.

2、一些特別的圖形如內存堆棧圖(stack),可以在該函數中寫個判斷語句單獨配置相應的繪圖參數.

3、關于item的顏色和繪制方式(LINE1,LINE2,AREA),需要特別照顧的圖形可以在DrawDef這張表中定義,其它的圖形的item就采用自動默認就好。

4、成千上萬的item繪圖時怎樣真確的找到rrd文件中對應的DS,取得正確的數據,這個一開始就設計好了,每臺主機的所有rrd文件放在一個文件夾里,文件夾以主機id命名,每個rrd文件以圖形id命名并帶上.rrd的后綴,每個rrd文件的DS用itemid命名,這樣做就能正確的找到數據源了.

解決了這些邏輯上的麻煩后,就可以堆繪圖代碼了,首先根據GET請求的hostid和type找到要進行繪圖的rrd文件,rrdtooldraw02,處理這個GET請求的views的函數是這樣的:

  1. def zabbixdraw(request): 
  2.     dir = r"/opt/rrd/" 
  3.     pngdir = r"/opt/www/diewu/static/images/rrdpng/" 
  4.     #value = request.GET 
  5.     hostid = request.GET['hostid'
  6.     type = request.GET['type'
  7.     sql = "select hostid, graphid, graphname, hostname from zabbixapp_drawtree where hostid="+hostid+" and type="+type+" and draw='1'" 
  8.     graphs = DrawTree.objects.getclass(sql) 
  9.     pngs = [] 
  10.     gdatas = [] 
  11.     strtime = str(int(time.time()- 86400)) 
  12.     for graph in graphs: 
  13.         hostid = graph[0] 
  14.         graphid = graph[1] 
  15.         graphname = graph[2] 
  16.         hostname = graph[3] 
  17.         rpath = dir + hostid + r"/" + graphid + r".rrd" 
  18.         ############################################ 
  19.         if not os.path.exists(pngdir + hostid + r"/"): 
  20.             os.makedirs(pngdir + hostid + r"/"
  21.         pngname = pngdir + hostid + r"/" + graphid + r".png" 
  22.         sql = "select itemid,itemname,units from zabbixapp_drawgraphs where graphid="+graphid 
  23.         pitem = DrawGraphs.objects.getdata(sql) 
  24.         #####取自定義顏色和繪制方法 
  25.         sql = "select cols from zabbixapp_drawdef where graphid="+graphid 
  26.         cols = DrawDef.objects.getdata(sql) 
  27.         if cols: 
  28.             cols = (cols[0][0].split(":"),) 
  29.         sql = "select types from zabbixapp_drawdef where graphid="+graphid 
  30.         itypes = DrawDef.objects.getdata(sql) 
  31.         if itypes: 
  32.             itypes = (itypes[0][0].split(":"),) 
  33.         gdata = {'pname':pngname, 'gname':graphname, 'rrdpath':rpath, 'pitem':pitem, 'graphid':graphid, 
  34.             'cols':cols, 'itypes':itypes, 'host':hostname, 'stime':strtime, 'flag':'Daily'
  35.         gdatas.append(gdata) 
  36.         pngs.append({'pngpath':str(pngname).replace(r"/opt/www/diewu"''), 'graphid':graphid}) --Vevb.com 
  37.     drawrrd.drawmain(gdatas) 
  38.     #value = gdatas 
  39.     #avg = {'privatetitle''Zabbix監控數據展示''STATIC_URL''/static''value':value, 'pngs':pngs} 
  40.     avg = {'privatetitle''Zabbix監控數據展示''STATIC_URL''/static''pngs':pngs} 
  41.     return render_to_response('zabbixapp/zabbixdraw.html'avg

其中自定義的繪圖函數drawrrd.drawmain()函數主要是用來遍歷需要繪制的圖形,根據圖形數據提供的item個數,再調用相應的繪圖函數繪制出對應的png圖形.

貼上真正的繪圖函數,繪制一個item圖形的和繪制2個item的圖形的函數.

  1. #!/usr/bin/env python 
  2. #coding=utf-8 
  3. import rrdtool 
  4. def dItem01(data): 
  5.     pngname = str(data['pname']) 
  6.     start = data['stime'] 
  7.     graphname = str(data['gname'] + " (" + data['graphid'] + ") " + data['host'] + "(" + data['flag'] + ")") 
  8.     DEF = str(r"DEF:a="+data['rrdpath']+r':'+data['pitem'][0][0]+r":AVERAGE") 
  9.     if data['cols'] or data['itypes']: 
  10.         if not data['cols']: 
  11.             dtype = str(data['itypes'][0][0]+r":a#EAAF00FF:"+data['pitem'][0][1]) 
  12.         elif not data['itypes']: 
  13.             dtype = str(r"AREA:a"+data['cols'][0][0]+r":"+data['pitem'][0][1]) 
  14.         else: 
  15.             dtype = str(data['itypes'][0][0]+r":a"+data['cols'][0][0]+r":"+data['pitem'][0][1]) 
  16.     else: 
  17.         dtype = str(r"AREA:a#EAAF00FF:"+data['pitem'][0][1]) 
  18.     unit = str(data['pitem'][0][2]) 
  19.     if not unit: 
  20.         unit = ' ' 
  21.     max = 'GPRINT:a:MAX:Max\:%.2lf %s' 
  22.     min = 'GPRINT:a:MIN:Min\:%.2lf %s' 
  23.     avg = 'GPRINT:a:AVERAGE:Avg\:%.2lf %s' 
  24.     now = 'GPRINT:a:LAST:Now\:%.2lf %s' 
  25.     rrdtool.graph(pngname, '-w', '600', '-h', '144', '-l', '0', '-s', start, 
  26.                 '-t', graphname, '-v', unit, DEF, 'COMMENT: \\n', dtype, now, avg, min, max, 'COMMENT: \\n') 
  27. ################################################################################################################### 
  28. def dItem02(data): 
  29.     pngname = str(data['pname']) 
  30.     start = data['stime'] 
  31.     graphname = str(data['gname'] + " (" + data['graphid'] + ") " + data['host'] + "(" + data['flag'] + ")") 
  32.     DEFa = str(r"DEF:a="+data['rrdpath']+r':'+data['pitem'][0][0]+r":AVERAGE") 
  33.     DEFb = str(r"DEF:b="+data['rrdpath']+r':'+data['pitem'][1][0]+r":AVERAGE") 
  34.     unit = str(data['pitem'][0][2]) 
  35.     if not unit: 
  36.         unit = ' ' 
  37.     if data['cols'] or data['itypes']: 
  38.         if not data['cols']: 
  39.             dtypea = str(data['itypes'][0][0]+r":a#00CF00FF:"+data['pitem'][0][1]) 
  40.             dtypeb = str(data['itypes'][0][1]+r":b#002A97FF:"+data['pitem'][1][1]) 
  41.         elif not data['itypes']: 
  42.             dtypea = str(r"AREA:a"+data['cols'][0][0]+r":"+data['pitem'][0][1]) 
  43.             dtypeb = str(r"LINE1:b"+data['cols'][0][1]+r":"+data['pitem'][1][1]) 
  44.         else: 
  45.             dtypea = str(data['itypes'][0][0]+r":a"+data['cols'][0][0]+r":"+data['pitem'][0][1]) 
  46.             dtypeb = str(data['itypes'][0][1]+r":b"+data['cols'][0][1]+r":"+data['pitem'][1][1]) 
  47.     else: 
  48.         dtypea = str(r"AREA:a#00CF00FF:"+data['pitem'][0][1]) 
  49.         dtypeb = str(r"LINE1:b#002A97FF:"+data['pitem'][1][1]) 
  50.     maxa = 'GPRINT:a:MAX:Max\:%.2lf %s' 
  51.     mina = 'GPRINT:a:MIN:Min\:%.2lf %s' 
  52.     avga = 'GPRINT:a:AVERAGE:Avg\:%.2lf %s' 
  53.     nowa = 'GPRINT:a:LAST:Now\:%.2lf %s' 
  54.     maxb = 'GPRINT:b:MAX:Max\:%.2lf %s' 
  55.     minb = 'GPRINT:b:MIN:Min\:%.2lf %s' 
  56.     avgb = 'GPRINT:b:AVERAGE:Avg\:%.2lf %s' 
  57.     nowb = 'GPRINT:b:LAST:Now\:%.2lf %s' 
  58.     rrdtool.graph(pngname, '-w', '600', '-h', '144', '-l', '0', '-s', start, 
  59.                 '-t', graphname, '-v', unit, DEFa, DEFb, 'COMMENT: \\n', dtypea, nowa, avga, mina, maxa, 'COMMENT: \\n', 
  60.                 dtypeb, nowb, avgb, minb, maxb, 'COMMENT: \\n') 

如果有24個item的圖形需要繪圖,貌似我是想不到更好的方法了,只得慢慢細心的堆代碼了,如果想到更優秀的方法,請告訴我一下,謝謝.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 怀集县| 土默特右旗| 双城市| 梓潼县| 林州市| 柳林县| 江孜县| 顺平县| 衡南县| 轮台县| 财经| 卢龙县| 奉新县| 平度市| 万州区| 始兴县| 高密市| 浦江县| 北辰区| 阳谷县| 灯塔市| 盐津县| 长岛县| 天峨县| 时尚| 永清县| 龙川县| 宝鸡市| 股票| 福贡县| 桃园市| 青龙| 绵竹市| 泾川县| 当雄县| 都昌县| 自贡市| 玛纳斯县| 肇州县| 冷水江市| 通海县|