2014-05-16 6 views
0

enter image description here rrd 그래프를 생성하고 있는데 2 가지 문제가 있습니다.php RRD 정수 대신 부동 값 그래프 표시

문제 1 : 인쇄 할 때 소수점이없는 정수입니다. 인쇄 할 때 소수점이 나타납니다. 정말 혼란 스럽습니다. 그래서 rrdgraph_graph에서 온라인으로 보았습니다. 올바른 구문을 사용하고 있지만 계산을 적용하지 않고 있지만 여전히 정수 대신 부동 값을 얻습니다. 공식 웹 사이트에 따르면

는 : %s place this after %le, %lf or %lg. This will be replaced by the appropriate SI magnitude unit and the value will be scaled accordingly (123456 -> 123.456 k).

I 출력의 샘플로 사진을 첨부했다. 또한 RRD가 가능한 오류를 볼 수 있음을 이해하면 작업 예제 코드를 제공합니다.

문제 2 : 그래프에 VRULE:time#color[:legend][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]] 함수를 추가하려고 시도하고 온라인 지침에 따라 시간을 제공 할 수 있습니다. 그래프가 바뀌고 있기 때문에 1800 초 (가치)를 할 계획이었습니다. 그래프 중간에 세로선을 배치하여 30 분 값의 평균을 볼 수있었습니다. 나는 그런 형식을 신청하는 경우이 오류를 얻을 :

<b>Graph error: </b>parameter '1400274668-1800' does not represent time in line VRULE:1400274668-1800#0000CD:Half way values

내가 빼기 모든 작업 벌금을 제거합니다. 그래프의 중간에이 선을 만드는 방법이 있습니까?

<?php 

$file = "snmp"; 
$rrdFile = dirname(__FILE__) . "/".$file.".rrd"; 
$in = "losses"; 
$png = "/home/linux/Desktop/"; 
$in_min = "vdef_in_min"; 
$in_max = "vdef_in_max"; 
$in_lst = "vdef_in_lst"; 
$in_av = "vdef_in_av"; 
$title = "Losses RRD::Graph"; 
$output = array("1h","1d"); 
$step = 5; 
$heartbeat = 2 * $step; 

while (1) { 
    sleep (1); 

    $options = array(
      "--start","now -15s", 
      "--step", "".$step."", 
      "DS:".$in.":GAUGE:".$heartbeat.":0:U", 
      "RRA:LAST:0.5:1:3600", 
      "RRA:MIN:0.5:1:3600", 
      "RRA:MAX:0.5:1:3600", 
      "RRA:AVERAGE:0.5:6:600", 
      "RRA:LAST:0.5:300:288", 
      "RRA:MIN:0.5:300:288", 
      "RRA:MAX:0.5:300:288`", 
      "RRA:AVERAGE:0.5:600:144" 
      ); 

    if (!isset($create)) { 

    $create = rrd_create(
       "".$rrdFile."", 
       $options 
      ); 

    if ($create === FALSE) { 
     echo "Creation error: ".rrd_error()."\n"; 
    } 
    } 

    $t = time(); 
    $losses = rand(0, 150); 

    $update = rrd_update(
       "".$rrdFile."", 
       array(
       "".$t.":".$losses."" 
       ) 
       ); 

    if ($update === FALSE) { 
    echo "Update error: ".rrd_error()."\n"; 
    } 

    date_default_timezone_set('Europe/Stockholm'); 
    $timezone = new DateTime(NULL, new DateTimeZone('Europe/Stockholm')); 
    $date = date('l jS \of F Y h\\:i\\:s A' , $timezone->format('U')); 
    $comment = "RRD last updated:".$date; 
    $comment = str_replace(":", "\\:", $comment); 
    $graph = "Graph last updated:".$date; 
    $graph = str_replace(":", "\\:", $graph); 

    foreach ($output as $test) { 

    $final = array(
      "--start","end - ".$test."", 
      "--end", "".$t."", 
      "--title=".$file." RRD::Graph with - ".$test." Periods", 
      "--vertical-label=Bytes(s)/sec", 
      "--right-axis-label=latency(ms)", 
      "--alt-y-grid", "--rigid", 
      "--width", "800", "--height", "500", 
      "--lower-limit=0", 
      "--no-gridfit", 
      "--slope-mode", 
      "DEF:".$in."_def=".$file.".rrd:".$in.":LAST", 
      "CDEF:inbytes=".$in."_def", 
      "VDEF:".$in_lst."=inbytes,LAST", 
      "VDEF:".$in_min."=inbytes,MINIMUM", 
      "VDEF:".$in_max."=inbytes,MAXIMUM", 
      "VDEF:".$in_av."=inbytes,AVERAGE", 
      "COMMENT:\\n", 
      "LINE2:".$in."_def#FF0000:".$in."", 
      "GPRINT:".$in_min.": Minimum\:%6.2lf %S", 
      "GPRINT:".$in_max.":Maximum\:%6.2lf %S", 
      "GPRINT:".$in_lst.":Last\:%6.2lf %s", 
      "GPRINT:".$in_av.":Average\:%6.2lf %s", 
      "COMMENT:\\n", 
      "VRULE:".$t."#0000CD:Half way values", 
      "COMMENT:\\n", 
      "HRULE:50#FFFF00:Maximum value", 
      "COMMENT:\\n", 
      "COMMENT: ", 
      "COMMENT:\\n", 
      "COMMENT:".$comment."\\r", 
      "COMMENT:".$graph."\\r" 
      ); 

    $outputPngFile = rrd_graph(
        "".$png."".$test.".png", 
        $final 
        ); 

    if ($outputPngFile === FALSE) { 
     echo "<b>Graph error: </b>".rrd_error()."\n"; 
    } 

    } 

    $debug = rrd_lastupdate (
       "".$rrdFile."" 
       ); 

    if ($debug === FALSE) { 
    echo "<b>Graph result error: </b>".rrd_error()."\n"; 
    } 

    var_dump ($debug); 
} 

?> 

답변

1

첫 번째 문제에 대한 답은 거의 데이터 정규화입니다. 매번 단계 경계에서 RRD를 정확하게 업데이트하지 않으므로 제출 된 데이터 값이 단계 경계로 정규화되어 10 진수 값이됩니다. 이를 이해하려면 주제에 Alex van den Bogeardt's excellent article을 읽어보십시오.

두 번째 문제점은 단순히 VRULE 선언을 이런 방식으로 사용할 수 없다는 것입니다. VRULE의 첫 번째 매개 변수는 숫자 또는 VDEF 변수 일 수 있지만 수식 일 수는 없습니다. 따라서 VRULE:vdefname#FF00FF:Bar과 마찬가지로 VRULE:12345678#0000CD:Foo이 좋습니다. 그러나 VRULE:123456-123#0000CD:No을 사용할 수 없습니다. 다음과 같이 계산을 수행하십시오.

"VRULE:".($t-1800)."#0000CD:Half way values", 

... 올바른 구문을 사용해야합니다.

+0

더 많은 정보를 읽고 이해하기 위해 정보를 제공해 주셔서 감사합니다. 모든 것이 더 의미가 있기 시작합니다 ... 시간과 노력에 감사드립니다. 이것은 많은 사람들이 그것에 대해 많이 알지 못하는 후방 주제입니다. – thanos