0

我正在尝试在 PHP 的帮助下创建 RRD 图,以跟踪服务器的 inoctets、outoctets 和计数器。

到目前为止,脚本按预期运行,但是当我尝试生成 2 个或更多单独的图表时,我的问题就出现了。我正在尝试制作(每小时、每周等)图表。我认为通过创建一个循环可以解决我的问题,因为我已将 RRA 拆分为数小时和数天。不幸的是,我最终得到了 2 个按预期同时更新但绘制相同内容的图表。有没有人遇到过类似的问题?我在 perl 中使用 RRD::Simple 应用了相同的程序,其中非常简单,几乎所有内容都是自动调整的。

图形输出

我在我的代码的一个工作示例下提供了尽可能少的数据,因为代码有点长:

<?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 */

?>
4

1 回答 1

1

几个问题。

首先,您对 RRD 的定义的步长为 5 秒,RRA 的步长为 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。

于 2014-05-11T09:25:38.170 回答