2014-04-13 41 views
0

嘿,伙计们(和关闭过程莱迪斯),rrdscript不会绘制任何

我有这个脚本应该给我一些很好的 RRD图。但我似乎不能找到一种方式来让它工作,让我看看一些统计数据。这是我的脚本:

# Function: Simple ping plotter for rrd 
import rrdtool,tempfile,commands,time,sys 
from model import hosts 
sys.path.append('/home/dirk/devel/python/stattool/stattool/lib') 
import nurrd 
from nurrd import RRDplot 

class rrdPing(RRDplot): 

    def __init__(self): 
     self.DAY = 86400 
     self.YEAR = 365 * self.DAY 
     self.rrdfile = 'hostname.rrd' 
     self.interval = 300 
     self.probes = 5 
     self.rrdList = [] 


    def create_rrd(self, interval): 
     ret = rrdtool.create("%s" % self.rrdfile, "--step", "%s" % self.interval, 
          "DS:packets:COUNTER:600:U:U", 
          "RRA:AVERAGE:0.5:1:288", 
          "RRA:AVERAGE:0.5:1:336") 


    def getHosts(self, userID): 
     myHosts = hosts.query.filter_by(uid=userID).all() 
     return myHosts.pop(0) 

    def _doPing(self,host): 
     for x in xrange(0, self.probes): 
      ans,unans = commands.getstatusoutput("ping -c 3 -w 6 %s| grep rtt| awk -F '/' '{ print $5 }'" % host) 
      print x 
      self.probes -=1 
      self.rrdList.append(unans) 
     return self.rrdList 

    def plotRRD(self): 
     self.create_rrd(self.interval) 
     times = self._doPing(self.getHosts(3)) 
     for x in xrange(0,len(times)): 
      loc = times.pop(0) 
      rrdtool.update(self.rrdfile, '%d:%d' % (int(time.time()), int(float(loc)))) 
      print '%d:%d' % (int(time.time()), int(float(loc))) 
      time.sleep(5) 
     self.graph(60) 

    def graph(self, mins): 
     ret = rrdtool.graph("%s.png" % self.rrdfile, "--start", "-1", "--end" , "+1","--step","300", 
          "--vertical-label=Bytes/s", 
          "DEF:inoctets=%s:packets:AVERAGE" % self.rrdfile , 
          "AREA:inoctets#7113D6:In traffic", 
          "CDEF:inbits=inoctets,8,*", 
          "COMMENT:\\n", 
          "GPRINT:inbits:AVERAGE:Avg In traffic\: %6.2lf \\r", 
          "COMMENT: ", 
          "GPRINT:inbits:MAX:Max In traffic\: %6.2lf") 



if __name__ == "__main__": 

    ping = rrdPing() 
    ping.plotRRD() 
    info = rrdtool.info('hostname.rrd') 
    print info['last_update'] 

有人请给我一些建议或一些提示如何解决这个问题? (对不起代码是豆蔻乱)

在此先感谢

亲切的问候,

德克

+0

当你说'它不工作'你是什么意思?脚本是否无法运行,还是运行但不生成图形,还是会生成图形但没有您期望的内容?多一点细节会有所帮助。最初的一瞥显示你似乎只给RRD一个数据样本;你需要至少2个,相隔300秒才能得到RRA中的一个点,否则你会得到一个空的图。 –

回答

0

的几个问题。

首先,您似乎只是在您尝试生成图形之前收集单个数据样本并将其存储。您需要至少两个样本,相隔大约300秒,然后才能获得单个主数据点,因此需要绘制图表。其次,您不会发布关于您实际存储的数据的可用信息。你确定你的rrdPing函数正在返回有效的数据来存储吗?您还没有测试写入的错误状态。

第三,您收集的数据似乎是ping时间或类似,这是GAUGE类型的值。但是,您的RRD DS定义使用COUNTER类型,您的图形调用将其视为网络流量数据。 COUNTER类型假定增加值并转换为变化率,所以如果你给它一个RTT数据,你会得到未知或零值,这些值不会显示在图上。

第四,您对RRDGraph的调用指定了-1的开始和+1的结束。从过去的1秒到未来的1秒?由于你的步骤是300秒,这是一个奇怪的图。也许你应该有--end 'now-1' --start 'end-1day'或类似的?

您应该让代码测试RRDTool库生成的任何错误消息的返回值 - 无论如何,这是一个很好的做法。测试时,打印出您正在更新的值,以确保您提供了有效的值。使用RRDTool,您应该按步骤间隔收集多个数据样本,并在预期在图表上看到一条线之前存储它们。另外,请确保您使用的是正确的数据类型GAUGE或COUNTER。