2012-04-24 81 views
5

我有幾張由RRDTool創建的圖表,它們在幾個小時的時間段內收集了不好的數據。從RRDTool中刪除數據

如何在該時間段內從RRD中刪除數據,使其不再顯示?

回答

9

我發現做到這一點的最佳方法...

  1. 使用RRDTool Dump到RRD文件導出到XML。
  2. 打開XML文件,找到並編輯壞的數據。
  3. 使用RRDTool Restore恢復RRD文件。
2

如果你想避免寫作和XML文件,因爲這可能的編輯需要一些文件IO要求(根據你有多少壞數據都有),你也可以閱讀整個RRD到使用抓取和更新值內存-記憶。

我做了類似的任務使用python + rrdtool的我落得這樣做:

  1. 讀RRD內存在字典
  2. 字典中的固定值
  3. 刪除現有RRD文件
  4. 創建具有相同名稱的新rrd。
+4

如果你開源解決方案,我敢打賭,你會幫助很多人! – mscccc 2012-10-03 14:04:54

2

我有,我想放棄從我RRDtool的數據庫的最近幾個小時了類似的問題,所以我寫了一個快速腳本來做到這一點(的道歉非常規變量名 - 編碼風格下班繼承,嘆息):

#!/usr/bin/env python2                                             
"""                                                  
Modify XML data generated by `rrdtool dump` such that the last update was at                               
the unixtime specified (decimal). Data newer than this is simply omitted.                                

Sample usage::                                               

    rrdtool dump foo.rrd \ 
     | python remove_samples_newer_than.py 1414782122 \ 
     | rrdtool restore - foo_trimmed.rrd                       
"""                                                  

import sys                                                

assert sys.argv[1:], "Must specify maximum Unix timestamp in decimal"                                 

iMaxUpdate = sys.argv[1]                                            

for rLine in iter(sys.stdin.readline, ''):                                        
    if "<lastupdate>" in rLine:                                           
     # <lastupdate>1414782122</lastupdate> <!-- 2014-10-31 19:02:02 GMT -->                               
     _, _, rData = rLine.partition("<lastupdate>")                                     
     rData, _, _ = rData.partition("</lastupdate")                                     
     iLastUpdate = int(rData)                                          
     assert iLastUpdate < iMaxUpdate, "Last update in RRD older than " \                                
            "the time you provided, nothing to do"                                
     print "<lastupdate>{0}</lastupdate>".format(iMaxUpdate)                                   
    elif "<row>" in rLine:                                            
     # <!-- 2014-10-17 20:04:00 BST/1413572640 --> <row><v>9.8244774011e+01</v><v>8.5748587571e-01</v><v>4.2046610169e+00</v><v>9.3016101695e+01</v><v>5.0000000000e-02</v><v>1.6652542373e-01</ v><v>1.1757062147e+00</v><v>1.6901226735e+10</v><v>4.2023108608e+09</v><v>2.1457537707e+08</v><v>3.9597816832e+09</v><v>6.8812800000e+05</v><v>3.0433198080e+09</v><v>6.0198912250e+06</v><v>2.  0000000000e+00</v><v>0.0000000000e+00</v></row>                                       
     rData, _, _ = rLine.partition("<row>")                                       
     _, _, rData = rData.partition("/")                                        
     rData, _, _ = rData.partition("--")                                        
     rData = rData.strip()                                           
     iUpdate = int(rData)                                           
     if iUpdate < iMaxUpdate:                                          
      print rLine,                                            
    else:                                                
     print rLine,                                             

爲我工作。希望它可以幫助別人。

0

唯一提出的是,究竟要編輯的是RobM。我嘗試了他的解決方案,它不適用於rrdtool 1.4.7

我的數據庫使用AVERAGE,MAX和MIN。它包含DERIVE,GAUGE和COMPUTED。間隔:秒(70),分鐘(70),小時(25),日(367)。 我的任務:刪除最後一部分(典型原因:時鐘移回)。

我應用了RobM的解決方案:更改爲新的結束時間,之後全部刪除。恢復的數據庫似乎是正常的。但它不接受新的增補。 我檢查了一個新創建的空數據庫。我發現NaN有70秒的記錄,分鐘和小時也一樣。

因此,我的工作解決方案 - 如果我在某段時間結束時刪除了記錄,我會在此期間添加相同數量的NaN記錄,並正確減少時間。例外 - 日常記錄,只有在不添加的情況下才會被刪除。 如果在刪除後期間變爲空白,我用NaN記錄填充它以結束到我的新結束時間(四捨五入到期間邊界)。