読者です 読者をやめる 読者になる 読者になる

ぶていのログでぶログ

思い出したが吉日

muninグラフで夜間帯に色を付ける

2014/07/31 TICKについて追記&修正

社内のmuninをいじり倒した時の社内メモをブログに転載。 最近muninをいじりすぎて、muninおじさんと呼ばれています。

こんな感じになります

f:id:buty4649:20140725171644p:plain

やり方

※ 前提として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オプションというものがあると教えていただいた。

実際に試したところこんな感じ。

f:id:buty4649:20140729212221p:plain

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