我试图找出是否可以将以不规则间隔捕获的值存储到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秒。
我找到了几篇帖子here和here,其中谈到了小心区间以及我的数据在写入RRD时可能会被平均,平滑或以其他方式搞乱的事实。但我在网上找到的任何东西都没有类似于我的使用情况,因此我很难知道我应该在哪里寻找。我希望将我的数据存储为收到的每条消息的点。
我有几个RRD的测试设置;一个是AVERAGE
,另一个是LAST
来制作一些图表。我的心跳设置为100秒,但间隔设置为1.我现在正在获取看起来正确的数据。我也猜测LAST
RRA中图中的空格是由于我的数据速度慢于每秒1次?
我会发布我的create
代码&输出作为答案。
答案 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
这使得这些漂亮的图表;
使用以下代码在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服务器的延迟消息)我会在我有空闲时间时尝试运行一些测试并报告任何重要的事情。