以不规则的间隔向 RRD 写入数据

Write data to an RRD at irregular intervals

我想知道是否可以将以不规则间隔捕获的值存储到 RRD 中。

我有一个连接到订阅 queue 或主题的 ActiveMQ 服务器的脚本,并查看消息 header 时间戳,将其与 Time.now 进行比较,给我一个三角洲。

我从脚本中得到的数据如下;

000000.681 Time Delta
000000.793 Time Delta
000000.583 Time Delta
000001.994 Time Delta

我面临的问题是,来自 ActiveMQ 的消息不一定以 'regular interval'(例如 1/秒、1/2 秒)的速度传入,它们可能在高峰时间以每秒 5 次的速度传入,每 10 秒 1 次。

我希望能够将输出捕获到 RRD 中,这样我就可以根据它绘制图表,但是在互联网上四处看看,不清楚是否可以这样做,或者我是否会更好使用 a.n.other database/store 将数据捕获到。

我想要的最终输出是显示每条消息的时间增量的图表。

看来我可以使用 --step 将 RRD 设置为 1 秒,而哈特在读取 docs.

后跳动到 2 秒

我发现了几个 posts and here,它们谈到要小心间隔以及我的数据在写入 RRD 时可能会被平均、平滑或以其他方式弄乱的事实。但是我在网上找到的任何东西都没有与我的相似的用例,所以很难知道我应该去哪里找。我希望我的数据存储为收到的每条消息的点。

我有几个 RRD 的测试设置;一个正在使用 AVERAGE 另一个正在使用 LAST 来生成一些图表。我的心跳设置为 100 秒,但间隔设置为 1。我现在正在获取 看起来 正确的数据。我还猜测来自 LAST RRA 的图表中的空白是由于我的数据以每秒 1 个的速度传输的速度变慢?

我会 post 我的 create 代码并输出作为答案。

rrdtool 将始终定期存储数据。当数据被移交给 rrdtool 时,它首先被重新采样到 --step 间隔。然后进一步合并到 RRA 中的间隔设置。

重新采样时会考虑数据的准确到达时间(精确到毫秒)...

如果两个数据点之间的距离比 mrhb 指定的更远,则数据被认为是不连续的,rrdtool 将存储 'unknown' 受影响的间隔。

我最终制作了两套 RRD 进行试验;

rrdtool create test1.rrd \
--step '1' \
'DS:ds0:GAUGE:5:0:U' \
'RRA:AVERAGE:0.5:1:86400' \
'RRA:MAX:0.5:1:86400' \
'RRA:AVERAGE:0.5:60:10080' \
'RRA:MAX:0.5:60:10080' \
'RRA:AVERAGE:0.5:120:21600' \
'RRA:MAX:0.5:120:21600' \
'RRA:AVERAGE:0.5:300:105120' \
'RRA:MAX:0.5:300:105120'

rrdtool create test.rrd \
--step '1' \
'DS:ds0:GAUGE:5:0:U' \
'RRA:AVERAGE:0.5:1:86400' \
'RRA:LAST:0.5:1:86400' \
'RRA:AVERAGE:0.5:60:10080' \
'RRA:LAST:0.5:60:10080' \
'RRA:AVERAGE:0.5:120:21600' \
'RRA:LAST:0.5:120:21600' \
'RRA:AVERAGE:0.5:300:105120' \
'RRA:MAX:0.5:300:105120'

允许我存储;

1sec, archive is kept for 1day back
1min, archive is kept for 7day back
2min, archive is kept for 30day back
5min, archive is kept for 1year back

制作这些漂亮的图表;

在 PHP 中使用以下代码制作的图表;

<?php
  $opts = array( 
                '--width', '600',
                '--height', '100',
                '--title', 'Avg Time Delta xxxxxxxxxx (Last 1 Hr)',
                '--vertical-label', 'Time Delta',
                '--watermark', 'xxxxxxxxxx',
                '--start', 'end-1h',
                'DEF:out=test.rrd:ds0:AVERAGE',
                'DEF:max=test.rrd:ds0:MAX',
                'AREA:out#9966FF:Avg Time Delta',
                'LINE:max#996600:Max Time Delta',
               );

  $ret = rrd_graph("graphs/1hr-graph.png", $opts);

  if( !is_array($ret) )
  {
    $err = rrd_error();
    echo "rrd_graph() ERROR: $err\n";
  }
        echo '<img src="http://server/graphs/1hr-graph.png">';
        echo '<BR>';    
?>

<?php
  $opts = array( 
                '--width', '600',
                '--height', '100',
                '--title', 'Last Time Delta xxxxxxxxxx (Last 1 Hr)',
                '--vertical-label', 'Time Delta',
                '--watermark', 'xxxxxxxxxx',
                '--start', 'end-1h',
                'DEF:avg=test1.rrd:ds0:AVERAGE',
                'DEF:last=test1.rrd:ds0:LAST',
                'AREA:avg#99AAFF:Avg Time Delta',
                'LINE:last#99AA00:Last Time Delta',
               );

  $ret = rrd_graph("graphs/1hr-last.png", $opts);

  if( !is_array($ret) )
  {
    $err = rrd_error();
    echo "rrd_graph() ERROR: $err\n";
  }
        echo '<img src="http://server/graphs/1hr-last.png">'
?>

根据我自己的健全性检查和实时观察数据,这两个图表看起来都是正确的,但表现方式略有不同。当它正在监视的数据馈送相当大并且我每 10 秒只收到 1 条消息时,我在 LAST 图表中得到很多空白,而 AVERAGE 图表被平滑以填补空白.我还尝试将另一个 RRD 设置为 ABSOLUTE,但该图表看起来 'wrong' 并且时间都低于 1.0.

所以看起来我可以从我的脚本中以我喜欢的任何时间间隔提供我的 RRD。看起来 RRD 将按其定义的间隔(在我的情况下为 1 秒)对我的数据进行采样,然后根据我保存它的方式(仪表、绝对等)执行它需要做的事情,我的心跳设置为 100 我应该总是在 100 秒超时之前收到一些数据 - 从而避免 NAN 我的数据库中的条目。

目前我无法判断这个配置在中断期间的表现如何(例如来自 AMQ 服务器的延迟消息)我会尝试 运行 一些测试,当我有空的时候并报告任何重要的事情。