我有几个由RRDTool创建的图表,这些图表在几个小时的时间段内收集了不良数据。
如何在该时间段内从 RRD 中删除数据,使其不再显示?
我找到的最好的方法...
- 使用 RRDTool 转储将 RRD 文件导出为 XML。
- 打开XML文件,查找并编辑错误数据。
- 使用 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。我尝试了他的解决方案,但在 rrdtool 1.4.7 中对我不起作用
我的数据库使用平均值、最大值和最小值。它包含派生,仪表和计算。间隔:秒 (70)、分钟 (70)、小时 (25)、天 (367)。我的任务:删除最后一部分(典型原因:时钟向后移动)。
我应用了 RobM 的解决方案:更改为我的新结束时间,删除它之后的所有内容。恢复的数据库似乎正常。但它不接受新增加的内容。我检查了一个新创建的空数据库。我在其中发现了 NaN 的 70 秒记录,分钟和小时相同。
因此,我的工作解决方案 - 如果我在某个时间段结束时删除记录,我会在此时间段开始时添加相同数量的 NaN 记录,并正确减少时间。例外 - 每日记录,它们只会被删除而不添加。如果句点在删除后变为空,我会用以新的结束时间结束的 NaN 记录(四舍五入到句点边界)填充它。