RRDTOOL:如何为最大,最小和最后输出使用CDEF求和多个文件

时间:2018-09-12 07:12:45

标签: graph rrdtool rrd

我有3个rrd文件(File1.rrd,File2.rdd和File3.rrd)。我正在从三个文件中获取MAX,MIN和LAST值。为了进一步说明,File1.rrd具有3个输出(最大,最小和电流),类似地File2.rrd和File3.rrd将具有3个总计(9)变量作为输出。我试图将所有三个最小值,最大值和当前值相加并将其存储到三个单独的变量中,但是每次都会产生错误。像这样的错误:“变量名称中的rpn表达式无效,RPN最终堆栈大小!= 1,不支持没有DEF或CDEF变量的rpn表达式。当我尝试修复它时,会在不同的情况下生成所有错误。 以下是代码段供您参考。

 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, +, +, + ' '

另外,使用不同的方法会很累,但没有任何效果,我知道我们不能像这样总结,我们应该在CDEF中传递DEF变量,但不知道如何做到这一点。你能帮我一下吗。以上代码不是实际代码,仅供参考。

先谢谢您。

1 个答案:

答案 0 :(得分:0)

"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 website上有很多信息可以帮助您理解。