以不规则的间隔向 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 服务器的延迟消息)我会尝试 运行 一些测试,当我有空的时候并报告任何重要的事情。
我想知道是否可以将以不规则间隔捕获的值存储到 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.
我发现了几个 posts
我有几个 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 服务器的延迟消息)我会尝试 运行 一些测试,当我有空的时候并报告任何重要的事情。