您的位置:首页 > 编程语言 > Python开发

利用python对rrd进行resize

2010-06-22 16:13 447 查看
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: