如何在 rrdtool 图中按时间段聚合数据

How to aggregate data by period in a rrdtool graph

我有一个 rrd 文件,其中包含每分钟到服务器的平均 ping 次数 (GAUGE),并且当服务器离线时(出于现在无关紧要的原因,这种情况非常频繁)它会存储一个 NaN/unknown .

我想创建一个图表,其中包含服务器每小时离线的百分比,我认为可以通过计算 60 个样本内的每个 NaN 然后除以 60 来实现。

现在我要定义一个变量,该变量在服务器离线时为 1,否则为 0,但我已经阅读了文档,但不知道如何汇总:

DEF:avg=server.rrd:rtt:AVERAGE CDEF:offline=avg,UN,1,0,IF

创建图表时可以这样做吗?或者我必须将该信息存储在另一个 rrd 中?

我认为您无法完全按照自己的意愿行事,但您有几个选择。

您可以定义一个滑动window平均值,显示前一小时未知的百分比,并使用TRENDNAN绘制图表。

DEF:avg=server.rrd:rtt:AVERAGE:step=60
CDEF:offline=avg,UN,100,0,IF
CDEF:pcavail=offline,3600,TREND
LINE:pcavail#ff0000:Availability

这里定义avg为ping数据的1分钟时间序列。请注意,我们使用 step=60 来确保即使在较小的图形中也能获得最佳的数据分辨率。然后我们定义 offline 当服务器存在时为 100,当服务器不存在时为 0。然后,pcavail 是 1 小时的滑动 window 平均值,这实际上是前一小时服务器可用的时间百分比。

但是,有一个问题是 RRDTool 会在你动手之前默默地总结源数据,如果图中的一个像素有很多数据点(当然,如果执行 fetch 就不会发生这种情况)。要解决这个问题,您需要在存储时完成 offline CDEF——IE,有一个 COMPUTE 类型的 DS,它是 100 或 0,具体取决于 avg DS众所周知。然后,任何平均都将保留数据(正常平均会忽略未知数,或者 xff 设置使整个 cdp 未知)。

rrdtool create ...
DS:rtt:GAUGE:120:0:9999
DS:offline:COMPUTE:rtt,UN,100,0,IF

rrdtool graph ...
DEF:offline=server.rrd:offline:AVERAGE:step=3600
LINE:offline#ff0000:Availability

如果您能够修改 RRD,并且不需要历史数据,那么以这种方式使用 COMPUTE 将允许您根据需要在 1 小时的阶梯图中显示数据。