muninで _ を含む名前のリモートサーバのグラフが描画されないバグについて
ver munin-node-1.2.5-2.el5.rf の muninにバグを見つけた。
muninで外部サイトを監視させるときに _ で始まるホスト名にするとグラフが描画できない。
例:db1-123 OK / db1_123 NGアウト
原因 /usr/sbin/munin-node の以下の関数にバグがある。
sub process_request { my $self = shift; $caddr = $self->{server}->{peeraddr}; print "# munin node at $FQDN\n"; local $SIG{ALRM} = sub { logger ("Connection timed out."); die "timeout" }; alarm($sconf{'timeout'}); while( <STDIN> ){ alarm($sconf{'timeout'}); chomp; if (m/^list\s*([0-9a-zA-Z\.\-]+)?/) { ###←ここだよ★ &list_services($1); } elsif (/^quit/ || /^\./) { exit 1; }
list命令は list SERVERNAME という書式だが、SERVERNAMEをひっかける正規表現で _ を書いていない。
これはひどいバグですね。
if (m/^list\s*([0-9a-zA-Z\.\-]+)?/) { ↓ if (m/^list\s*([0-9a-zA-Z\.\-_]+)?/) {
確か IE7 にも _ を含むドメインで cookieが利用できないとかいうバグがあったよなwwww
バグってんだろぉぉぉぉおお
って思ったら、ドメイン名に _ は利用できない文字なのか?
http://d.hatena.ne.jp/myamyugon/20080208/1202458821
こんな感じでデバッグしていたんだけど、 相手側のサーバにアクセスして list命令を発行したら空が帰ってくるみたい。
su - munin -c "/usr/share/munin/munin-update --debug --nofork --stdout --host SERVER_NAME --service df"
対策としては、上に書いていたように munin のルーチンを直すか、サーバ名を変更しましょう。
しかし、、一番イヤだったのが、これが munin のソースを printf デバッグしないとわからなかったところ。
通信した結果がどうだったかとかもっと詳細にログをはいてくれないと困る。
debug log レベルで出力しているのにログだけで解決しないとか、どうなの?
デバッグできないデバッグログにログに意味はあるんでしょうか。
デバッグログっていうのはデバッグログだけでデバッグできるように、がんがんはいてほしいものです。
します、しました系は当たり前で、もっともっと超詳細なログがほしいんだぜ。
まとめ。
muninには、 _ アンダースコア(アンダーバー)を含む名前(ドメイン/ホスト名)のリモートサーバのグラフを描画させることはできません。
_ が RFC違反なのかどうかはおいといて、直接的な原因は munin の正規表現で _ が指定されていないためです。
このとき、エラーメッセージ等はログにはかれない不思議しようなので気合でprintf デバッグしないといけません。
複数構成で munin のグラフが描画されない問題に悩んでいる人は、ホスト名やドメイン名に _ が入っていないか注意しましょう!