munin

munin は手軽なシステム/ネットワーク監視ツール

ムーミン...ではない。 昔は HotSaNIC を使っていましたが、HotSaNIC は最近メンテナンスされてないので、muninに乗り換え。

インストール

http://munin.projects.linpro.no/
- download からダウンロードできる。

2009/01/18現在の最新は1.3.4。 redhat 用の spec があるけど、壊れている。 http://munin.projects.linpro.no/ticket/587 から親切な人がデバッグしてくれた spec を拾ってきて使う。

インストールの時に perl モジュールが足りないと起こられるので yum なり cpan2rpm でインストールする。

トラブルシューティング

munin-nodeをDEBUGモード(--debug)で走らせると、 /var/log/munin/munin-node.log にいろいろメッセージが出る。

エラーメッセージへの対応

まだ荒削りなようで、いろいろエラーがでる。

[fw\*]
user root
# ./iostat_ios
Use of uninitialized value in string eq at ./iostat_ios line 30.
Use of uninitialized value in string eq at ./iostat_ios line 40.

iostat_ios がエラーになる

  • [ERROR] Unable to update iostat_ios -> dev3_0_wtime: No such field (no "label" field defined when running plugin with "config").
    • config で帰ってくる値と、fetchで帰ってくる値が違う
    • telnet localhost 4949 で、config/fetch してみる。
config iostat_ios
graph_title IO Service time
graph_args --base 1000 --logarithmic
graph_category disk
graph_vlabel ms
dev3_0.label dev3_0
dev3_0.type GAUGE
dev3_0.draw LINE2config iostat_ios ngw.zukeran.net
dev253_0.label dev253_0
dev253_0.type GAUGE
dev253_0.draw LINE2
.
fetch iostat_ios
dev253_0_rtime.value 0.0735294117647059
dev253_0_wtime.value 0.0132371365745684
dev3_0_rtime.value 0.0865384615384615
dev3_0_wtime.value 0.00988266017958716

- パッチ書いてみました。
        - /usr/src/redhat/BUILD/munin-1.3.4/node/node.d.linux/iostat_ios.in   2008-03-08 10:42:39.000000000 +0900
+++ iostat_ios  2009-01-22 02:25:54.000000000 +0900
@@ -25,9 +25,9 @@
 # (c) 2004 - Per Andreas Buer
 # GPL v2 Yadda yadda.

-use constant STATEFILE => '@@PLUGSTATE@@/iostat-ios.state';
+use constant STATEFILE => '/var/lib/munin/plugin-state/iostat-ios.state';

-if ($ARGV[0] eq 'autoconf') {
+if ($ARGV[0] and $ARGV[0] eq 'autoconf') {
     if (-r "/proc/diskstats" or -r "/proc/partitions") {
        print "yes\n";
        exit 0;
@@ -37,7 +37,7 @@
     }
 }

-if ($ARGV[0] eq 'config') {
+if ($ARGV[0] and $ARGV[0] eq 'config') {
     print_config();
     exit;
 }
@@ -127,9 +127,12 @@
           "graph_vlabel ms\n");

     for my $d ( @{ get_ios(1) } ) {
- print("$d.label $d\n",
- "$d.type GAUGE\n",
- "$d.draw LINE2\n");
+        print("${d}_rtime.label $d\n",
+              "${d}_rtime.type GAUGE\n",
+              "${d}_rtime.draw LINE2\n");
+        print("${d}_wtime.label $d\n",
+              "${d}_wtime.type GAUGE\n",
+              "${d}_wtime.draw LINE2\n");
     }
 }

snmp__df が存在しない領域を参照してエラーになる

  • Use of uninitialized value in hash element at /etc/munin/plugins/snmp_xxx_df line 142.
# diff -u snmp__df.in snmp__df.in.new
        - snmp__df.in 2010-02-26 21:32:44.000000000 +0900
+++ snmp__df.in.new     2010-04-14 17:30:52.000000000 +0900
@@ -139,8 +139,8 @@
     foreach my $partition (keys %$parts)
     {
        my $mp = get_single ($session, $hrFSMountPoint . $partition);
- $partitions{$mp}{partition} = $partition;
- print "# Added partition \"$mp\" as $partition...\n" if $DEBUG
+       $partitions{$mp}{partition} = $partition if (defined($mp));
+       print "# Added partition \"$mp\" as $partition...\n" if (defined($mp) &&$DEBUG);
     }
 }

一部のスイッチで munin-node-configure で snmp__if_ が正しく設定できない

snmpで、 ifNumber が返ってくるが、ポートのインデックスが 1からの連番でない機器で問題になる。最適化の機能がうまく動いてない。

IF-MIB::ifNumber.0 = INTEGER: 28
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.5001 = INTEGER: 5001
IF-MIB::ifIndex.7001 = INTEGER: 7001
# diff -u SNMPConfig.pm.old SNMPConfig.pm
        - SNMPConfig.pm.old   2010-04-15 15:04:05.000000000 +0900
+++ SNMPConfig.pm       2010-04-15 15:07:17.000000000 +0900
@@ -102,7 +102,7 @@
        }

        # Fetch the list of indices
- if ($plugin->{number}) {
+       if (0 && $plugin->{number}) {
                my $num = _snmp_get_single($session, $plugin->{number});
                return unless $num;
                @indexes = (1 .. $num);

WindowsのMIB

  • Load 1.3.6.1.4.1.2021.10.1.3.2.2

pidebugが未定義

http://munin-monitoring.org/changeset/3477?new_path=/ に、パッチがある。

/etc/munin/plugin-conf.d/ の下の定義が反映されない(snmp)

下記のように書けと書いてあるけど、書いても反映されない。 wildcard(*)を使わずに、snmp_hostname_proc のように書けば反映されるけど、 台数が多くなると大変。 たぶん、 Node/Service.pm の export_service_environment が変。

   [snmp_*]
        env.version 2
        env.community public

サービス名(snmp_)の逆順に(reverse sort) wildcardが適用され、かつ、あとで 適用されたものが優先される。そのため、 snmp_ と snmp_aaa_* では、 snmp_* の 値で上書きされてしまう。snmp_* は、全ての監視対象に設定したい場合を除いて使わないのが吉。

ちなみに、env.community "public" のように、 "..." で括る記述例もあるが、これは動かない。

Argument "usb_fiq" isn't numeric in addition

perlのNet::Server::Fork でエラーが出る。

Use of uninitialized value in numeric eq (==) at /usr/share/perl5/Net/Server/Fork.pm line 168.

perl側の問題

Service bind9 on localhost/127.0.0.1:4949 returned no data for label query_other

$ munin-run bind9
No such file or directory at /etc/munin/plugins/bind9 line 79.

/var/log/bind9/query.log が無い。参考:munin plugin for bind9 | ohharaの日記 | スラッシュドット・ジャパン

chroot していると muninとbind9で見えるディレクトリと違うので注意。

Fedoraのsrc.rpmを使おうとすると、「cpio: MD5 sum mismatch」

日本語版では、「cpio: MD5 チェックサムが適合しません」になる。

整数データなのにグラフに小数点以下の端数が出る

  • 300秒ごとに計測しているはずだが、実際には299秒だったり301秒だったりする
  • rrdtoolがこれを真面目に計算してしまうため、誤差が出る

Use of uninitialized value in list assignment at /usr/share/perl5/Munin/Master/Utils.pm line 112.

Unable to graph /var/www/html/munin/localhost/localhost/xxxx-day.png : opening '/var/lib/munin/--g.rrd': No such file or directory

エラーメッセージ部分は --g.rrd や --d.rrd など、ハイフンが連続する。

rootが内部で使用されているため、root.value のような識別子が使えないのが原因。

下記のパッチは2010年に提出されているが、反映されていない。何か問題があったのか?

plugin側で root という文字列を回避するのが無難?

In RRD: Error updating /var/lib/xxx/http_loadtime-loadtime-g.rrd: /var/lib/xxx/http_loadtime-loadtime-g.rrd: found extra data on update argument:

外部コマンドのtimeが存在しないとエラーになる。 apt-get install time する。

Use of uninitialized value $mp in hash element at /etc/munin/plugins/snmp_XXXX_df_ram line 138.

snmp__df_ram のエラー

初期化されてないときはスキップするようにしてみたが、これでいいのだろうか?

--- snmp__df_ram.old	2023-02-05 01:11:10.507814685 +0900
+++ snmp__df_ram	2023-02-05 01:11:31.797165369 +0900
@@ -135,6 +135,7 @@
     foreach my $partition (keys %$parts)
     {
 	my $mp = get_single ($session, $hrFSMountPoint . $partition);
+	next unless (defined($mp));
 	$partitions{$mp}{partition} = $partition;
 	print "# Added partition \"$mp\" as $partition...\n" if $Munin::Plugin::SNMP::DEBUG
     }

グラフの曜日・月名が文字化けする

cron 実行時のLANGがC以外だと化ける。

グラフのスケール設定がわかりにくい

manual:087:7_examples - Cacti Docsmanual:087:8_rrdtool.06_alt_y_grid - Cacti Docsの例が参考になる。

  • graph_scale no
    • デフォルトはSI単位系に揃えるのだが、揃えて欲しくないときは graph_scale no
    • % 表示など
  • graph_args
    • rrdgraph に渡すパラメータ
    • --alt-y-grid
      • 1,2,5,10単位でY軸にグリッドを設定
    • --alt-autoscale
      • デフォルトではグラフY軸としてキリのいい数字を使う。alt-autoscaleは最大値・最小値を使う
    • --alt-autoscale-max, --alt-autoscale-min
      • 最大値(または最小値)の片方だけ使う。
    • --upper-limit 上限 (%表示時に -u 100など)
    • --lower-limit 下限 (%表示時に -l 0 など)

プラグインの実行権限

特に指定のない限り uid=nobody gid=munin (cf. /usr/share/perl5/Munin/Common/Defaults.pm )

our $MUNIN_USER       = q{munin};
our $MUNIN_GROUP      = q{munin};
our $MUNIN_PLUGINUSER = q{nobody};
  • /etc/munin/plugin-cond.d/ で指定できる

グラフの説明(graph_info)

pluginでgraph_infoを指定することで、グラフ下に説明を追加できる。表示場所を変更したい場合は、 /etc/munin/templates/munin-serviceview.tmpl のGRAPHINFOの位置を修正する。

graph_infoではHTMLタグが使える。

TIPS / ノウハウ

  • munin-check でパーミッションのチェックができる。
  • munin-check -f でパーミッションの修正ができる
  • symlink張らずにsnmpのテスト。下記のように環境変数渡しできる。
# host=testhost ./snmp__load

リンク