RRDTOOL: Как суммировать несколько файлов, используя CDEF для выхода MAX, MIN и LAST - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть 3-й файл (File1.rrd, File2.rdd и File3.rrd). Я получаю значения MAX, MIN и LAST из трех файлов. Чтобы проиллюстрировать это, File1.rrd имеет 3 вывода (max, min и current), аналогично File2.rrd и File3.rrd будут иметь 3 переменные total (9) в качестве вывода. Я пытаюсь сложить все три минимальные, максимальные и текущие значения и сохранить его в трех отдельных переменных, но каждый раз выдает ошибку. Ошибка типа «неверное выражение rpn в имени переменной, конечный размер стека RPN! = 1, выражения rpn без переменных DEF или CDEF не поддерживаются. Все ошибки генерируются в разных сценариях, когда я пытался это исправить. Ниже приведен фрагмент кода для вашей справки.

 rrdfile1  = file1.rrd
 rrdfile2 = file2.rrd
 rrdfile3 =  file3.rrd
cmdline = cmdline + 'DEF:used_file1=file1:license_out:MAX:step=' + step_value + ' ' + \
cmdline = cmdline + \
  VDEF: 'min_file1 = used_file1,MINIMUM' + \
  VDEF: 'max_file1 = used_file1,MAXIMUM' + \
  VDEF: 'cur_file1 = used_file1,LAST' + \
  VDEF: 'min_file2 = used_file2,MINIMUM' + \
  VDEF: 'max_file2 = used_file2,MAXIMUM' + \
  VDEF: 'cur_file2 = used_file2,LAST' + \
  VDEF: 'min_file3 = used_file3,MINIMUM' + \
  VDEF: 'max_file3 = used_file3,MAXIMUM' + \
  VDEF: 'cur_file3 = used_file3,LAST' + \  

Я пытался суммировать так:

cmdline = cmdline + 'CDEF:Total_min = min_file1,min_file2, min_file3, +, +, + ' '
cmdline = cmdline + 'CDEF:Total_max = max_file1,max_file2, max_file3, +, +, + ' '
cmdline = cmdline + 'CDEF:Total_cur = cur_file1,cur_file2, cur_file3, +, +, + ' '

Кроме того, надоел другой метод, но ничего не получалось, я знаю, что мы не можем суммировать, как это, мы должны передать переменную DEF в CDEF, но не понимаем, как это сделать. Не могли бы вы помочь мне. Вышеупомянутый код не является действительным кодом только для справки.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018
"invalid rpn expression in a variable name, RPN final stack size != 1, rpn expressions without DEF or CDEF variables are not supported"

Это сообщение об ошибке сообщает вам о проблеме; Ваша функция RPN (вероятно, в CDEF) отформатирована неправильно. Причина в том, что вам нужна переменная DEF или CDEF, а вы используете переменные VDEF.

В чем разница?

Ну, DEF или CDEF - это ряд значений, которые потенциально могут быть отображены. VDEF, с другой стороны, представляет собой однозначное суммарное значение за весь временной ряд.

Ваш DEF - это набор значений прямо из файла RRD с выбранным разрешением (шаг по времени) и коэффициентом консолидации (AVG, MAX, MIN).

Ваш CDEF - это вычисленный набор значений, работающий как минимум с одним набором DEF или CDEF.

Ваш VDEF, тем не менее, принимает набор значений (из DEF или CDEF) и суммирует их. Таким образом вы получаете среднее значение за весь день, когда ваш график показывает средние значения за 5-минутные интервалы.

Итак, как делать то, что вы хотите сделать?

Вам нужно использовать DEF для извлечения нескольких временных рядов с правильными коэффициентами консолидации из RRD; затем используйте CDEF для их суммирования. Возможно, вы захотите также использовать VDEF, чтобы не получить единственное значение для текста в нижнем колонтитуле.

Пример:

DEF:lasta=file.rrd:a:LAST
DEF:lastb=file.rrd:b:LAST
CDEF:lasttotal=lasta,lastb,+
DEF:maxa=file.rrd:a:MAXIMUM
DEF:maxb=file.rrd:b:MAXIMUM
CDEF:maxtotal=maxa,maxb,+
LINE:lasttotal#ff0000:"Last
LINE:maxtotal#00ff00:"Maximum for this interval"
VDEF:overallmaxtotal=maxtotal,MAXIMUM
PRINT:overallmaxtotal:"The maximum for the whole graph is %lf"

Однако у вас также есть другая проблема.

По мере того как ваша гранулярность уменьшается - и вы переходите к большим временным окнам - вычисление общей суммы становится все более и более неточным. Это потому, что max(a+b) <> max(a)+max(b) с увеличением интервала суммирования. Это верно как для MAX, так и для MIN, но не для LAST или AVG. Единственный способ получить правильную точность - выполнить суммирование перед сохранением в RRD.

Кроме того, вполне вероятно, что вам лучше использовать AVERAGE, чем использовать LAST, поскольку AVERAGE правильно объединяет значения при переходе к более низкой гранулярности.

На веб-сайте RRDTool имеется много информации, которая может помочь вам понять.

...