我正在使用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] 后,我得到值错误的图形 -https://i.stack.imgur.com/J4fM1.png(对不起,我无法发布图片)。如您所见,插入 0 后,图形显示 0,插入 1 后,图形显示 0.8,插入 2 后,图形显示 1.8。有时插入 1 后,图形显示 0.6,依此类推。我做错了什么吗?
这就是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 有一个很棒的教程,详细介绍了。
我不知道这在多大程度上符合您的需求,但这就是我欺骗我的图表以显示连接到我的系统的离散数量的用户的方式:我使用 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'
)