嘿伙计们(当然还有女士们),
我有这个小脚本应该给我看一些 不错的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 :(得分:0)
有几个问题。
首先,您似乎只是在尝试生成图表之前收集单个数据样本并存储它。您需要至少两个样本,相隔大约300秒,然后才能获得单个主数据点,因此需要绘制图形。
其次,您不发布有关您实际存储的数据的任何信息。您确定您的rrdPing函数正在返回要存储的有效数据吗?您没有测试写入的错误状态。
第三,您收集的数据似乎是ping时间或类似值,这是GAUGE类型值。但是,您的RRD DS定义使用COUNTER类型,而您的图形调用将其视为网络流量数据。 COUNTER类型假设增加值并转换为变化率,因此如果您给它ping RTT数据,您将获得未知数或零存储,这将不会显示在图表上。
第四,你对RRDGraph的调用是指定-1的开始和+1的结束。从过去的1秒到未来的1秒?由于你的步数是300s,这是一个奇怪的图表。也许你应该--end 'now-1' --start 'end-1day'
或类似?
您应该让代码测试RRDTool库生成的任何错误消息的返回值 - 无论如何,这是一个好习惯。测试时,打印出要更新的值,以确保提供有效值。使用RRDTool,您应该以步进间隔收集多个数据样本并存储它们,然后才能在图形上看到一条线。另外,请确保使用正确的数据类型,GAUGE或COUNTER。