2014/07/31 TICKについて追記&修正
社内のmuninをいじり倒した時の社内メモをブログに転載。 最近muninをいじりすぎて、muninおじさんと呼ばれています。
こんな感じになります
やり方
※ 前提として0~6,19~24時を夜間として定義しているため、これを変更したい場合は適宜スクリプトなりを修正してください。
1. ↓のスクリプトを実行し、生成されたnighttime.rrd
を適当なディレクトリに配置する
2. /etc/cron.d/munin
に↓の行を追加
*/5 0-5,19-23 * * * munin perl -MRRDs -e 'RRDs::update("/var/lib/munin/nighttime.rrd","N:1")' */5 6-18 * * * munin perl -MRRDs -e 'RRDs::update("/var/lib/munin/nighttime.rrd","N:0")'
3. munin.conf
のノード設定部分に↓の行を追加
2014/07/31 修正
graph_args_after DEF:night=/var/lib/munin/nighttime.rrd:night:MAX TICK:night\#a0a0a040:1.0
4. グラフが更新されるまで待つ
説明
munin
で夜間帯のみに色をつけるにはどうしたらいいか?
munin
のグラフ生成はRRDtool
を使用しているので、これを制御できればグラフに手を加えることができると考えました。
残念ながら、RRDtool
には特定の時間帯のみ色を付ける機能はないです。。
が、値がINF(∞)
でAREA
なグラフを描画するとその部分のみ塗りつぶしが行われます。
つまり、 夜間帯のみ値が-∞〜∞
となっているグラフを生成しAREA
指定で描画すればよい ということがわかりました!
(-∞
なのは、ネットワークのグラフのようにマイナス方向がある場合、マイナス方向の塗りつぶしが行えないため)
graph_args_after
パラメータ
graph_args_after
パラメータは、RRDtool
でグラフ生成する際にmunin
から渡される引数に、任意の引数を追加するパラメータです。
(ちなみに、graph_args_after
パラメータはドキュメントに書いておらず隠しパラメータになってます…。。)
このパラメータを使用し、既存のグラフに目的のグラフを重ね合わせて描画しています。
rrdデータの生成
一年前の日付から実行時の時間までのRRDデータを生成しています。
この時、日中帯(6〜19時)は0
を、夜間帯(0~6,19〜24時)は1
を書き込んでいます。
本当は、-∞,∞
な値を入力したいところですが、そんな値を入力することはできないので0 or 1
を入力している。
cron
に登録したコマンドは、5分毎に起動されgen_rrd_nighttime.sh
同様日中帯は0
を、夜間帯は1
を書き込んでいます。
※ もしかしたら、日中帯はデータを入力しなくてもいいかもしれない。データがない場合はN/A
となりグラフは描画されない。
グラフ生成
夜間帯のみ1
となるデータを生成したので、これを元にグラフを生成しています。
入力値が1
のままでは、うまく塗りつぶしが行われないので、これ を-∞, ∞
にしないといけません。
そこで、CDEF
引数を使用し入力値に-∞
または∞
を掛けあわせています。
(CDEF
の計算式は逆ポーランド記法となっています)
あとは、生成したグラフをAREA
指定で描画しています。
ちなみに、#xxxxxxxx
な部分がRGBA
になっているので、色を変える場合はここを変えます。
参考
2014/07/31 追記
id:shoichimasuhara さんに、rrdgraphにTICKオプションというものがあると教えていただいた。
@buty4649 引用していただいた記事を書いた時に僕自身見落としていたんですが、AREA以外にTICKというものもありますのでそちらも合わせて試していただければ。http://t.co/LMXd3TCbrQ
— 桝原翔市 (@shoichimasuhara) 2014, 7月 25
実際に試したところこんな感じ。
TICKは、値が0ではなくかつUNKNOWNでなければその領域を塗りつぶすような処理をしてくれる! 今まで、CDEFとAREAでやってたことが一発でできるようだ! デフォルトでは、Y軸の10%(0.1)しか塗りつぶしてくれないので、fractionを1.0にして塗りつぶすといい感じになる。 べんりべんり~
設定差分
-graph_args_after DEF:night=/var/lib/munin/nighttime.rrd:night:MAX CDEF:n=night,INF,* CDEF:nm=night,INF,-1,*,* AREA:n\#a0a0a040 AREA:nm\#a0a0a040 +graph_args_after DEF:night=/var/lib/munin/nighttime.rrd:night:MAX TICK:night\#a0a0a040:1.0