RRDTOOL:如何使用CDEF对MAX,MIN和LAST ouptut的多个文件求和



我有 3 个 rrd 文件(File1.rrd、File2.rdd 和 File3.rrd)。我从三个文件中获取最大值、最小值和最后一个值。为了说明更多,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 变量,但不知道如何做到这一点。你能帮帮我吗?上面提到的代码不是实际代码,仅供您参考。

提前谢谢你。

"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 文件的值,具有选定的分辨率(时间步长)和安慰因子(平均值、最大值、最小值)。

CDEF 是一组计算值,至少处理一个 DEF 或 CDEF 集。

但是,您的 VDEF 采用一组值(来自 DEF 或 CDEF)并对其进行汇总。 当您的图表显示 5 分钟间隔的平均值时,您可以通过这种方式获取全天的平均值。

那么,如何做你想做的事情呢?

您需要的是使用DEF 从 RRD 中提取具有正确安慰因子的多个时间序列;然后使用 CDEF 将它们相加。 您可能希望使用 VDEF ot 获取页脚中文本的单个值。

例:

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

最新更新