5

我有几个由 RRDTool 创建的图表,它们在几个小时的时间段内收集了不良数据。

如何在该时间段内从 RRD 中删除数据,使其不再显示?

4

4 回答 4

11

我发现这样做的最佳方法...

  1. 使用RRDTool Dump将 RRD 文件导出为 XML。
  2. 打开 XML 文件,查找并编辑不良数据。
  3. 使用RRDTool Restore恢复 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 调用(基于您拥有多少坏数据),您还可以使用 fetch 和 update 内存中的值将整个 rrd 读入内存。

我使用 python + rrdtool 做了类似的任务,我最终做了:

  1. 在字典中读取内存中的rrd
  2. 修复字典中的值
  3. 删除现有的rrd文件
  4. 创建具有相同名称的新 rrd。
于 2012-10-01T19:11:33.507 回答
0

唯一提出要编辑什么的人是 RobM。我尝试了他的解决方案,但它在 rrdtool 1.4.7 中对我不起作用

我的数据库使用 AVERAGE、MAX 和 MIN。它包含 DERIVE、GAUGE 和 COMPUTED。间隔:秒 (70)、分钟 (70)、小时 (25)、天 (367)。我的任务:删除最后一部分(典型原因:时钟移回)。

我应用了 RobM 的解决方案:更改为我的新结束时间,之后全部删除。恢复的数据库似乎正常。但它不接受新的添加。我检查了一个新创建的空数据库。我在其中发现了 70 秒的 NaN 记录,分钟和小时也是如此。

所以,我的工作解决方案 - 如果我在某个时期结束时删除记录,我会在这个时期开始时添加相同数量的 NaN 记录,并正确减少时间。例外 - 每日记录,它们只删除而不添加。如果句点在删除后变为空,我用 NaN 记录填充到我的新结束时间(四舍五入到句点边界)。

于 2015-05-28T23:18:39.380 回答