Python RRD错误值

Python RRD错误值,python,linux,graph,rrdtool,rrd,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:'

我正在使用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]之后,我得到的图的值是错误的- (对不起,我不能发布图片)。
如您所见,插入0后,图形显示0,插入1后,图形显示0.8,插入2后,图形显示1.8。有时插入1后,图形显示0.6,以此类推。我做错什么了吗?

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

当您创建RRD文件(tempo.RRD)时,内部RRDtool会在创建时创建一个带有起始时间戳的bucket,并且每个后续bucket都会从该时间戳开始+10秒。比如说

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


这里有一个非常好的教程,详细介绍了这一点。

我不知道这在多大程度上符合您的需要,但这就是我如何欺骗我的图形来显示连接到我的系统的离散数量的用户:我使用。这并不意味着准确,只是为了比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'
)