2011年3月16日水曜日

rrdtool graph 系コマンドを出力させるツール


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"