[英]rrd_fetch does not contain values from last update. why?
我將來自溫度傳感器的信息存儲在 rrd 中。 我想從 php 中的給定時間跨度中檢索值。
對於過去 2 小時的數據,我使用這個:
rrd_fetch($file, array("AVERAGE", "-s -2h"));
這是工作。 但是,我可以通過rrd_lastupdate($file);
獲得的最后一個值。 在 rrd_fetch 的數據中找不到。 我如何調整我的代碼,以便 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 時,后台會執行一個多階段過程。 首先,將數據轉換為 Rates; 然后歸一化; 然后合並。
數據提交update()
數據被轉換為速率。 如果您的 DS 是gauge
類型那么這是一個 noop,但其他類型將根據上次更新的時間進行轉換。
現在我們得到了lastupdate()
返回的值,也就是這個 DP(數據點)
數據被歸一化。 這意味着我們假設從最后一個已知數據點開始線性進展,並計算最后一步間隔(上面示例中的 300 秒)的平均值。 這在時間 window 邊界上給出了一個新的 PDP(主要數據點)(即 PDP 時間是間隔的倍數)
PDP 現在已合並。 收集到足夠的數據后,根據 CF 和 XFF,將新的 CDP(合並數據點)寫入 RRA。 如果您的 RRA 具有 1cdp=1pdp(如您的情況),則 CDP 應與 PDP 相同。
現在我們得到 RRA 中的 CDP,這就是fetch()
返回的內容。
由此,您可以看到您存儲的值與lastupdate()
(由於歸一化和速率); 這與fetch()
不同(由於 Consolodation)。
此外,在 window 完成之前,您不會看到lastupdate()
中出現的值; 在 RRA CDP 完成之前,您不會看到它出現在fetch()
中。
由於您的fetch()
沒有要求比 1cdp=1pdp RRA 中更多的數據,因此您將避免由於合並而發生的更改,但您可能會遇到規范化。
如果您希望顯示的值相同,則需要確保所有 3 個操作都是空操作。
使用 type gauge
停止 Rate 轉換
確保所有更新都准確地在時間范圍內完成,以避免規范化。 不要在更新中使用“N”(現在),將其固定為時間戳,該時間戳是間隔(300 秒)的倍數。
擁有足夠大的 1cdp=1pdp RRA 以避免 Consolodation。
有關這方面的更多詳細信息,請參閱此處 Alex 的著名頁面: http://rrdtool.vandenbogaerdt.nl/process.php
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.