Импорт данных RRD в структуры данных Python

У кого-нибудь есть хороший способ импорта данных rrd в python? Единственные библиотеки, которые я нашел до сих пор, являются просто оболочками для командной строки или обеспечивают импорт данных в rrd и их графическое отображение.

Я знаю о параметрах экспорта и дампа rrd, но мне интересно, если кто-то уже проделал здесь тяжелую работу.


person Kyle Brandt    schedule 28.01.2011    source источник


Ответы (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)
person samurailawngnome    schedule 08.02.2011