2014-05-11 2 views
0

나는 서버의 inoctets, outoctets 및 카운터를 추적하기 위해 PHP의 도움으로 RRD 그래프를 작성하려고합니다.PHP RRD 그래프 분리

지금까지 스크립트는 예상대로 작동하지만 두 개 이상의 개별 그래프를 생성하려고 할 때 문제가 발생합니다. 나는 (시간별, 주별, 등) 그래프를 생산하려고합니다. 나는 RRA를 여러 시간과 수일로 나누었 기 때문에 루프를 작성하여 내 문제를 해결할 수 있다고 생각했습니다. 불행하게도 나는 예상대로 동시에 업데이트하지만 동일한 것을 플로팅하는 2 개의 그래프를 갖게된다. 어떤 사람이 비슷한 문제를 겪었습니까? RRD :: Simple을 사용하여 동일한 프로그램을 Perl에 적용했습니다.이 프로그램은 매우 쉽고 모든 것이 거의 자동으로 조정됩니다.

Graph Output

코드가 긴 조금이기 때문에 최소 가능한 데이터 내 코드의 작동 예를 아래에 공급하고 있습니다 : 문제의

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

?> 

답변

1

몇.

첫 번째로, RRD의 정의는 12 초 5 초 = 1 분 및 300x5 초 = 25 분의 단계로 5 초 및 RRA 단계를가집니다. 그들은 또한 단지 60 행의 길이, 그래서 각각 1 시간과 25 시간 있습니다. 이런 식으로 주간 그래프를 얻지 못할 것입니다! 더 많은 행을 추가해야합니다. 또한 단계가 다소 짧아 보입니다. 시간별 그래프에는 작은 단계 RRA가 필요하고 주간 그래프에는 큰 단계별 RRA가 필요할 수 있습니다.

둘째, 그래프 함수를 호출하는 방법이 명확하지 않습니다. 당신은 지정 것으로 보인다 :합니다 (1 분 하나가 항상 익숙해 질 것이다, 그래서 사용할 수없는)을 5 초 간격을 사용하도록 강제 그래프 만의 시간 창을 위해 일하기위한 것이다

"--start","".$start." -15s", 
"--end", "".$t."", 
"--step","".$step."", 

... 당신이 묻는 것처럼 '매시간'이나 '매일'이 아니라 마지막 업데이트로 시작하십시오.

정의한 RRA는 요청한 그래프의 시간 창을 정의하지 않습니다. 또한, 하나 이상의 RRA가 정의 되었기 때문에, oyu가 다른 인수로 그래프 함수를 두 번 호출하지 않으면 하나 이상의 그래프를 얻을 수 없다는 것을 의미하지는 않습니다.

당신이 매일 그래프를 원하는 경우

어쨌든 사용될 수있는 가장 적절한 단계를 지정하지 마십시오
"--start","end - 1 hour", 
"--end",$t, 

를 사용합니다. 일일 그래프의 경우 사용

"--start","end - 1 day" 
"--end",$t, 

마찬가지로 단계를 지정하지 않아도됩니다.

이렇게하면 조금 더 명확 해집니다. RRD 그래프 옵션의 대부분은 적절한 기본값을 가지고 있으며 RRDTool은 그래프 크기, 시간 창 및 DEF 문을 기반으로 올바른 RRA를 선택하는 데 매우 적합합니다.

+0

즉각적인 답장을 보내 주셔서 감사합니다. foreach() 함수를 통해 서로 다른 인수를 가진 두 개의 그래프를 만들고 있습니다. 나는 시간별 그래프와 일일 그래프 "end - 1d"에''end - 1h "'을 설정하여 지침을 따라 갔다. 나는 $ it = time()과 $ rounds = 1 ++;를 반복 할 때마다'$ start = $ t - ($ step * $ rounds);를 지정했다. 그 이유는이 모든 매개 변수를 지정하지 않고서는 "--start", "now", 그러나 "--end", "$ t - 1h"를 사용하여 그래프를 가져올 수 없다는 것을 알게되었습니다. "''and''--end", "$ t - 1d"'그것이 작동하지 않는 것 같습니다. 빈 그래프입니다. – thanos

+0

이전 의견에 죄송합니다.''--start ","end - 1 hour ", "--end ", $ t,' 및 '"--start ","end - 1day " "--end ", $ t, ' 나는 당신의 지시를 따르고 완벽하게 일했습니다! 와우, 당신은 RRD를 정말로 알고 있습니다. 음, 상관 없으면 몇 가지 추가 사항을 물어볼 필요가 있습니다. 지속적인 질문에 대해 유감스럽게 생각하지만 실제로 무엇을하고 있는지 알 것 같습니다. 당신은 시간 단계별로 더 작은 단계를 지정해야한다고 말했고 나는 현재 5 단계와 RRA : AVERAGE : 0.5 : 12 : 60 "행 60으로 설정했습니다. 1 시간 그래프에는 좋은 구성이라고 생각했습니다. 어떤 추천? – thanos