この頃はGraphiteやらInfluxDBがrrdtoolに取って代わられつつあるんでしょうが、rrdtoolのコマンド引数はいじってみると意外と楽しいものです(人によりますが)。このあいだ
"rrdtool 誰が一番かっこいいグラフ描けるか選手権"
— 桝原翔市 (@shoichimasuhara) April 4, 2014
とか思いつきで言いましたが、とりあえず序の口というか前座というか、とりあえずやって見るだけやってみようと思います
MRTG
とりあえず書くならこんな感じ
MRTGのグラフを彷彿とさせますね。コマンドラインはこちら
rrdtool graph shoichi.example.com_loadavg5_1.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ AREA:value1#00FF00:"loadavg5" \
shoichi.example.com_loadavg5.rrd というファイルのvalueというカラムのAVERAGEをvalue1に定義してAREAで書いた、です。LINE1にするとこんな感じ
< AREA:value1#00FF00:"loadavg5" \ --- > LINE1:value1#00FF00:"loadavg5" \
普通ですね。ところで負荷600ってなんやねん、ってのはたしかSNMPの事情だったはずなので0.01かけておきましょう
rrdtool graph shoichi.example.com_loadavg5_3.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ CDEF:value2=value1,0.01,* \ AREA:value2#00FF00:"loadavg5" \
CDEFでvalue1に0.01をかけてvalue2を定義、AREAで表示としてみました。
ナウなヤングにバカウケなカラー
rrdtool graphには
[-c|--color COLORTAG#rrggbb[aa]]
RRDtool - rrdgraph
というオプションがありまして、これで色を変えれるんですが、サンプルが無いのでサンプル一覧を作りました。赤い部分が該当COLORTAGなんですが、わかりますかね?
ARROW | 軸の矢印 | |
---|---|---|
AXIS | 軸の色 | |
BACK | 背景 | |
CANVAS | グラフ内側の背景 | |
FONT | フォント | |
FRAME | 凡例の枠 | |
GRID | グリッド | |
MGRID | Mグリッド | |
SHADEA | 影A | |
SHADEB | 影B |
これを踏まえてkibanaとかのような厨2ごころをくすぐるような感じにしてみ…たつもり。こんなんどうですか
rrdtool graph shoichi.example.com_loadavg5_5.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ --color FONT#FF8C00 \ --color ARROW#FF8C00 \ --color AXIS#FF8C00 \ --color BACK#222222 \ --color CANVAS#000000 \ --color SHADEA#222222 \ --color SHADEB#222222 \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ CDEF:value2=value1,0.01,* \ AREA:value2#00FF00:"loadavg5" \
LINE1のほうがかっこ良さそう?
最近なんかこうなめらかな感じのほうがウケるようなので
[-E|--slope-mode]
RRDtool - rrdgraph
というオプションをつけてみた
さらにそれっぽく?するためにAREAを重ねてLINE2にするとこうなる
rrdtool graph shoichi.example.com_loadavg5_8.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ --color FONT#FF8C00 \ --color ARROW#FF8C00 \ --color AXIS#FF8C00 \ --color BACK#222222 \ --color CANVAS#000000 \ --color SHADEA#222222 \ --color SHADEB#222222 \ --slope-mode \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ CDEF:value2=value1,0.01,* \ AREA:value2#004000 \ LINE2:value2#00FF00:"loadavg5" \
さらに装飾線
CPUのコア数の線なんて描いてみると良さそうな?考えるの面倒なのでHRULEベタ書きで
> HRULE:2#FF0000:"cpu core":dashes=4 \
コア数を越えてるところの背景塗りつぶしてみますか
塗りつぶしは"GTやらLTで比較してINFをかけてからAREA"でやります
rrdtool graph shoichi.example.com_loadavg5_10.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ --color FONT#FF8C00 \ --color ARROW#FF8C00 \ --color AXIS#FF8C00 \ --color BACK#222222 \ --color CANVAS#000000 \ --color SHADEA#222222 \ --color SHADEB#222222 \ --slope-mode \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ CDEF:value2=value1,0.01,* \ CDEF:over1=value2,2,GT,INF,* \ AREA:over1#662222 \ AREA:value2#004000 \ LINE2:value2#00FF00:"loadavg5" \ HRULE:2#FF0000:"cpu core":dashes=4 \
さらに、1週間前のグラフを描いておくと比較するのに便利なので描いてみましょう
rrdtool graph shoichi.example.com_loadavg5_11.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ --color FONT#FF8C00 \ --color ARROW#FF8C00 \ --color AXIS#FF8C00 \ --color BACK#222222 \ --color CANVAS#000000 \ --color SHADEA#222222 \ --color SHADEB#222222 \ --slope-mode \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ CDEF:value2=value1,0.01,* \ CDEF:value3=value2 \ SHIFT:value3:604800 \ CDEF:over1=value2,2,GT,INF,* \ AREA:over1#662222 \ AREA:value2#004000 \ LINE2:value2#00FF00:"loadavg5" \ LINE1:value3#FF8C00:"1 week ago" \ HRULE:2#FF0000:"cpu core":dashes=4 \
説明するとここのCDEF
CDEF:value3=value2 \
でいったんvalue3に渡して
SHIFT:value3:604800 \
ここで1週間分ずらしてます。でできたのがこちら
…凡例出てるけどグラフ出てねぇ
それもそのはず
--start end-1w --end now \
なので1週間分しかデータがないので線も引けない。ということで2週間分のデータをDEFでとりましょう
< DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE \ --- > DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE:start=end-2w \
線が出てきました(下の細いオレンジの線)
"1週間前の値の2倍を現在の値が超えた区域を塗りつぶす" をやってみたいと思います
rrdtool graph shoichi.example.com_loadavg5_13.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ --color FONT#FF8C00 \ --color ARROW#FF8C00 \ --color AXIS#FF8C00 \ --color BACK#222222 \ --color CANVAS#000000 \ --color SHADEA#222222 \ --color SHADEB#222222 \ --slope-mode \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE:start=end-2w \ CDEF:value2=value1,0.01,* \ CDEF:value3=value2 \ SHIFT:value3:604800 \ CDEF:over1=value2,2,GT,INF,* \ CDEF:over2=value3,2,*,value2,LT,INF,* \ AREA:over1#662222 \ AREA:over2#442244 \ AREA:value2#004000 \ LINE2:value2#00FF00:"loadavg5" \ LINE1:value3#FF8C00:"1 week ago" \ HRULE:2#FF0000:"cpu core":dashes=4 \
さっき塗りつぶしたのが上書きされてしまいました…ので透過つかいますかね
< AREA:over2#442244 \ --- > AREA:over2#44224480 \
rrdtoolの色指定は RGB透過率 だったりします。でグラフはこんな感じ
あとノリで1日移動平均線描いて見ました
最終のコマンドオプションはこちら
rrdtool graph shoichi.example.com_loadavg5_15.png \ --title "load average 5 of shoichi.example.com" \ --start end-1w --end now \ --width 400 \ --height 180 \ --color FONT#FF8C00 \ --color ARROW#FF8C00 \ --color AXIS#FF8C00 \ --color BACK#222222 \ --color CANVAS#000000 \ --color SHADEA#222222 \ --color SHADEB#222222 \ --slope-mode \ DEF:value1=shoichi.example.com_loadavg5.rrd:value:AVERAGE:start=end-2w \ CDEF:value2=value1,0.01,* \ CDEF:value3=value2 \ SHIFT:value3:604800 \ CDEF:over1=value2,2,GT,INF,* \ CDEF:over2=value3,2,*,value2,LT,INF,* \ CDEF:sm=value2,86400,TREND \ AREA:over1#662222 \ AREA:over2#44224480 \ AREA:value2#004000 \ LINE2:value2#00FF00:"loadavg5" \ LINE1:value3#FF8C00:"1 week ago" \ LINE2:sm#FFFFFF80:"trend 1 day" \ HRULE:2#FF0000:"cpu core":dashes=4 \
デザインの問題なのでデザイン力や色彩感覚の無い僕では限界ありますが、みなさんもいじってみてカッコいいグラフを描いてみてください。