5

RRDToolによって作成されたいくつかのグラフがあり、数時間の間に不良データを収集しました。

その期間中にRRDからデータを削除して、表示されないようにするにはどうすればよいですか?

4

4 に答える 4

11

私がこれを行うために見つけた最良の方法...

  1. RRDTool Dumpを使用して、RRDファイルをXMLにエクスポートします。
  2. XMLファイルを開き、不良データを見つけて編集します。
  3. RRDToolRestoreを使用してRRDファイルを復元します。
于 2012-04-25T14:11:00.943 に答える
4

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 = int(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,                                                                                                                                                                                   

私のために働いた。それが他の誰かを助けることを願っています。

于 2014-10-31T19:35:06.773 に答える
2

xmlファイルの書き込みと編集を避けたい場合は(不良データの量に基づいて)ファイルIO呼び出しがほとんど必要ない場合があります。また、メモリ内のフェッチと更新の値を使用して、rrd全体をメモリに読み込むこともできます。

私はpython+rrdtoolを使用して同様のタスクを実行しましたが、最終的には次のようになりました。

  1. 辞書でrrdをメモリ内で読み取る
  2. 辞書の値を修正する
  3. 既存のrrdファイルを削除します
  4. 同じ名前で新しいrrdを作成します。
于 2012-10-01T19:11:33.507 に答える
0

正確に何を編集するかを提案したのはRobMだけでした。私は彼の解決策を試しましたが、rrdtool1.4.7ではうまくいきませんでした

私のデータベースはAVERAGE、MAX、MINを使用しています。DERIVE、GAUGE、COMPUTEDが含まれています。間隔:秒(70)、分(70)、時間(25)、日(367)。私の仕事:最後の部分を削除します(一般的な理由:時計が戻りました)。

RobMのソリューションを適用しました。新しい終了時刻に変更し、それ以降はすべて削除します。復元されたデータベースは正常であるように見えました。しかし、それは新しい追加を受け入れませんでした。新しく作成した空のデータベースを調べました。そして、私はその中にNaNを使った70秒のレコードを見つけました。これは分と時間で同じです。

したがって、私の作業ソリューション-ある期間の終わりにレコードを削除した場合、この期間の最初に同じ数のNaNレコードを追加し、時間を正しく減らします。例外-毎日の記録。追加せずに削除されるだけです。削除後に期間が空になった場合は、新しい終了時刻(期間の境界に丸められます)で終了するNaNレコードで期間を埋めます。

于 2015-05-28T23:18:39.380 に答える