利用python对rrd进行resize

rrdtool在对时间序列值进行作图方面非常强大。但它也有些小的bug。

最近发现rrdtool resize的时候,会出现莫名其妙的Segmentation Fault

 

rrdtool定义rrd文件的时候,如果rra的资料数目过少或过多,在以后想要进行“扩容”或“缩容”

rrdtool提供了命令resize来进行。

语法

rrdtool resize rrd_file rra_num GROW|SHRINK rows

 

但是我在使用这个命令之后,对新文件dump出来的数据进行查看,发现数据全都变了形。因为扩容之后,

开始时间要提前,数据的时间也提前过去了,这是不对的。

 

由此想到可以先把数据提取出来,然后重新创建一个新的rrd文件再把数据重新update进去。

 

#!/usr/bin/env python import os import rrdtool def create_rrd(filename) : rrdtool.create(filename, '--start', 'now-6mon', 'DS:ds1:GAUGE:600:0:U', 'DS:ds2:GAUGE:600:0:U', 'DS:ds3:GAUGE:600:0:U', 'DS:ds4:GAUGE:600:0:U', 'DS:ds5:GAUGE:600:0:U', 'DS:ds6:GAUGE:600:0:U', 'RRA:AVERAGE:0.5:1:52128', 'RRA:AVERAGE:0.5:12:8784', 'RRA:MIN:0.5:12:8784', 'RRA:MAX:0.5:12:8784') def update_rrd(filename, timestamp, data) : if data[0] is None : return updatestr = '%d:%s' % (timestamp, ':'.join([str(x) for x in data])) rrdtool.update(filename, updatestr) def resize_rrd(rrdfile) : result = rrdtool.fetch(rrdfile, 'AVERAGE', '-s', 'now-1mon', '-e', 'now') filename = rrdfile.replace('/rrd/', '/rrd_resized/') print filename if os.path.exists(filename) : os.remove(filename) if not os.path.exists(os.path.dirname(filename)) : os.makedirs(os.path.dirname(filename)) create_rrd(filename) start_time, end_time, step = result[0] term = end_time - start_time data = result[2] for i in range(len(data)) : update_rrd(filename, start_time + i * 300, data[i]) def main() : for dirpath, dirlist, filelist in os.walk('/data/rrd') : for f in filelist : resize_rrd(os.path.join(dirpath, f), create_vod) if __name__ == '__main__' : main()  

你可能感兴趣的:(python,File)