我试图在PHP的帮助下创建RRD图,以便跟踪服务器的接种物、外部设备和计数器。
到目前为止,脚本按预期的方式运行,但是当我试图生成两个或更多的独立图时,我的问题就出现了。我正在努力制作(每小时、每周等)图表。我认为通过创建一个循环可以解决我的问题,因为我已经在几个小时和几天内拆分了RRA。不幸的是,我最终得到了两个图,它们按预期同时更新,但绘制相同的东西。有没有遇到过类似的问题?我用RRD::Simple在perl中应用了相同的程序,这里非常容易,几乎所有东西都是自动调整的。

我在代码的一个工作示例中提供了尽可能少的数据,因为代码有点长:
<?php
$file = "snmp-2";
$rrdFile = dirname(__FILE__) . "/snmp-2.rrd";
$in = "ifInOctets";
$out = "ifOutOctets";
$count = "sysUpTime";
$step = 5;
$rounds = 1;
$output = array("Hourly","Daily");
while (1) {
sleep (6);
$options = array(
"--start","now -15s", // Now -10 seconds (default)
"--step", "".$step."",
"DS:".$in.":GAUGE:10:U:U",
"DS:".$out.":GAUGE:10:U:U",
"DS:".$count.":ABSOLUTE:10:0:4294967295",
"RRA:MIN:0.5:12:60",
"RRA:MAX:0.5:12:60",
"RRA:LAST:0.5:12:60",
"RRA:AVERAGE:0.5:12:60",
"RRA:MIN:0.5:300:60",
"RRA:MAX:0.5:300:60",
"RRA:LAST:0.5:300:60",
"RRA:AVERAGE:0.5:300:60",
);
if ( !isset( $create ) ) {
$create = rrd_create(
"".$rrdFile."",
$options
);
if ( $create === FALSE ) {
echo "Creation error: ".rrd_error()."\n";
}
}
$t = time();
$ifInOctets = rand(0, 4294967295);
$ifOutOctets = rand(0, 4294967295);
$sysUpTime = rand(0, 4294967295);
$update = rrd_update(
"".$rrdFile."",
array(
"".$t.":".$ifInOctets.":".$ifOutOctets.":".$sysUpTime.""
)
);
if ($update === FALSE) {
echo "Update error: ".rrd_error()."\n";
}
$start = $t - ($step * $rounds);
foreach ($output as $test) {
$final = array(
"--start","".$start." -15s",
"--end", "".$t."",
"--step","".$step."",
"--title=".$file." RRD::Graph",
"--vertical-label=Byte(s)/sec",
"--right-axis-label=latency(min.)",
"--alt-y-grid", "--rigid",
"--width", "800", "--height", "500",
"--lower-limit=0",
"--alt-autoscale-max",
"--no-gridfit",
"--slope-mode",
"DEF:".$in."_def=".$file.".rrd:".$in.":AVERAGE",
"DEF:".$out."_def=".$file.".rrd:".$out.":AVERAGE",
"DEF:".$count."_def=".$file.".rrd:".$count.":AVERAGE",
"CDEF:inbytes=".$in."_def,8,/",
"CDEF:outbytes=".$out."_def,8,/",
"CDEF:counter=".$count."_def,8,/",
"COMMENT:\\n",
"LINE2:".$in."_def#FF0000:".$in."",
"COMMENT:\\n",
"LINE2:".$out."_def#0000FF:".$out."",
"COMMENT:\\n",
"LINE2:".$count."_def#FFFF00:".$count."",
);
$outputPngFile = rrd_graph(
"".$test.".png",
$final
);
if ($outputPngFile === FALSE) {
echo "<b>Graph error: </b>".rrd_error()."\n";
}
} /* End of foreach function */
$debug = rrd_lastupdate (
"".$rrdFile.""
);
if ($debug === FALSE) {
echo "<b>Graph result error: </b>".rrd_error()."\n";
}
var_dump ($debug);
$rounds++;
} /* End of while loop */
?>发布于 2014-05-11 09:25:38
几个问题。
首先,RRD的定义有5秒的步骤,RRAs的步骤是12x5s=1min和300x5s=25min。它们的长度也只有60行,因此它们分别只有1小时和25小时。这样你就永远得不到每周的图表了!您需要添加更多的行;而且这一步看起来相当短,您可能需要一个小时图的较小步骤RRA,对于每周图可能需要一个更大的步骤RRA。
其次,还不清楚如何调用图函数。您似乎是在具体说明:
"--start","".$start." -15s",
"--end", "".$t."",
"--step","".$step."",..。这将迫使它使用5s间隔(不可用,因此1分钟总是会被使用),而图形只适用于从开始到最后更新的时间窗口,而不是您所要求的“每小时”或“每日”。
请注意,您定义的RRA没有定义您所要求的图形的时间窗口。此外,仅仅因为定义了多个RRA,并不意味着您将得到多个图,除非oyu用不同的参数两次调用图函数。
如果您想要每日图表,请使用
"--start","end - 1 hour",
"--end",$t,不要指定一个步骤,因为无论如何都将使用最合适的可用步骤。对于每日图表,请使用
"--start","end - 1 day"
"--end",$t,同样,不需要指定步骤。
希望这能让事情变得更清楚一些。大多数RRD图形选项都有合理的默认值,而且RRDTool非常擅长根据图形大小、时间窗口和DEF语句选择要使用的正确RRA。
https://stackoverflow.com/questions/23587681
复制相似问题