RRD错误值

2024-09-30 22:21:20 发布

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

我在玩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,以此类推。我做错什么了吗?在


Tags: import脚本图形timepng错误templast
2条回答

这就是RRDtool的工作原理。RRDtool只与费率一起工作。您可以输入仪表数据(时间上的离散值),但RRDtool将始终在内部将其视为速率。在

当您创建RRD文件时(节拍),在内部RRDtool创建的bucket在创建时有一个起始时间戳,每个后续的bucket从该时间戳开始+10s。例如

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

如果要在与bucket匹配的时间戳处插入整数值,那么就可以了,但不是这样。您的脚本使用当前时间戳插入值,这几乎肯定不会等于bucket值。假设当前时间戳是1379714708,您想要插入一个值2。当您插入值时,RRDtool需要选择将其放入哪个bucket中。在本例中,1379714706是最近的,所以它将选择其中一个(这里有更多的逻辑,但这是要点)。您可能会认为它会将“2”插入到bucket中,但对RRDtool来说,这将是一个谎言。现在可能是2,但几秒钟前可能不是2。记住,它将所有这些值视为速率,它试图通过查看以前值的变化率来计算应该从该值中减去多少以使其正确,这就是为什么您看到的值是1.8和2.8,而不是期望的整数值。如果在存储桶之间插入多个值或跳过存储桶,情况会变得更复杂。在

http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html上有一个非常好的教程,它将更详细地介绍。在

我不知道这将在多大程度上满足您的需求,但这是我如何欺骗我的图形来显示连接到我的系统的离散数量的用户:我使用CEIL arithmetic operator。这并不意味着准确,只是为了比0.324的在线用户更满意。在

基于我用来操作rrd的工具作为命令行输出的内容,我希望您的代码看起来像

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'
)

相关问题 更多 >