お時間と労力をいただきありがとうございます。これは、PHP と RRD を使用した最初のスクリプトです。SNMP 用の短いプログラムを書いているときに、グラフィカルな出力のための強力なツールである RRD に出会いました。グラフの出力を模倣する短い操作スクリプトを作成しようとしました。公式ページから RRD に関するドキュメントを可能な限り読み、PHP コードに追加しようとしました。コードをデバッグしようとしているときに、データが正常に受信され、期待どおりに参照されていることを示すいくつかの関数を見つけました。以下で提供されるサンプル:
["last_update"]=>
int(1396917542)
["ds_cnt"]=>
int(3)
["ds_navm"]=>
array(3) {
[0]=>
string(10) "ifInOctets"
[1]=>
string(11) "ifOutOctets"
[2]=>
string(9) "sysUpTime"
}
["data"]=>
array(3) {
[0]=>
string(4) "1405"
[1]=>
string(4) "1219"
[2]=>
string(4) "1893"
}
}
機能に基づく:
"$debug = rrd_lastupdate (
"".$rrdFile.""
);"
入力が正しく行われ、コードのコンパイル中に出力エラーが表示されないため、理解するのが難しいのですが、なぜ出力が得られないのですか?
可能な再現とエラーの理解を深めるために、作業コードを例として含めました。
<?php
// rrdtool info /var/www/snmp.rrd Debugging command
while (1) {
sleep (1);
$file = "snmp";
$rrdFile = dirname(__FILE__) . "/".$file.".rrd";
$in = "ifInOctets";
$out = "ifOutOctets";
$count = "sysUpTime";
$options = array(
"--start","now -10s", // Now -10 seconds (default)
"--step", "10", // Step size of 300 seconds 5 minutes
"DS:".$in.":COUNTER:20:U:U",
"DS:".$out.":COUNTER:20:U:U",
"DS:".$count.":COUNTER:20:U:U",
/* DS:ds-name:DST:dst arguments
(DST: GAUGE, COUNTER, DERIVE, and ABSOLUTE):heartbeat:min:max
heartbeat: in case that there is not input up to 600 seconds
then the input will characterised as undefined (blank)
Based on Nyquist rate (Fs >= 2 * Fmax) 300 (step) 600 (heartbeat)
32-bit = 2^32-1 = 4294967295 (counter ticks)
64-bit = 2^64-1 = 18446744073709551615 (counter ticks)
64-bit counter (caution!!!) different oid's
*/
"RRA:MIN:0.5:10:300",
"RRA:MIN:0.5:20:600",
"RRA:MAX:0.5:10:300",
"RRA:MAX:0.5:20:600",
"RRA:AVERAGE:0.5:10:300",
"RRA:AVERAGE:0.5:20:600",
/* RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
xff range: 0-1 (exclusive) defines the allowed number of unknown
*UNKNOWN* PDPs to the number of PDPs in the interval. Step defines
how many of those data points are used to build consolidated data.
rows defines how many data values are kept in an RRA.
*/
);
//create rrd file
$create = rrd_create(
"".$rrdFile."",
$options
);
if ($create === FALSE) {
echo "Creation error: ".rrd_error()."\n";
}
$ifInOctets = rand(0, 1500); // ifInOctets (OID: 1.3.6.1.2.1.2.2.1.10)
$ifOutOctets = rand(0, 2500); // ifOutOctets (OID: 1.3.6.1.2.1.2.2.1.16)
$sysUpTime = rand(0, 2000); // sysUpTime (OID: 1.3.6.1.2.1.1.3)
$t = time();
//update rrd file
$update = rrd_update(
"".$rrdFile."",
array(
/* Update database with 3 values
based on time now (N:timestamp) */
"".$t.":".$ifInOctets.":".$ifOutOctets.":".$sysUpTime.""
)
);
if ($update === FALSE) {
echo "Update error: ".rrd_error()."\n";
}
$start = "now";
$title = "Hourly Server Data";
$final = array(
"--start","".$start." -10s",
"--step","10",
"--title=".$title."",
"--vertical-label=Bytes/sec",
"--lower-limit=0",
//"--no-gridfit",
"--slope-mode",
//"--imgformat","EPS",
"DEF:".$in."_def=".$file.".rrd:".$in.":AVERAGE",
"DEF:".$out."_def=".$file.".rrd:".$out.":AVERAGE",
"DEF:".$count."_def=".$file.".rrd:".$count.":AVERAGE",
"CDEF:inbits=".$in."_def,8,*",
"CDEF:outbits=".$out."_def,8,*",
"CDEF:counter=".$count."_def,8,*",
/* "VDEF:".$in_min."=inbits,MINIMUM",
"VDEF:".$out_min."=outbits,MINIMUM",
"VDEF:".$in_max."=inbits,MAXIMUM",
"VDEF:".$out_max."=outbits,MAXIMUM",
"VDEF:".$in_av."=inbits,AVERAGE",
"VDEF:".$out_av."=outbits,AVERAGE", */
"COMMENT:\\n",
"LINE:".$in."_def#FF00FF:".$in."",
"GPRINT:inbits:LAST:last \: %6.2lf %SBps",
"COMMENT:\\n",
"LINE:".$out."_def#0000FF:".$out."",
"GPRINT:outbits:LAST:last \: %6.2lf %SBps",
"COMMENT:\\n",
"LINE:".$count."_def#FFFF00:".$count."",
"GPRINT:counter:LAST:last\: %6.2lf %SBps",
"COMMENT:\\n",
);
// graph output
$outputPngFile = rrd_graph(
"".$file.".png",
$final
);
if ($outputPngFile === FALSE) {
echo "<b>Graph error: </b>".rrd_error()."\n";
}
/* Returns the first data sample from the
specified RRA of the RRD file. */
$result = rrd_first (
$rrdFile,
$raaindex = 0
);
if ($result === FALSE) {
echo "<b>Graph result error: </b>".rrd_error()."\n";
}
/* Returns the UNIX timestamp of the most
recent update of the RRD database. */
$last = rrd_last (
$rrdFile
);
if ($last === FALSE) {
echo "<b>Graph result error: </b>".rrd_error()."\n";
}
$info = rrd_info (
"".$rrdFile.""
);
if ($info === FALSE) {
echo "<b>Graph result error: </b>".rrd_error()."\n";
}
/* Gets array of the UNIX timestamp and the values stored
for each date in the most recent update of the RRD database file. */
$debug = rrd_lastupdate (
"".$rrdFile.""
);
if ($debug === FALSE) {
echo "<b>Graph result error: </b>".rrd_error()."\n";
}
var_dump ($debug);
/* $version = rrd_version ( );
echo "This is the version ".$version."\n"; */
} // End of while condition
?>