Импорт данных RRD в структуры данных Python
У кого-нибудь есть хороший метод для импорта rrd-данных в python? Единственные библиотеки, которые я нашел до сих пор, - это просто оболочки для командной строки или обеспечивающие импорт данных в rrd и их отображение.
Я знаю об опциях экспорта и дампа rrd, но мне интересно, кто-нибудь уже проделал тяжелую работу здесь.
1 ответ
Вот выдержка из сценария, который я написал, чтобы получить данные cacti rrd. Это вряд ли будет именно то, что вы хотите, но это может дать вам хорошее начало. Цель моего сценария - превратить Cacti в хранилище данных, поэтому я стараюсь извлекать множество средних, максимальных или минимальных данных. У меня также есть некоторые флаги для выброса пиков верхнего или нижнего диапазона, умножения на случай, если я хочу превратить "байт / сек" в нечто более удобное, например, "мб / час"...
Если вам нужна точная копия данных "один к одному", вам, возможно, придется немного ее настроить.
value_dict = {}
for file in files:
if file[0] == '':
continue
file = file[0]
value_dict[file] = {}
starttime = 0
endtime = 0
cmd = '%s fetch %s %s -s %s -e %s 2>&1' % (options.rrdtool, file, options.cf, options.start, options.end)
if options.verbose: print cmd
output = os.popen(cmd).readlines()
dsources = output[0].split()
if dsources[0].startswith('ERROR'):
if options.verbose:
print output[0]
continue
if not options.source:
source = 0
else:
try:
source = dsources.index(options.source)
except:
print "Invalid data source, options are: %s" % (dsources)
sys.exit(0)
data = output[3:]
for val in data:
val = val.split()
time = int(val[0][:-1])
val = float(val[source+1])
# make sure it's not invalid numerical data, and also an actual number
ok = 1
if options.lowerrange:
if val < options.lowerrange: ok = 0
if options.upperrange:
if val > options.upperrange: ok = 0
if ((options.toss and val != options.toss and val == val) or val == val) and ok:
if starttime == 0:
# this should be accurate for up to six months in the past
if options.start < -87000:
starttime = time - 1800
else:
starttime = time - 300
else:
starttime = endtime
endtime = time
filehash[file] = 1
val = val * options.multiply
values.append(val)
value_dict[file][time] = val
seconds = seconds + (endtime - starttime)