【问题标题】:How could I print the time of a max value in a rrdtool graph?如何在 rrdtool 图中打印最大值的时间?
【发布时间】:2023-03-20 07:34:01
【问题描述】:

我已经搜索了很多次,我已经厌倦了。

我有一个 rrdtool 数据库,用于打印 MAX、Min、Average 值。 现在,我想打印存储在 rrd db 中的最大值的时间。

这是我的rrd(CPU监控)的定义:

rrdtool create CPU.rrd --start $Date \
   DS:CPU_ALL:GAUGE:600:U:U \
   DS:User:GAUGE:600:U:U \
   DS:Sys:GAUGE:600:U:U \
   DS:Wait:GAUGE:600:U:U \
   DS:Idle:GAUGE:600:U:U \
   RRA:AVERAGE:0.5:1:20000 \
   RRA:AVERAGE:0.5:1:20000 \
   RRA:AVERAGE:0.5:1:20000 \
   RRA:AVERAGE:0.5:1:20000 \
   RRA:AVERAGE:0.5:1:20000

这是我的图形脚本:

rrdtool graph CPUUsed.png --start -1w \
DEF:CPUTOTAL=CPU.rrd:CPU_ALL:AVERAGE AREA:CPUTOTAL#FF0000:"CPU Used" LINE2:CPUTOTAL#FF0000 \
--vertical-label "CPU" \
--title "CPU " \
--width 530 \
--height 380 \
GPRINT:CPUTOTAL:MAX:"MAX\:%6.2lf %s" \
GPRINT:CPUTOTAL:MIN:"MIN\:%6.2lf %s"  \
GPRINT:CPUTOTAL:AVERAGE:"MOY\:%6.2lf %s"  \
GPRINT:CPUTOTAL:LAST:"LAST\:%6.2lf %s" 

如何生成这个图加上最大 CPU 值的时间?

【问题讨论】:

    标签: rrdtool


    【解决方案1】:

    好的,这里有几个问题。

    首先,您的 RRD 配置错误。您定义了 5 个相同的 RRA - 这没有意义。一个 RRA 将为所有定义的 DS 保存指定分辨率的值。但是,您可能希望在更高的粒度上拥有更多(以加快月或年的图表)。您可能还需要一个 MIN 或 MAX 类型的 RRA,以便您的 MIN 和 MAX 数字更准确。

    例如,此集定义了 MAX 和 MIN RRA 以及平均值,并且还将有 4 个汇总,大致对应于每日、每周、每月和每年的图表。

    RRA:AVERAGE:0.5:1:20000 \
    RRA:AVERAGE:0.5:6:2000 \
    RRA:AVERAGE:0.5:24:2000 \
    RRA:AVERAGE:0.5:288:2000 \ 
    RRA:MAX:0.5:1:20000 \
    RRA:MAX:0.5:6:2000 \
    RRA:MAX:0.5:24:2000 \
    RRA:MAX:0.5:288:2000 \
    RRA:MIN:0.5:1:20000 \
    RRA:MIN:0.5:6:2000 \
    RRA:MIN:0.5:24:2000 \
    RRA:MIN:0.5:288:2000 
    

    其次,当您想在 GPRINT 行中打印单个图形时,您需要使用 VDEF 将时间序列数据(来自 DEF 或 CDEF)转换为单个值,并使用一些合并函数。

    例如,这组命令将使用之前定义的 MAX 和 MIN 类型的 DEF,然后使用 VDEF 计算它们的摘要。当然,您可以只使用 CPUTOTAL 而不是定义 CPUTOTALMAX 和 CPUTOTALMIN(为自己节省额外的 RRA),但是,当您转向使用较低粒度的 RRA 时,准确性会下降。如果您没有较低粒度的 RRA,那么您将是准确的,但会在图形时间使用大量额外的 CPU,并且图形创建会更慢。使用不同分辨率的 RRA 可以加快图形创建速度。

    DEF:CPUTOTAL=CPU.rrd:CPU_ALL:AVERAGE \ 
    DEF:CPUTOTALMAX=CPU.rrd:CPU_ALL:MAX \ 
    DEF:CPUTOTALMIN=CPU.rrd:CPU_ALL:MIN \ 
    VDEF:overallmax=CPUTOTALMAX,MAXIMUM \ 
    VDEF:overallmin=CPUTOTALMIN,MINIMUM \ 
    VDEF:overallavg=CPUTOTAL,AVG \ 
    VDEF:overalllst=CPUTOTAL,LAST \ 
    AREA:CPUTOTAL#FF0000:"CPU Used" \
    LINE2:CPUTOTAL#FF0000 \ 
    GPRINT:overallmax:"MAX\:%6.2lf %s" \ 
    GPRINT:overallmin:"MIN\:%6.2lf %s"  \ 
    GPRINT:overallavg:"MOY\:%6.2lf %s"  \ 
    GPRINT:overalllst:"LAST\:%6.2lf %s"  \
    GPRINT:overallmax:"Max was at %c":strftime
    

    最后一行将打印最大值的时间,而不是。当 VDEF 计算 MAX 或 MIN 时,它实际上返回两个分量 - 值和时间点。通常您使用该值,但通过将:strftime 附加到GPRINT 指令,您可以改用时间组件。

    我建议您花更多时间阅读 RRDTool Website 上的教程和示例,这将有助于您更好地了解 RRDTool 的工作原理。

    【讨论】:

    • 您好史蒂夫,感谢您对 RRA 使用一次的解释。我不知道它是这样工作的。而且对于您提供的代码=>准确性更好...但是您没有回答我的主要问题:如何获取最大值的时间并打印出来?
    • 当您使用 VDEF 获得最大值时,这也会获得该点的时间。然后,您可以使用 GPRINT:overallmax:%c:strftime 打印它(不是 :strftime 告诉 rrdtool 打印时间组件,而不是值组件)。我已经为此添加了答案。
    猜你喜欢
    • 2015-02-20
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多