RRDToolによって作成されたいくつかのグラフがあり、数時間の間に不良データを収集しました。
その期間中にRRDからデータを削除して、表示されないようにするにはどうすればよいですか?
私がこれを行うために見つけた最良の方法...
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,
私のために働いた。それが他の誰かを助けることを願っています。
xmlファイルの書き込みと編集を避けたい場合は(不良データの量に基づいて)ファイルIO呼び出しがほとんど必要ない場合があります。また、メモリ内のフェッチと更新の値を使用して、rrd全体をメモリに読み込むこともできます。
私はpython+rrdtoolを使用して同様のタスクを実行しましたが、最終的には次のようになりました。
- 辞書でrrdをメモリ内で読み取る
- 辞書の値を修正する
- 既存のrrdファイルを削除します
- 同じ名前で新しいrrdを作成します。
正確に何を編集するかを提案したのはRobMだけでした。私は彼の解決策を試しましたが、rrdtool1.4.7ではうまくいきませんでした
私のデータベースはAVERAGE、MAX、MINを使用しています。DERIVE、GAUGE、COMPUTEDが含まれています。間隔:秒(70)、分(70)、時間(25)、日(367)。私の仕事:最後の部分を削除します(一般的な理由:時計が戻りました)。
RobMのソリューションを適用しました。新しい終了時刻に変更し、それ以降はすべて削除します。復元されたデータベースは正常であるように見えました。しかし、それは新しい追加を受け入れませんでした。新しく作成した空のデータベースを調べました。そして、私はその中にNaNを使った70秒のレコードを見つけました。これは分と時間で同じです。
したがって、私の作業ソリューション-ある期間の終わりにレコードを削除した場合、この期間の最初に同じ数のNaNレコードを追加し、時間を正しく減らします。例外-毎日の記録。追加せずに削除されるだけです。削除後に期間が空になった場合は、新しい終了時刻(期間の境界に丸められます)で終了するNaNレコードで期間を埋めます。