rrdscript不会绘制任何内容

2024-10-01 04:43:54 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们(还有偏离航线的女士们)

我有一个小剧本,应该给我看一些 不错的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']

有没有人能给我一些建议或建议如何解决这个问题? (抱歉代码有点乱)

提前谢谢

谨致问候

德克


Tags: importselffortimedefpingintprint
1条回答
网友
1楼 · 发布于 2024-10-01 04:43:54

几个问题。你知道吗

首先,您似乎只收集一个数据样本,并在尝试生成图形之前存储它。你需要至少两个样本,间隔大约300秒,然后你才能得到一个单一的主要数据点,因此一些图表。你知道吗

第二,你不发布任何关于你实际存储的数据的信息。您确定您的rrdPing函数正在将有效数据返回到存储区吗?您也没有测试写入的错误状态。你知道吗

第三,您正在收集的数据似乎是ping次或类似的值,这是一个仪表类型的值。然而,您的rrdds定义使用了计数器类型,而您的图形调用将其视为网络流量数据。计数器类型假定值递增并转换为变化率,因此如果给它ping RTT数据,则会存储未知值或零,而这些值不会显示在图形上。你知道吗

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

您应该让您的代码测试由RRDTool库产生的任何错误消息的返回值不管怎样,这是一个很好的实践。测试时,打印出要更新的值,以确保提供的值有效。使用RRDTool,您应该以步长间隔收集多个数据样本,并在期望看到图形上的一行之前将它们存储起来。此外,请确保使用的数据类型、仪表或计数器正确。你知道吗

相关问题 更多 >