rrd_fetch 不包含上次更新的值。为什么?
rrd_fetch does not contain values from last update. why?
我正在将来自温度传感器的信息存储在 rrd 中。我想从 php.
中的给定时间跨度中检索值
对于最近 2 小时的数据,我使用这个:
rrd_fetch($file, array("AVERAGE", "-s -2h"));
这是有效的。但是,在 rrd_fetch 的数据中找不到我可以通过 rrd_lastupdate($file);
获得的最后一个值。我如何调整我的代码,以便 rrd_fetch 调用也包含上次更新的数据?
rrd 在Python中是这样设置的:
rrdtool.create(
RRD_FILE,
"--start", "now",
"--step", "300",
"RRA:AVERAGE:0.5:1:288",
"RRA:AVERAGE:0.5:12:336",
"RRA:AVERAGE:0.5:288:365",
"DS:temp:GAUGE:600:0:50")
并在 while 循环中像这样更新:
while True:
temp = get_value()
data_rrd = "N:{0}".format(temp)
try:
rrdtool.update(file, data_rrd)
except:
print("Failed to write to RRD.")
time.sleep(300)
这是因为 lastupdate()
和 fetch()
做的事情不同。
当您将数据添加到 RRD 时,有一个 multi-stage 进程在后台进行。首先,将数据转换为 Rates;然后归一化;然后合并。
数据已提交update()
数据被转换为费率。如果你的DS是gauge
类型那么这是一个noop,但是其他类型会根据上一次更新的时间进行转换。
现在我们得到lastupdate()
返回的值,就是这个DP(datapoint)
数据已标准化。这意味着我们假设从最后一个已知数据点开始线性进展,并计算最后一步间隔(上面示例中的 300 秒)的平均值。这在时间 window 边界上给出了一个新的 PDP(主要数据点)(即 PDP 时间是间隔的倍数)
PDP 现已合并。收集到足够的数据后,根据 CF 和 XFF,将新的 CDP(合并数据点)写入 RRA。如果您的 RRA 有 1cdp=1pdp(如您的情况),那么 CDP 应该与 PDP 相同。
现在我们得到了RRA中的CDP,也就是fetch()
returns.
从这里可以看出,您存储的值与 lastupdate()
不同(由于归一化和速率);这与 fetch()
不同(由于 Consolodation)。
此外,在 window 完成之前,您不会看到 lastupdate()
中出现的值;在 RRA CDP 完成之前,您不会看到它出现在 fetch()
中。
由于您的 fetch()
没有要求比您的 1cdp=1pdp RRA 中更多的数据,您将避免由于合并而发生的更改,但您可能会达到规范化。
如果您希望显示的值相同,则需要确保所有 3 个操作都是 no-ops。
使用类型gauge
停止汇率转换
确保所有更新都准确地在时间范围内完成,以避免规范化。不要在更新中使用 'N'(现在),将其固定为时间戳,该时间戳是 Interval (300s) 的倍数。
拥有足够大的 1cdp=1pdp RRA 以避免合并。
有关这方面的更多详细信息,请在此处查看 Alex 的著名页面:http://rrdtool.vandenbogaerdt.nl/process.php
我正在将来自温度传感器的信息存储在 rrd 中。我想从 php.
中的给定时间跨度中检索值对于最近 2 小时的数据,我使用这个:
rrd_fetch($file, array("AVERAGE", "-s -2h"));
这是有效的。但是,在 rrd_fetch 的数据中找不到我可以通过 rrd_lastupdate($file);
获得的最后一个值。我如何调整我的代码,以便 rrd_fetch 调用也包含上次更新的数据?
rrd 在Python中是这样设置的:
rrdtool.create(
RRD_FILE,
"--start", "now",
"--step", "300",
"RRA:AVERAGE:0.5:1:288",
"RRA:AVERAGE:0.5:12:336",
"RRA:AVERAGE:0.5:288:365",
"DS:temp:GAUGE:600:0:50")
并在 while 循环中像这样更新:
while True:
temp = get_value()
data_rrd = "N:{0}".format(temp)
try:
rrdtool.update(file, data_rrd)
except:
print("Failed to write to RRD.")
time.sleep(300)
这是因为 lastupdate()
和 fetch()
做的事情不同。
当您将数据添加到 RRD 时,有一个 multi-stage 进程在后台进行。首先,将数据转换为 Rates;然后归一化;然后合并。
数据已提交
update()
数据被转换为费率。如果你的DS是
gauge
类型那么这是一个noop,但是其他类型会根据上一次更新的时间进行转换。现在我们得到
lastupdate()
返回的值,就是这个DP(datapoint)数据已标准化。这意味着我们假设从最后一个已知数据点开始线性进展,并计算最后一步间隔(上面示例中的 300 秒)的平均值。这在时间 window 边界上给出了一个新的 PDP(主要数据点)(即 PDP 时间是间隔的倍数)
PDP 现已合并。收集到足够的数据后,根据 CF 和 XFF,将新的 CDP(合并数据点)写入 RRA。如果您的 RRA 有 1cdp=1pdp(如您的情况),那么 CDP 应该与 PDP 相同。
现在我们得到了RRA中的CDP,也就是
fetch()
returns.
从这里可以看出,您存储的值与 lastupdate()
不同(由于归一化和速率);这与 fetch()
不同(由于 Consolodation)。
此外,在 window 完成之前,您不会看到 lastupdate()
中出现的值;在 RRA CDP 完成之前,您不会看到它出现在 fetch()
中。
由于您的 fetch()
没有要求比您的 1cdp=1pdp RRA 中更多的数据,您将避免由于合并而发生的更改,但您可能会达到规范化。
如果您希望显示的值相同,则需要确保所有 3 个操作都是 no-ops。
使用类型
gauge
停止汇率转换确保所有更新都准确地在时间范围内完成,以避免规范化。不要在更新中使用 'N'(现在),将其固定为时间戳,该时间戳是 Interval (300s) 的倍数。
拥有足够大的 1cdp=1pdp RRA 以避免合并。
有关这方面的更多详细信息,请在此处查看 Alex 的著名页面:http://rrdtool.vandenbogaerdt.nl/process.php