利用python对rrd进行resize

来源:互联网 发布:背包推荐 知乎 编辑:程序博客网 时间:2024/06/06 19:36

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 pythonimport osimport rrdtooldef 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()

转自:http://blog.csdn.net/jakieyoung/article/details/5686814

原创粉丝点击