2016-07-29 21 views
1

我試圖找出是否可以將以不規則間隔捕獲的值存儲到RRD中。以不規則間隔將數據寫入RRD

我有一個腳本連接到一個ActiveMQ服務器訂閱一個隊列或主題,並查看郵件標題時間戳,將其與Time.now進行比較以給我一個增量。

我從腳本得到的數據如下;

000000.681 Time Delta 
000000.793 Time Delta 
000000.583 Time Delta 
000001.994 Time Delta 

我所面臨的問題是,從所述的ActiveMQ消息不一定在一個「規則的間隔」進來(例如,1 /秒,1/2秒)他們可以在高峯時間進來作爲5的第二,並且每10秒相當一次。

我想能夠捕獲到RRD的輸出,所以我可以反對它的圖表,但看看周圍的互聯網,目前還不清楚這是可以做到的,或者如果我最好使用另一個數據庫/商店來捕獲數據。

我想要的最終輸出將是一個圖表,顯示每條消息的時間增量。

它看起來像我可以使用--step設置RRD到1秒,並且哈特拍到了docs

我發現一對夫婦的帖子herehere其中談得正小心的間隔,事實上我的數據會被平均的,平滑或以其他方式搞砸何時寫入RRD用。但是我在網上找到的東西沒有一個類似的使用案例,所以它有點難以知道我應該在哪裏尋找。我希望將我的數據存儲爲收到的每條消息的點。

我有幾個RRD的測試設置;一個是採取AVERAGE另一個採取LAST產生一些圖。我的心跳設置爲100秒,但間隔設置爲1.我現在正在獲取數據,其中看起來正確。我也在猜測, RRA的圖表中的空白空間是由於我的數據進入速度較慢,即每秒1次?

我會發布我的create代碼&輸出作爲答案。

回答

1

rrdtool將始終以固定間隔存儲數據。當數據被交給rrdtool時,它首先被重新採樣到--step間隔。然後進一步整合到RRA中設置的時間間隔。

數據的準確到達時間(到毫秒)是考慮到作爲重新採樣發生...

如果兩個數據點進一步分開比mrhb指定,數據被認爲是非連續的和rrdtool將在受影響的區間存儲「未知」。

+0

我想我會改變我這樣做的方式。我設法得到某種圖表,但我不確定它的平均值。我現在的想法是使用現有的ruby scrip對每10個時間戳取一個平均值,然後寫入一個日誌文件,我可以每分鐘使用mrtg進行讀取 – user3788685

+0

這不是必需的,您可以根據需要運行儘可能多的更新。 rrdtool會爲你建立平均值。 –

+0

我想我已經設法將其整理出來。我會用更多的信息更新我的問題。整個晚上都在運行,圖形看起來比我觀察的數據還好。我設置的哈特節拍太低,所以缺少數據,現在它的設置高得多的東西看起來不錯。 – user3788685

1

我最終制作了兩套RRD進行試驗;

rrdtool create test1.rrd \ 
--step '1' \ 
'DS:ds0:GAUGE:5:0:U' \ 
'RRA:AVERAGE:0.5:1:86400' \ 
'RRA:MAX:0.5:1:86400' \ 
'RRA:AVERAGE:0.5:60:10080' \ 
'RRA:MAX:0.5:60:10080' \ 
'RRA:AVERAGE:0.5:120:21600' \ 
'RRA:MAX:0.5:120:21600' \ 
'RRA:AVERAGE:0.5:300:105120' \ 
'RRA:MAX:0.5:300:105120' 

rrdtool create test.rrd \ 
--step '1' \ 
'DS:ds0:GAUGE:5:0:U' \ 
'RRA:AVERAGE:0.5:1:86400' \ 
'RRA:LAST:0.5:1:86400' \ 
'RRA:AVERAGE:0.5:60:10080' \ 
'RRA:LAST:0.5:60:10080' \ 
'RRA:AVERAGE:0.5:120:21600' \ 
'RRA:LAST:0.5:120:21600' \ 
'RRA:AVERAGE:0.5:300:105120' \ 
'RRA:MAX:0.5:300:105120' 

,讓我來存儲;

1sec, archive is kept for 1day back 
1min, archive is kept for 7day back 
2min, archive is kept for 30day back 
5min, archive is kept for 1year back 

這使得這些漂亮的圖;

1 Hour Average & Max 1 Hour Average & Last

其中PHP用下面的代碼所作的曲線圖;

<?php 
    $opts = array( 
       '--width', '600', 
       '--height', '100', 
       '--title', 'Avg Time Delta xxxxxxxxxx (Last 1 Hr)', 
       '--vertical-label', 'Time Delta', 
       '--watermark', 'xxxxxxxxxx', 
       '--start', 'end-1h', 
       'DEF:out=test.rrd:ds0:AVERAGE', 
       'DEF:max=test.rrd:ds0:MAX', 
       'AREA:out#9966FF:Avg Time Delta', 
       'LINE:max#996600:Max Time Delta', 
       ); 

    $ret = rrd_graph("graphs/1hr-graph.png", $opts); 

    if(!is_array($ret)) 
    { 
    $err = rrd_error(); 
    echo "rrd_graph() ERROR: $err\n"; 
    } 
     echo '<img src="http://server/graphs/1hr-graph.png">'; 
     echo '<BR>';  
?> 

<?php 
    $opts = array( 
       '--width', '600', 
       '--height', '100', 
       '--title', 'Last Time Delta xxxxxxxxxx (Last 1 Hr)', 
       '--vertical-label', 'Time Delta', 
       '--watermark', 'xxxxxxxxxx', 
       '--start', 'end-1h', 
       'DEF:avg=test1.rrd:ds0:AVERAGE', 
       'DEF:last=test1.rrd:ds0:LAST', 
       'AREA:avg#99AAFF:Avg Time Delta', 
       'LINE:last#99AA00:Last Time Delta', 
       ); 

    $ret = rrd_graph("graphs/1hr-last.png", $opts); 

    if(!is_array($ret)) 
    { 
    $err = rrd_error(); 
    echo "rrd_graph() ERROR: $err\n"; 
    } 
     echo '<img src="http://server/graphs/1hr-last.png">' 
?> 

從我自己的理智檢查和觀看實時看起來這兩個圖的數據是正確的,但表現方式上略有不同。當監控的數據饋送非常充分時,我只能每10秒收到1 mesg,我在LAST圖表中獲得了很多差距,而AVERAGE圖表被平滑化以填補空白。我還嘗試將另一個RRD設置爲ABSOLUTE,但圖表看起來「錯誤」,時間都低於1.0。

因此,看起來我可以在我喜歡的任何間隔時間內支持我的RRD。它看起來像RRD將按定義的時間間隔(在我的情況下爲1秒)對我的數據進行採樣,然後根據我保存它的方式(Gauge,Absolute等)做我需要做的事情。將心跳設置爲100 I在該100秒超時前應始終接收一些數據 - 這樣可以避免在我的數據庫中使用NAN條目。

目前我無法判斷此配置在中斷時間表現如何(例如來自AMQ服務器的延遲消息),我會嘗試運行一些測試,當我得到一些空閒時間並回報任何事情時重大。