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

时间:2016-07-29 19:58:39

标签: rrdtool rrd

我试图找出是否可以将以不规则间隔捕获的值存储到RRD中。

我有一个连接到ActiveMQ服务器的脚本订阅队列或主题,并查看邮件标题时间戳,将其与Time.now进行比较以给我一个增量。

我从我的脚本获得的数据如下;

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

我面临的问题是来自ActiveMQ的消息不一定以“常规间隔”(例如1 / sec,1 / 2sec)进入。它们可能在高峰时间进入5秒,而且很多时候每10秒钟1次。

我希望能够将输出捕获到RRD中,以便我可以反对它,但在互联网上浏览一下,目前尚不清楚这是否可以完成,或者如果我最好使用其他数据库/存储将数据捕获到。

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

看起来我可以使用--step将RRD设置为1秒,并且在读取了docs时,哈特值达到2秒。

我找到了几篇帖子herehere,其中谈到了小心区间以及我的数据在写入RRD时可能会被平均,平滑或以其他方式搞乱的事实。但我在网上找到的任何东西都没有类似于我的使用情况,因此我很难知道我应该在哪里寻找。我希望将我的数据存储为收到的每条消息的点。

我有几个RRD的测试设置;一个是AVERAGE,另一个是LAST来制作一些图表。我的心跳设置为100秒,但间隔设置为1.我现在正在获取看起来正确的数据。我也猜测LAST RRA中图中的空格是由于我的数据速度慢于每秒1次?

我会发布我的create代码&输出作为答案。

2 个答案:

答案 0 :(得分:2)

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

在重新采样时,会考虑数据的准确到达时间(以毫秒为单位)......

如果两个数据点比mrhb指定的更远,则数据被认为是非连续的,rrdtool将存储“未知”数据。对于受影响的间隔。

答案 1 :(得分:1)

我最终制作了两套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

这使得这些漂亮的图表;

1 Hour Average & Max 1 Hour Average & Last

使用以下代码在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个mesg时,我会在LAST图表中获得大量空白,而AVERAGE图表会被平滑以填充缺口。我还尝试将另一个RRD设置为ABSOLUTE,但其中的图表看起来是错误的&#39;时间都低于1.0。

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

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