rrdのフロントエンドにはcactiなどを使うのが一般的だろうか。
ただし、フロント側のアプリケーションを利用できない環境で、
グラフがどう描画されるのかをさしあたり確認する必要に迫られることがある。
そういう時に、ぱっとコマンドを実行できればいいのだが、
rrdtoolはコマンドのオプションは豊富で、なかなか一筋縄ではいかない。
ということで、打つべき"rrdtool graph ~"系コマンドを出力させるためのツールを用意した。
モジュールを使ってもいいのだが、rrdtoolコマンドを純粋に出力させて打ちたかったため、
少々力技で対応させている。
コード内で任意の変数になっている個所は"$str"である。
この変数内でグラフの書式の指定をしている。
変数ではなく、外部ファイルにしてしまうのもありだろう。
◆ コード
#!/usr/bin/ruby
require 'yaml'
$str = <<END
imgformat: PNG
start: now-1m
end: now
title: memory
width: 800
height: 300
lower-limit: 0
base: 1024
DEF:
- DEF:alias0=./memory_used.rrd:ds:AVERAGE
- DEF:alias1=./memory_free.rrd:ds:AVERAGE
- DEF:alias2=./memory_shared.rrd:ds:AVERAGE
- DEF:alias3=./memory_buffers.rrd:ds:AVERAGE
- DEF:alias4=./memory_cached.rrd:ds:AVERAGE
TYPE:
- AREA:alias0#0000FF:used
- STACK:alias1#FF0000:free
- STACK:alias2#008000:shared
- STACK:alias3#008000:buffers
- STACK:alias4#008000:cached
GPRINT:
- GPRINT:alias0:AVERAGE:"avg\\:%8.2lf %S\\n\"
- GPRINT:alias1:AVERAGE:"avg\\:%8.2lf %S\\n\"
- GPRINT:alias2:AVERAGE:"avg\\:%8.2lf %S\\n\"
- GPRINT:alias3:AVERAGE:"avg\\:%8.2lf %S\\n\"
- GPRINT:alias4:AVERAGE:"avg\\:%8.2lf %S\\n\"
END
class Graph
def initialize()
@path = "/var/www/html/test"
end
def load()
YAML.load_documents($str) do |elem|
@imgformat = elem['imgformat']
@title = elem['title']
@start = elem['start']
@end = elem['end']
@width = elem['width']
@height = elem['height']
@lower_limit = elem['lower-limit']
@base = elem['base']
@graph_type = elem['graph_type']
@DEF = elem['DEF']
@TYPE = elem['TYPE']
@GPRINT = elem['GPRINT']
end
@png = "#{@path}/#{@title}.png"
end
def params()
@parameter = "\\" + "\n" \
"--imgformat #{@imgformat} " + "\\" + "\n" \
"--title #{@title} " + "\\" + "\n" \
"--start #{@start} " + "\\" + "\n" \
"--end #{@end} " + "\\" + "\n" \
"--width=#{@width} " + "\\" + "\n" \
"--height=#{@height} " + "\\" + "\n" \
"--lower-limit=#{@lower_limit} " + "\\" + "\n" \
"--base=#{@base}"
end
def command()
line = ''
for i in 0..@DEF.length-1
line_def = @DEF[i]
line_type = @TYPE[i]
line_gprint = @GPRINT[i]
line = line + " \\" + "\n" + \
line_def + " \\" + "\n" + \
line_type + " \\" + "\n" + \
line_gprint
end
command = "rrdtool graph #{@png} #{@parameter} #{line}"
puts command
system(command)
end
end
graph = Graph.new
graph.load()
graph.params()
graph.command()
◆ 実行する
実行すると、下記のように出力される。
rrdtool graph /var/www/html/test/memory.png \
--imgformat PNG \
--title memory \
--start now-1y \
--end now \
--width=800 \
--height=300 \
--lower-limit=0 \
--base=1024 \
DEF:alias0=/var/rrd/gyoumu/new-katsuo/memory_used.rrd:memory_used:AVERAGE \
AREA:alias0#0000FF:used \
GPRINT:alias0:AVERAGE:"avg\:%8.2lf %S\n" \
DEF:alias1=/var/rrd/gyoumu/new-katsuo/memory_free.rrd:memory_free:AVERAGE \
STACK:alias1#FF0000:free \
GPRINT:alias1:AVERAGE:"avg\:%8.2lf %S\n" \
DEF:alias2=/var/rrd/gyoumu/new-katsuo/memory_shared.rrd:memory_shared:AVERAGE \
STACK:alias2#008000:shared \
GPRINT:alias2:AVERAGE:"avg\:%8.2lf %S\n" \
DEF:alias3=/var/rrd/gyoumu/new-katsuo/memory_buffers.rrd:memory_buffers:AVERAGE \
STACK:alias3#008000:buffers \
GPRINT:alias3:AVERAGE:"avg\:%8.2lf %S\n" \
DEF:alias4=/var/rrd/gyoumu/new-katsuo/memory_cached.rrd:memory_cached:AVERAGE \
STACK:alias4#008000:cached \
GPRINT:alias4:AVERAGE:"avg\:%8.2lf %S\n"