2012-04-24 29 views
5

Tôi có một số đồ thị được tạo bởi RRDTool đã thu thập dữ liệu xấu trong một khoảng thời gian vài giờ.Xóa dữ liệu khỏi RRDTool

Làm cách nào để xóa dữ liệu khỏi RRD trong khoảng thời gian đó để không còn hiển thị?

Trả lời

9

phương pháp tốt nhất tôi tìm thấy để làm điều này ...

  1. Sử dụng RRDTool Dump xuất file RRD to XML.
  2. Mở tệp XML, tìm và chỉnh sửa dữ liệu không hợp lệ.
  3. Khôi phục tệp RRD bằng RRDTool Restore.
2

Nếu bạn muốn tránh viết và chỉnh sửa tệp xml vì điều này có thể mất vài cuộc gọi IO tệp (dựa trên lượng dữ liệu bạn có), bạn cũng có thể đọc toàn bộ rrd vào bộ nhớ bằng cách tìm nạp và cập nhật giá trị -ký ức.

tôi đã làm công việc tương tự như sử dụng python + rrdtool và tôi đã kết thúc thực hiện:

  1. đọc rrd trong bộ nhớ trong một cuốn từ điển
  2. giá trị sửa chữa trong từ điển
  3. xóa RRD tập tin
  4. hiện
  5. tạo rrd mới có cùng tên.
+4

Nếu bạn mở nguồn giải pháp của mình, tôi cá là bạn sẽ giúp rất nhiều người! – mscccc

2

Tôi đã có một vấn đề tương tự mà tôi muốn loại bỏ vài giờ gần đây nhất từ ​​cơ sở dữ liệu RRDtool tôi, vì vậy tôi đã viết một kịch bản nhanh chóng để làm điều đó (xin lỗi cho tên biến độc đáo - mã hóa phong cách thừa hưởng từ công việc , sigh):

#!/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,                                             

Làm việc cho tôi. Hy vọng nó sẽ giúp người khác.

0

Người duy nhất được đề xuất, chính xác là gì để chỉnh sửa, là RobM. Tôi đã thử giải pháp của anh ấy và nó không hoạt động cho tôi trong rrdtool 1.4.7

Cơ sở dữ liệu của tôi sử dụng AVERAGE, MAX và MIN. Nó chứa DERIVE, GAUGE và COMPUTED. Khoảng thời gian: giây (70), phút (70), giờ (25), ngày (367). Nhiệm vụ của tôi: xóa một số phần cuối cùng (lý do điển hình: đồng hồ di chuyển trở lại).

Tôi đã áp dụng giải pháp của RobM: thay đổi thời gian kết thúc mới của tôi, xóa tất cả sau khi kết thúc. Cơ sở dữ liệu được khôi phục dường như là bình thường. Nhưng nó không chấp nhận bổ sung mới. Tôi đã kiểm tra cơ sở dữ liệu trống mới được tạo. Và tôi tìm thấy trong đó 70 bản ghi thứ hai với NaN, tương tự cho phút và giờ.

Vì vậy, giải pháp làm việc của tôi - nếu tôi xóa bản ghi trong một khoảng thời gian kết thúc, tôi thêm cùng một số bản ghi NaN trong giai đoạn này bắt đầu, với thời gian giảm chính xác. Ngoại lệ - hồ sơ hàng ngày, chúng chỉ bị xóa mà không cần thêm. Nếu khoảng thời gian trống sau khi xóa, tôi điền vào nó với các bản ghi NaN kết thúc đến thời gian kết thúc mới của tôi (được làm tròn đến ranh giới thời gian).

Các vấn đề liên quan