0

我正在玩 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 等等。难道我做错了什么?

4

2 回答 2

0

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

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

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有一个很好的教程,它更详细。

于 2013-09-20T22:02:01.243 回答
0

我不知道这将在多大程度上满足您的需求,但这就是我如何欺骗我的图表以显示连接到我的系统的离散数量的用户:我使用CEIL 算术运算符。这并不意味着准确,只是为了比 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'
)
于 2014-02-22T10:28:34.020 回答