RRD错误的值

时间:2013-09-20 19:29:52

标签: python linux graph rrdtool rrd

我正在玩RRDTool,但它显示错误的值。 我有一点python脚本:

import sys
import rrdtool
import time

i = 0

rrdtool.create(
    'tempo.rrd',
    '--step', '10',
    'DS:temp:GAUGE:20:-40:100',
    'RRA:LAST:0.5:1:1500'
)

while 1:
    ret = rrdtool.update('tempo.rrd','N:' + `i`);
    print "i %i" % i

    rrdtool.graph(
    'test.png',
    '--imgformat', 'PNG',
    '--width', '540',
    '--height', '200',
    '--start', "-%i" % 60,
    '--end', "-1",
    '--vertical-label', 'Temperatura',
    '--title', 'Temperatura lauke',
    '--lower-limit', '-1',
    'DEF:actualtemp=tempo.rrd:temp:LAST',
    'LINE1:actualtemp#ff0000:Actual',
    'GPRINT:actualtemp:LAST:Actual %0.1lf C'
    )   

    i += 1

    time.sleep(10)

插入[0,1,2]后,我得到错误值的图表 - http://i.imgur.com/rfWWDMm.png(抱歉,我无法发布图片)。 如图所示,插入0后,图形显示0,插入1后,图形显示0.8,插入2后,图形显示1.8。有时插入1后,图表显示0.6等等。我做错了吗?

2 个答案:

答案 0 :(得分:0)

这是RRDtool的工作原理。 RRDtool专门用于费率。您可以输入仪表数据(离散值及时),但RRDtool将始终在内部将其视为速率。

当您创建RRD文件(tempo.rrd)时,内部RRDtool在创建时创建了具有开始时间戳的存储桶,并且每个后续存储桶从该时间戳开始+ 10s。例如

bucket 1    - 1379713706
bucket 2    - 1379713716
bucket 3    - 1379713726
...
bucket 100  - 1379714706
bucket 101  - 1379714716
bucket 102  - 1379714726

如果你要在与桶匹配的时间戳上插入你的整数值,你就可以了,但你不是。您的脚本使用当前时间戳插入值,这几乎肯定不会等于存储桶值。假设,我们说当前时间戳是1379714708,你想要插入一个值2.当你插入你的值时,RRDtool需要选择把它放入哪个桶。在这种情况下1379714706是最近的,所以它会选择那个(有)这里有点逻辑,但这是要点)。您可能认为它会在桶中插入'2',但对于RRDtool,这将是一个谎言。现在可能是2,但几秒前可能不是2。考虑到它将所有这些值视为速率,它会尝试通过查看先前值的变化率来确定应从该值中减去多少以使其正确。这就是为什么您会看到诸如1.8和2.8之类的值的原因。不是您期望的整数值。如果在存储桶之间插入多个值或跳过存储桶,事情会变得更复杂。

http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html有一个很好的教程,详细介绍。

答案 1 :(得分:0)

我不知道这会在多大程度上符合您的需求,但这就是我欺骗图表以显示连接到我系统的离散数量的用户:我使用CEIL arithmetic operator。它不是准确的,只是比0.324在线用户更令人满意。

基于我用来操作rrds作为命令行吐出的工具,我希望你的代码看起来像

rrdtool.graph(
'test.png',
'--imgformat', 'PNG',
'--width', '540',
'--height', '200',
'--start', "-%i" % 60,
'--end', "-1",
'--vertical-label', 'Temperatura',
'--title', 'Temperatura lauke',
'--lower-limit', '-1',
'DEF:actualtemp=tempo.rrd:temp:LAST',
'CDEF:ACTUALTEMP=actualtemp,CEIL',
'LINE1:ACTUALTEMP#ff0000:Actual',
'GPRINT:ACTUALTEMP:LAST:Actual %0.1lf C'
)