首页 > 解决方案 > RRDTOOL:如何使用 CDEF 对 MAX、MIN 和 LAST 输出的多个文件求和

问题描述

我有 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 变量,但不知道如何做到这一点。你能帮帮我吗?上述代码并非实际代码,仅供您参考。

先感谢您。

标签: graphrrdtoolrrd

解决方案


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


推荐阅读