Muninのインストールと設定方法

Munin 概要

MuninはAgent型のパフォーマンス収集ツールです。ZappixやNagiosに比べるとアラート通知機能は貧弱ですが、設定が非常に簡単である事が最大のメリットです。

監視ツールとしては貧弱ですが、キャパシティプランニングだけならばMuninのみで充分です。また、監視が必要な環境でしたら他の統合監視ツールと組み合わせる事で手間を大きく削減できると思います。サーバ台数が多く運用工数削減が叫ばれるような環境では、非常にお勧めできるソフトウェアです。

huginn_muninn_001

Munin Masterのインストール

監視ツールは監視を行うサーバと監視されるサーバが存在し、サーバ、クライアント、エージェントなど呼び名はツールによって異なります。 Muninの場合は監視すサーバをMunin Masterと呼び、監視されるサーバをMunin nodeと呼びます。まずは、監視する側であるMunin Masterのインストール方法について説明します。

Munin Master インストール 方法 [必須]

Muninはepelリポジトリに配置されています。以下の方法で、epelリポジトリを登録して下さい。

# rpm -ihv https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yumコマンドを用いてMunin Masterをインストールします。このコマンドによって、インストールされるパッケージは、munin、munin-node、munin-commonの3つです。muninというパッケージがMunin Masterの事を指します。

# yum install munin

apacheがインストールされていない場合は、以下のコマンドでapacheをインストールします。MuninはApacheによって表示されます。

# yum install httpd

 Munin Master ディレクトリ構成の変更 [任意]

/etc/munin/munin.confを表示しディレクトリ構成を把握します。2011年頃は、ディレクトリの明示指定が必要であったり、バージョン変更のためにディレクトリ構成が変わったり、何かと面倒でした。しかし、2014年頃では、muninの仕様変更も少なくなり、特にディレクトリの設定を行わなくても(コメントアウトの削除も必要ございません)動作させる事ができます。

# Example configuration file for Munin, generated by 'make build'

# The next three variables specifies where the location of the RRD
# databases, the HTML output, logs and the lock/pid files.  They all
# must be writable by the user running munin-cron.  They are all
# defaulted to the values you see here.
#
#dbdir  /var/lib/munin
#htmldir /var/www/html/munin
#logdir /var/log/munin
#rundir  /var/run/munin

古いバージョンのmuninをメンテナンスしなければならない人やnginxでMuninを表示したい人は、ディレクトリ構成を変更しなければなりません。そのような方のために、Muninのディレクトリの意味をまとめました。Muninが使用するディレクトリは以下のようになります。

directoryデフォルト設定説明
dbdir/var/lib/munin集計結果のデータ(RRD database)が格納されます
htmldir/var/www/html/munin集計結果を閲覧するためのHTMLが格納されます
logdir/var/log/muninmuninの動作に関するログが格納されます
rundir/var/run/munin二重起動を防ぐためのpidファイルが格納されます

 Munin Apache 設定 [必須]

Munin Masterをインストールすると、Muninを閲覧するためのApache設定を自動的におこなってくれます。Munin Masterのインストールと同時に、/etc/httpd/conf.d/munin.confというファイルが作成されます。まずは、/etc/httpd/conf.d/munin.confを読んで構成を把握します。

# This file can be used as a .htaccess file, or a part of your apache
# config file.
#
# For the .htaccess file option to work the munin www directory
# (/var/www/html/munin) must have "AllowOverride all" or something close
# to that set.
#
# As a config file enclose it in <directory> like so:
#
<directory /var/www/html/munin>

AuthUserFile /etc/munin/munin-htpasswd
AuthName "Munin"
AuthType Basic
require valid-user

# This next part requires mod_expires to be enabled.
#
# We could use <IfModule mod_expires> around here, but I want it to be
# as evident as possible that you either have to load mod_expires _or_
# you coment out/remove these lines.

# Set the default expiery time for files 5 minutes 10 seconds from
# their creation (modification) time.  There are probably new files by
# that time.

ExpiresActive On
ExpiresDefault M310

</directory>
ScriptAlias /munin-cgi/munin-cgi-graph /var/www/cgi-bin/munin-cgi-graph

munin.confを読むと、BASIC認証が設定されている事が分かりました。ですので、Muninを閲覧するには、以下のどちらかの方法を必要となります。

  • Munin用にBASIC認証ユーザ/パスワードを設定する
  • MuninのBASIC認証を解除する
Munin Master BASIC認証ユーザ/パスワードの設定

htpasswdコマンドを用いて、BASIC認証のユーザを追加します。ユーザ名、パスワードは環境に応じて適宜変更して下さい。

[root@localhost ~]# htpasswd -c /etc/munin/munin-htpasswd user
New password:
Re-type new password:
Adding password for user user
[root@localhost ~]#
Munin Master BASIC認証の解除

BAISC認証が必要ないセキュアな環境ならば、BASIC認証を解除しても良いかもしれません。/etc/httpd/conf.d/munin.confのBASIC認証に関する設定を削除するかコメントアウトします。

--- munin.conf.org      2014-04-26 10:10:48.000000000 +0900
+++ munin.conf  2014-06-21 20:01:51.329990925 +0900
@@ -9,11 +9,6 @@
 #
 <directory /var/www/html/munin>

-AuthUserFile /etc/munin/munin-htpasswd
-AuthName "Munin"
-AuthType Basic
-require valid-user
-
 # This next part requires mod_expires to be enabled.
 #
 # We could use <IfModule mod_expires> around here, but I want it to be

Munin Master 動作確認

ブラウザに以下URLを入力しmuninの画面が閲覧できる事を確認します。

  • http://<ip_address>/munin/

Muninのブラウズ表示

Munin Nodeのインストール

Muninでは監視されるサーバの事をMunin  nodeと呼びます。以下Munin nodeの設定と監視対象の追加方法について説明します。

Munin Node インストール 方法 [必須]

Muninはepelリポジトリに配置されています。以下の方法で、epelリポジトリを登録して下さい。

# rpm -ihv https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yumコマンドを用いてMunin Nodeをインストールします。

# yum install munin-node

Munin Node 起動 [必須]

Munin Nodeは、多くの統合監視ツールで呼ばれる監視エージェントに相当する概念です。常駐プログラムで、このプログラムを起動させる事によって、監視サーバの応答に答えるようになります。以下のようなコマンドでmunin-nodeを起動させます。

# /etc/init.d/munin-node start
# chkconfig munin-node on

Munin Node 接続許可 [必須]

セキュリティ上の理由で、Munin Nodeのデフォルト設定はローカルホストからの接続のみを許可します。このデフォルト設定では、Munin Masterからの監視はできませんので、Munin Masterからの接続を許すよう/etc/munin/munin-node.confを編集します。allow句正規表現で指定し、cidr_allowはサブネットマスクで指定します。設定例は以下の通りです。

--- munin-node.conf.org 2014-06-23 00:22:25.257719599 +0900
+++ munin-node.conf     2014-06-23 00:21:48.395679959 +0900
@@ -35,29 +35,32 @@
 # telnetting to localhost, port 4949
 #
 #host_name localhost.localdomain

 # A list of addresses that are allowed to connect.  This must be a
 # regular expression, since Net::Server does not understand CIDR-style
 # network notation unless the perl module Net::CIDR is installed.  You
 # may repeat the allow line as many times as you'd like

 allow ^127\.0\.0\.1$
+allow ^133\.242\.152\.14[0-9]
 allow ^::1$

 # If you have installed the Net::CIDR perl module, you can use one or more
 # cidr_allow and cidr_deny address/mask patterns.  A connecting client must
 # match any cidr_allow, and not match any cidr_deny.  Note that a netmask
 # *must* be provided, even if it's /32
 #
 # Example:
 #
 # cidr_allow 127.0.0.1/32
 # cidr_allow 192.0.2.0/24
 # cidr_deny  192.0.2.42/32

+cidr_allow 192.168.0.0/24
+
 # Which address to bind to;
 host *
 # host 127.0.0.1

 # And which port
 port 4949

munin-nodeを再起動し、設定を反映させます。

# /etc/init.d/munin-node restart

Munin MasterとMunin Nodeの間は、tcp 4949を用いて通信を行います。iptablesやファイアウォールの設定を変更し、tcp4949が疎通可能になるようにします。設定方法は環境によって大きく異なると思いますので、ここでは具体的な設定例は示しません。

通信を許可したら、Munin Masterからtelnetコマンドを用いて疎通を確認します。

[root@localhost~]# telnet 133.242.169.96 4949
Trying 133.242.169.96...
Connected to 133.242.169.96.
Escape character is '^]'.
# munin node at vps096.changineer.info
list
cpu df df_inode entropy exim_mailqueue forks fw_conntrack fw_forwarded_local fw_packets if_err_eth0 if_err_eth1 if_err_eth2 if_eth0 if_eth1 if_eth2 interrupts irqstats load memory netstat ntp_kernel_err ntp_kernel_pll_freq ntp_kernel_pll_off ntp_offset ntp_states open_files open_inodes postfix_mailqueue postfix_mailvolume proc_pri processes swap threads uptime users vmstat
quit
Connection closed by foreign host.
[root@localhost ~]#

Munin Master 監視対象の定義 [必須]

Munin Masterで監視対象を定義するファイルは、/etc/munin/munin.confです。

--- munin.conf.org      2014-06-22 15:13:57.935515426 +0900
+++ munin.conf  2014-06-22 15:12:32.697468536 +0900
@@ -97,10 +97,14 @@
 # a simple host tree
 [localhost]
     address 127.0.0.1
     use_node_name yes

+[changineer.info]
+    address 133.242.169.96
+    use_node_name yes
+
 #
 # A more complex example of a host tree
 #
 ## First our "normal" host.
 # [fii.foo.com]

監視台数が増えてきたらカテゴリ分けし、見やすくする事もできます。[category:hostname]という書式でカテゴリ分けができます。設定例は以下の通りです。

[http;apache001]
    address 192.168.0.1
    use_node_name yes
 
[http;apache002]
    address 192.168.0.2
    use_node_name yes
 
[http;lighttpd001]
    address 192.168.1.1
    use_node_name yes
 
[db;oracle001]
    address 192.168.10.1
    use_node_name yes
 
[db;oracle002]
    address 192.168.10.2
    use_node_name yes
 
[db;mysql001]
    address 192.168.11.1
    use_node_name yes

Munin Pluginの設定

Munin Nodeでは、監視項目の事をPlugin (プラグイン) と呼びます。CPU、メモリなどのOSに関わる監視項目は自動的に監視されますが、apache、nginxなどは一手間が必要になります。

munin-node-configure –suggest

Munin NodeではPlugin (プラグイン、監視項目)を自動的に設定するツールが備わっています。munin-node-configureに–suggestオプションを渡す事によって、現在有効になっているPluginと有効にならない理由を確認する事ができます。

実行例は以下の通りです。この場合は、server-statusが設定されていないため、apacheの監視が有効にならばい事が分かります。

[root@localhost ~]# munin-node-configure --suggest
Plugin                     | Used | Suggestions
------                     | ---- | -----------
acpi                       | no   | no [cannot read []
amavis                     | no   | no
apache_accesses            | no   | no [apache server-status not found. check if mod_status is enabled]
apache_processes           | no   | no [apache server-status not found. check if mod_status is enabled]
apache_volume              | no   | no [apache server-status not found. check if mod_status is enabled]
apc_envunit_               | no   | no [no units to monitor]
bonding_err_               | no   | no [No /proc/net/bonding]
courier_mta_mailqueue      | no   | no [spooldir not found]
courier_mta_mailstats      | no   | no [could not find executable]
courier_mta_mailvolume     | no   | no [could not find executable]

 Munin Plugin ディレクトリ構成

Munin Pluginの有効/無効を設定できるようになるためには、まずはMunin Pluginのディレクトリ構成を理解する必要があります。Munin Pluginは、/usr/share/munin/plugins/に配置されています。apache, MySQLなどあらゆるPluginが配置されていますが、これら全てが有効になっているわけではありません。

[root@localhost~]# ls -l /usr/share/munin/plugins/ | head
total 1516
-rwxr-xr-x 1 root root  1624 Apr 26 10:10 acpi
-rwxr-xr-x 1 root root  3258 Apr 26 10:10 amavis
-rwxr-xr-x 1 root root  4375 Apr 26 10:10 apache_accesses
-rwxr-xr-x 1 root root  5757 Apr 26 10:10 apache_processes
-rwxr-xr-x 1 root root  4320 Apr 26 10:10 apache_volume
-rwxr-xr-x 1 root root  2384 Apr 26 10:10 apc_envunit_
-rwxr-xr-x 1 root root  3223 Apr 26 10:10 apc_nis
-rwxr-xr-x 1 root root  4751 Apr 26 10:10 apt
-rwxr-xr-x 1 root root  5269 Apr 26 10:10 apt_all

有効になっているMunin Pluginは/etc/munin/plugins/に格納されています。このディレクトリに、Pluginに対するシンボリックリンクを配置し、シンボリックリンクが存在するPluginのみが有効になる仕組みです。

[root@localhost~]# ls -l /etc/munin/plugins/ | head
total 0
lrwxrwxrwx 1 root root 28 Jun 22 14:38 cpu -> /usr/share/munin/plugins/cpu
lrwxrwxrwx 1 root root 27 Jun 22 14:38 df -> /usr/share/munin/plugins/df
lrwxrwxrwx 1 root root 33 Jun 22 14:38 df_inode -> /usr/share/munin/plugins/df_inode
lrwxrwxrwx 1 root root 34 Jun 22 14:38 diskstats -> /usr/share/munin/plugins/diskstats
lrwxrwxrwx 1 root root 32 Jun 22 14:38 entropy -> /usr/share/munin/plugins/entropy
lrwxrwxrwx 1 root root 39 Jun 22 14:38 exim_mailqueue -> /usr/share/munin/plugins/exim_mailqueue
lrwxrwxrwx 1 root root 30 Jun 22 14:38 forks -> /usr/share/munin/plugins/forks
lrwxrwxrwx 1 root root 37 Jun 22 14:38 fw_conntrack -> /usr/share/munin/plugins/fw_conntrack
lrwxrwxrwx 1 root root 43 Jun 22 14:38 fw_forwarded_local -> /usr/share/munin/plugins/fw_forwarded_local

以下のようにシンボリックリンクを作成する事で、Munin Pluginを有効にする事ができます。ただし、以下のようにlnコマンドを手打ちする事は滅多になく、後述のmunin-node-configure –shellコマンドを使用する方法がお勧めです。

# ln -s '/usr/share/munin/plugins/apache_accesses' '/etc/munin/plugins/apache_accesses'
# ln -s '/usr/share/munin/plugins/apache_processes' '/etc/munin/plugins/apache_processes'

 munin-node-configure –shell

munin-node-configure –shellコマンドを使用すると、有効にすべきプラグイン一覧が表示されます。サーバの設定を自動的にチェックし、有効にすべきPluginに対してシンボリックリンク生成コマンドを自動的に生成します。

[root@localhost ~]# munin-node-configure --shell
ln -s '/usr/share/munin/plugins/apache_accesses' '/etc/munin/plugins/apache_accesses'
ln -s '/usr/share/munin/plugins/apache_processes' '/etc/munin/plugins/apache_processes'
ln -s '/usr/share/munin/plugins/apache_volume' '/etc/munin/plugins/apache_volume'
ln -s '/usr/share/munin/plugins/fw_conntrack' '/etc/munin/plugins/fw_conntrack'
ln -s '/usr/share/munin/plugins/fw_forwarded_local' '/etc/munin/plugins/fw_forwarded_local'
ln -s '/usr/share/munin/plugins/munin_stats' '/etc/munin/plugins/munin_stats'

munin-node-configure –shellをshにパイプで渡す事で、自動的にシンボリックリンクが作成されMunin Pluginが有効になります。

# munin-node-configure --shell | sh

Munin Plugin Apache監視の有効化 [任意]

サーバの設定によっては、デフォルトの状態でApacheの監視画面は表示されません。Apacheの監視画面が表示されない理由を確かめるために、munin-node-configure –suggestを実行します。すると、”apache server-status not found”とのヒントが得られました。

[root@localhost ~]# munin-node-configure --suggest
Plugin                     | Used | Suggestions
------                     | ---- | -----------
acpi                       | no   | no [cannot read []
amavis                     | no   | no
apache_accesses            | no   | no [apache server-status not found. check if mod_status is enabled]
apache_processes           | no   | no [apache server-status not found. check if mod_status is enabled]
apache_volume              | no   | no [apache server-status not found. check if mod_status is enabled]
apc_envunit_               | no   | no [no units to monitor]
bonding_err_               | no   | no [No /proc/net/bonding]
courier_mta_mailqueue      | no   | no [spooldir not found]
courier_mta_mailstats      | no   | no [could not find executable]
courier_mta_mailvolume     | no   | no [could not find executable]

Apache監視が有効にならない理由を確かめるため、プラグインを読んでみましょう。/usr/share/munin/plugins/apache_accessesを読むと、”http://localhost/server-status?auto”へのアクセスを前提としている事が分かります。server-statusとは、Apacheの状態を確認するための画面です。Munin Pluginはこの画面をパースして、Apacheの状態を把握します。

The plugin needs access to http://localhost/server-status?auto (or
modify the URL for another host). See your Apache documentation on
how to set up this URL in your httpd.conf. Apache needs ExtendedStatus
enabled for this plugin to work.

server-statusを有効にするには、/etc/httpd/conf/httpd.confにおいて

  • mod_statusがロードされている事
  • ExtendedStatusが有効になっている事

を確認する必要があります。/etc/httpd/conf/httpd.confに以下2行が設定されている事を確認します。恐らくデフォルト設定では、ExtendedStatusはコメントアウトされている事が多いと思いますので、その場合は、ExtendedStatusのコメントアウトを削除します。

LoadModule status_module modules/mod_status.so
ExtendedStatus On

“http://localhost/server-status”というURLでアクセスできるよう、適当なディレクティブを作成します。私ならば、/etc/httpd/conf.d/server_status.confというファイルを以下のように作成します。

#status
<VirtualHost *:80>
    ServerName localhost
    <Location /server-status>
      SetHandler server-status
      Order deny,allow
      Deny from all
      allow from localhost
    </Location>
</VirtualHost>

apacheをリロードし、”http://localhost/server-status?auto”というアドレスでアクセスできる事を確認します。

[root@localhost ~]# /etc/init.d/httpd reload
Reloading httpd:
[root@localhost ~]# curl http://localhost/server-status?auto
Total Accesses: 0
Total kBytes: 0
Uptime: 1
ReqPerSec: 0
BytesPerSec: 0
BusyWorkers: 1
IdleWorkers: 7
Scoreboard: W_______........................................................................................................................................................................................................................................................

munin-node-configure –suggest | sh を使用してプラグインを有効化します。

# munin-node-configure --suggest | sh

pluginの変更を反映させるには、munin-nodeのリロードが必要となります。

[root@localhost ~]# /etc/init.d/munin-node reload
Stopping Munin Node agents:                                [  OK  ]
Starting Munin Node:                                       [  OK  ]
[root@localhost ~]#

Munin Plugin Apache監視の有効化 – ポート番号 URL変更が必要となる場合 [任意]

apacheのポート番号として80を使用できない場合やURLが”http://localhost/server-status?auto”にならない場合は、一手間必要となります。

まずはデフォルト設定を把握するために、/usr/share/munin/plugins/apache_accessesを読みます。すると、デフォルト設定が以下のように記載されています。

This configuration section shows the defaults of the plugin:

  [apache_*]
     env.url   http://127.0.0.1:%d/server-status?auto
     env.ports 80

The %d in the url will be replaced with the port.  The default port is
80 as shown.

Munin Pluginの設定を変更するには、/etc/munin/plugin-conf.d/に設定ファイルを作成します。例えば、apacheを8080でListenする場合の設定ならば、/etc/munin/plugin-conf.d/apacheというファイルを以下のように作成します。

[apache_*]
  env.url   http://localhost:%d/server-status?auto
  env.ports 8080

Munin Plugin nginx 監視の有効化 [任意]

サーバの設定によっては、デフォルトの状態でNginxの監視画面は表示されません。Nginxの監視画面が表示されない理由を確かめるために、munin-node-configure –suggestを実行します。すると、”no nginx status on http://localhost/nginx_status”とのヒントが得られました。

[root@localhost ~]# munin-node-configure --suggest
Plugin                     | Used | Suggestions
------                     | ---- | -----------

 <omitted>

nfsd                       | no   | no [no /proc/net/rpc/nfsd]
nfsd4                      | no   | no [no /proc/net/rpc/nfsd]
nginx_request              | no   | no [no nginx status on http://localhost/nginx_status]
nginx_status               | no   | no [no nginx status on http://localhost/nginx_status]
ntp_kernel_err             | yes  | yes
ntp_kernel_pll_freq        | yes  | yes

エラーメッセージの通り、Munin Pluginは”http://localhost/nginx_status”にNginxのステータス画面が表示される事を期待しています。ステータス画面を表示するためには、stub_statusというディレクティブを使用します。私ならば、”/etc/nginx/conf.d/localhost.conf”というファイルを以下のように作成します。

server {
    listen 80;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Nginxをリロードし、”http://localhost/nginx_status”というアドレスでアクセスできる事を確認します。

[root@localhost ~]# /etc/init.d/nginx reload
Reloading nginx:                                           [  OK  ]
[root@localhost ~]# curl http://localhost/nginx_status
Active connections: 2
server accepts handled requests
 69855 69855 117981
Reading: 0 Writing: 1 Waiting: 1

munin-node-configure –suggest | sh を使用してプラグインを有効化します。

# munin-node-configure --suggest | sh

pluginの変更を反映させるには、munin-nodeのリロードが必要となります。

[root@localhost ~]# /etc/init.d/munin-node reload
Stopping Munin Node agents:                                [  OK  ]
Starting Munin Node:                                       [  OK  ]
[root@localhost ~]#

Munin Plugin Nginx 監視の有効化 – ポート番号 URL変更が必要となる場合 [任意]

Nginxのポート番号として80を使用できない場合やURLが”http://localhost/nginx_status”にならない場合は、一手間必要となります。

まずはデフォルト設定を把握するために、/usr/share/munin/plugins/nginx_statusを読みます。すると、デフォルト設定が以下のように記載されています。

This shows the default configuration of this plugin.  You can override
the status URL.

  [nginx*]
      env.url http://localhost/nginx_status

Nginx must also be configured.  Firstly the stub-status module must be
compiled, and secondly it must be configured like this:

  server {
        listen 127.0.0.1;
        server_name localhost;
        location /nginx_status {
                stub_status on;
                access_log   off;
                allow 127.0.0.1;
                deny all;
        }
  }

Munin Pluginの設定を変更するには、/etc/munin/plugin-conf.d/に設定ファイルを作成します。例えば、Nginxを8080でListenする場合の設定ならば、/etc/munin/plugin-conf.d/nginxというファイルを以下のように作成します。

[nginx*]
   env.url http://localhost:8080/nginx_status

Munin Plugin MySQL監視の有効化 [任意]

デフォルトの状態でMySQLの監視画面は表示されない事もあるかもしれません。これは、MySQL PluginがいくつかのCPANモジュールを前提としているためです。どのようなCPANモジュールの追加インストールが必要になるのかは、サーバの設定に依存しますし、今後のMySQL Pluginのバージョンアップによって変わっていくでしょう。

今現在(2014/06/22)時点で、追加が必要なCPANモジュールはperl-DBD-MySQLとperl-Cache-Cacheです。以下yumコマンドで、CPANモジュールをインストールして下さい。

# yum install perl-DBD-MySQL perl-Cache-Cache

もし、この2モジュールでMySQLの画面が表示されない場合は、後述の”トラブルシューティング”、”Tips”を参考に必要なモジュールを探してください。

Munin Plugin MySQL監視の有効化 – 接続ユーザの変更 [任意]

MySQL関連のMunin Pluginは、rootユーザ、空パスワードを前提として接続を試みます。もし、rootユーザ、空パスワードによる接続ができない(または認められない)場合は、接続情報の変更が必要となります。接続情報をどのように設定すべきか確かめるため、Munin Pluginである/usr/share/munin/plugins/mysql_を読みます。

In addition you might need to specify connection parameters in the
plugin configuration to override the defaults. These are the defaults:

  [mysql_*]
    env.mysqlconnection DBI:mysql:mysql
    env.mysqluser root

Non-default example:

  [mysql_*]
    env.mysqlconnection DBI:mysql:mysql;host=127.0.0.1;port=3306
    env.mysqluser root
    env.mysqlpassword geheim
    env.cachenamespace munin_mysql_pri
  [mysql2_*]
    env.mysqlconnection DBI:mysql:mysql;host=127.0.0.1;port=13306
    env.mysqluser root
    env.mysqlpassword ryuWyawEv
    env.cachenamespace munin_mysql_alt

Munin Pluginの設定を変更するには、/etc/munin/plugin-conf.d/に設定ファイルを作成します。例えば、ユーザ名munin、パスワードpasswdで接続する場合ならば、/etc/munin/plugin-conf.d/mysqlというファイルを以下のように作成します。

[mysql_*]
  env.mysqlconnection DBI:mysql:mysql;host=127.0.0.1;port=3306
  env.mysqluser munin
  env.mysqlpassword passwd

Munin Pluginの自作

Muninはデフォルトである程度のプラグインがインストール済になっています。しかし、デフォルトのプラグインでは要件を満たせない場合もあるかもしれません。そのような場合は、プラグインの自作を検討しても良いかもしれません。

また、Muninのようなプラガブル(plugable)な設計思想のソフトウェアは、プラグインによって品質がまちまちです。github等からダウンロードしたプラグインの中には、製作者の勤務先に特化しすぎて、多くの会社では使い物にならない場合がよくあります。そのような「使い物にならない」プラグインでも、Plugin作成の知識を持っていれば、適宜修正を行なって、再利用できるかもしれません。

Muninに限らず、監視ツールのプラグインはそれほどハードルの高い技術ではないので、覚えておいて損はないでしょう。

Munin Pluginの自作 – 引数

Muninプラグインを作成するには、以下の表のように、autoconfig, config, 引数なしの場合の処理を実装します。

引数説明
autoconf監視を行なうべきかどうかの判定結果を返します。
config監視結果を格納するRRDのデータ型を定義します。
引数なし監視結果を返します。

以下、「ネットワークチェンジニアとして」の総はてなブックマーク数をグラフ化するプラグインを例に挙げて説明します。

Munin Pluginの自作 – autoconf

まずは具体的な処理のイメージを膨らますために、Muninプラグインを手動で実行してみましょう。

autoconfigは、監視を行なうべきかどうかを返す処理です。例えば、PostgreSQLがインストールされていないサーバに対して、PostgreSQLの監視を行なっても意味がありません。

仮想サーバ環境でusers, sensors_という2種類のプラグインに、引数autoconfを与えて実行します。userは”yes”を返すものの、sensors_は”no”を返します。このコマンドを実行したのは、仮想サーバなので”sensors_”で温度や消費電力をグラフ化しても意味ない事を表します。

[root@localhost ~]# /usr/share/munin/plugins/users autoconf
yes
[root@localhost ~]# /usr/share/munin/plugins/sensors_ autoconf
no (program sensors died)
[root@localhost ~]#

それでは、引数autoconfを実装してみましょう。WEBサーバを動作しているホストのみ監視するという要件と仮定します。”changineer.info”とホスト名の両方の名前解決を4,5行目で行ないます。両者の名前解決した結果のIPアドレスが一致するならば、WEBサーバが動作しているホストと推測します(7行目)。

このような処理に基づいて、監視をすべきと判断するならば”yes”を標準出力します。監視をしないべきと判断するならば”no”を標準出力します。

#!/usr/bin/php
<php?
function get_autoconf(){
  $web_addr = gethostbyname('changineer.info');
  $remote_addr = gethostbyname(trim(`hostname`));

  if (  $web_addr == $remote_addr ) {
    return "yes";
  } else {
    return "no";
  }
}

if (count($argv) == 1) {
  print "count.value " . get_bookmark_count() ;
  exit(0) ;
}

switch ($argv[1]) {
  case "config":
    print get_config();
    break;
  case "autoconf":
    print get_autoconf();
    break;
}

先ほど作成したファイルを/usr/share/munin/plugins/bookmarkという名前で保存します。munin-node-configure –suggestコマンドを用いて、プラグインの自動登録を試みます。

しかし、munin-node-configure –suggestコマンドを使用しても、bookmarkというプラグインの表示が見当たりません。これは、family, capabilitiesの処理が漏れているためです。

[root@localhost ~]# munin-node-configure --suggest
Plugin                     | Used | Suggestions
------                     | ---- | -----------
acpi                       | no   | no [cannot read []
amavis                     | no   | no
apache_accesses            | yes  | yes
apache_processes           | yes  | yes
apache_volume              | yes  | yes
apc_envunit_               | no   | no [no units to monitor]
bonding_err_               | no   | no [No /proc/net/bonding]
courier_mta_mailqueue      | no   | no [spooldir not found]
courier_mta_mailstats      | no   | no [could not find executable]

 <omitted>

muninプラグインは、ソースコード内のfamily, capabilitiesというコメント文を読み取り、プラグインがどのような機能を持っているのかを判断します。munin-node-configureを使用したいならば、以下のようにfamily, capabilitiesのコメント追加して下さい。

#!/usr/bin/php
<php?

#%# family=auto
#%# capabilities=autoconf

function get_autoconf(){
  $web_addr = gethostbyname('changineer.info');
  $remote_addr = gethostbyname(trim(`hostname`));

 <omitted>

munin-node-cofigureコマンドでプラグインを登録できる事を確認します。

[root@localhost ~]# munin-node-configure --suggest | grep bookmark
bookmark                   | no   | yes
# The following plugins caused errors:
# http_loadtime:
#       Non-zero exit during autoconf (2)
Munin Pluginの自作 – config

MuninはRRD(round robin database : ラウンドロビンデータベース)にデータを格納します。プラグインに引数 configを与えて実行すると、RRDのデータ型を返すようにして下さい。試しに、usersというプラグインに引数configを与えて実行すると、RRDのデータ型のようなものが返される事が分かります。

[root@localhost ~]# /usr/share/munin/plugins/users config
graph_title Logged in users
graph_args --base 1000 -l 0
graph_vlabel Users
graph_scale no
graph_category system
graph_printf %3.0lf
tty.label tty
tty.draw AREASTACK
tty.colour 00FF00
pty.label pty
pty.draw AREASTACK
pty.colour 0000FF
pts.label pts
pts.draw AREASTACK
pts.colour 00FFFF
X.label X displays
X.draw AREASTACK
X.info Users logged in on an X display
X.colour 000000
other.label Other users
other.info Users logged in by indeterminate method
other.colour FF0000

RRDデータ型の指定方法は以下のURLを参照ください。

実装例は以下の通りです。

#!/usr/bin/php
<php?

function get_config () {
  return <<< EOF
graph_title hatena bookmark count
graph_vlabel count
graph_category social media
count.label hatena bookmark count
count.min 0
count.draw LINE2
count.type GAUGE
EOF;
}

if (count($argv) == 1) {
  print "count.value " . get_bookmark_count() ;
  exit(0) ;
}

switch ($argv[1]) {
  case "config":
    print get_config();
    break;
  case "autoconf":
    print get_autoconf();
    break;
}
Munin Pluignの自作 – 引数なし

Munin Pluginに引数なしで実行した場合は、監視結果を返します。例えば、usersというプラグインの実行結果ならば、以下の通りです。”監視項目.value”という書式で、監視結果が標準出力されている事が分かります。

[root@localhost ~]# /usr/share/munin/plugins/users
tty.value 0
pty.value 0
pts.value 1
X.value 0
other.value 0

実装例は以下の通りです。

#!/usr/bin/php
<php?

function get_bookmark_count () {

  require_once '/usr/local/scripts/web.changineer.info/munin/IXR_Library.php';

  $url = 'http://changineer.info/';

  $ixr = new IXR_Client('http://b.hatena.ne.jp/xmlrpc');
  $ixr->query('bookmark.getTotalCount',$url);
  $count = $ixr->getResponse();

  if(!$count) $count = 0;

  return $count ;

}

if (count($argv) == 1) {
  print "count.value " . get_bookmark_count() ;
  exit(0) ;
}

switch ($argv[1]) {
  case "config":
    print get_config();
    break;
  case "autoconf":
    print get_autoconf();
    break;
}

Munin Pluginの自作 – 作成例

以上、はてなブックマーク総数を取得するプラグインを作成しました。ソースコード全文は以下の通りです。

監視結果は以下のようになります。

munin_hatebu_001

Munin Plugin 自作の功罪

私個人の意見になりますが、プラグインを自作するのは、良い事とも悪い事とも言えません。「足りない物は作る、無い物は作る」という事に遣り甲斐や格好良さを感じる人も居るかも知れません。

しかし、運用を5年間やってきた私の意見としては、自作プラグインは非常に迷惑な話です。作った本人は良いかもしれませんが、充分な情報を与えられずに引き継がされた立場の人は非常に辛いです。プラグインの自作は極力控えるようにした方が良いかもしれません。

「プラグインは作れるけど敢えて作らない」というのが理想かと思います。プラグイン作成のための知識は、ここ一番のトラブルシューティングの時まで温存しておくのが良いでしょう。

やむを得ずプラグインを作成せざるを得ない場合もあるかと思いますが、そのような場合は1年に1度くらいの割合で、標準的なプラグインがあるかどうか再検討しましょう。自社開発のコードを捨てて、標準的なソフトウェアに乗り換える事で運用の俗人化を排除する事ができます。

トラブルシューティング

HTML生成に関するトラブルシューティング

Munin Masterは常駐型のプログラムではなく、5分に一回実行されるcronです。Muninの画面が生成されるまでには5分かかりますので、HTMLが生成されない場合は、5分, 10分待ってみる事をお勧めします。

しばらく待ってもHTMLが生成されない場合は、HTML生成に関するログを見ます。/var/log/munin/munin-html.logをtailしならが、トラブルの原因を探します。

[root@localhost ~]# tail -f /var/log/munin/munin-html.log
2014/06/22 22:50:20 [INFO] config generated (0.24 sec)
2014/06/22 22:50:20 [INFO] Starting munin-html, getting lock /var/run/munin/munin-html.lock
2014/06/22 22:50:22 [INFO] Creating problem page /var/www/html/munin/problems.html
2014/06/22 22:50:22 [INFO] Releasing lock file /var/run/munin/munin-html.lock
2014/06/22 22:50:22 [INFO] munin-html finished (1.66 sec)
2014/06/22 22:55:19 [INFO] config generated (0.29 sec)
2014/06/22 22:55:19 [INFO] Starting munin-html, getting lock /var/run/munin/munin-html.lock
2014/06/22 22:55:21 [INFO] Creating problem page /var/www/html/munin/problems.html
2014/06/22 22:55:21 [INFO] Releasing lock file /var/run/munin/munin-html.lock
2014/06/22 22:55:21 [INFO] munin-html finished (1.64 sec)

Munin Masterによって生成されるHTMLは、/var/www/html/munin に格納されます。/var/www/html/munin配下にHTMLファイルが存在するかを確認して下さい。なお、確認する時は、ファイルのパーミッションには十分注意しましょう。

[root@localhost ~]# ls -l /var/www/html/munin | head
total 524
-rw-r--r-- 1 munin munin  5640 Jun 22 23:00 apache-day.html
-rw-r--r-- 1 munin munin  5646 Jun 22 23:00 apache-month.html
-rw-r--r-- 1 munin munin  5643 Jun 22 23:00 apache-week.html
-rw-r--r-- 1 munin munin  5643 Jun 22 23:00 apache-year.html
-rw-r--r-- 1 munin munin 16105 Jun 22 23:00 disk-day.html
-rw-r--r-- 1 munin munin 16145 Jun 22 23:00 disk-month.html
-rw-r--r-- 1 munin munin 16125 Jun 22 23:00 disk-week.html
-rw-r--r-- 1 munin munin 16125 Jun 22 23:00 disk-year.html
-rw-r--r-- 1 munin munin  4424 Jun 22 23:00 exim-day.html

ファイルを見ても、トラブルの原因が推測できない時は、手作業でHTML生成スクリプトを実行する事もできます。Munin Masterに関する定期実行処理は、/etc/cron.d/muninに記載されています。このファイルを読むと、/usr/bin/munin-cronというスクリプトが5分に一回実行されている事が分かります。さらに、/usr/bin/munin-cronを読むと、HTML生成スクリプトは/usr/share/munin/munin-htmlである事が分かります。

[root@localhost ~]# cat /etc/cron.d/munin
#
# cron-jobs for munin
#

MAILTO=root

*/5 * * * *     munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# cat /usr/bin/munin-cron
#!/bin/sh

# This used to test if the executables were installed.  But that is
# perfectly redundant and supresses errors that the admin should see.

/usr/share/munin/munin-update $@ || exit 1

# The result of munin-limits is needed by munin-html but not by
# munin-graph.  So run it in the background now, it will be done
# before munin-graph.

/usr/share/munin/munin-limits $@

# We always launch munin-html.
# It is a noop if html_strategy is "cgi"
nice /usr/share/munin/munin-html $@ || exit 1

# The result of munin-html is needed for munin-graph.
# It is a noop if graph_strategy is "cgi"
nice /usr/share/munin/munin-graph --cron $@ || exit 1
[root@localhost ~]#

HTML生成スクリプト/usr/share/munin/munin-htmlをmuninユーザで実行し、何かエラーが出力されるかを観察します。この時、rootユーザで実行しないよう注意して下さい。rootで実行してしまうと、root権限のファイルができてしまい、muninユーザによる書き込みが以降できなくなってしまう可能性があります。

# sudo -u munin /usr/share/munin/munin-html

Node 追加 (監視対象サーバ追加) に関するトラブルシューティング

Munin Masterに関する監視ログは /var/log/munin/munin-update.logに出力されます。munin-update.logをホスト名またはIPアドレスでgrepで絞込みつつ、tail -fで眺めます。

[root@localhost ~]# tail -f /var/log/munin/munin-update.log | grep changineer\.info
2014/06/23 00:00:02 [INFO] starting work in 4786 for changineer.info/133.242.169.96:4949.
2014/06/23 00:00:02 [ERROR] Munin::Master::UpdateWorker<info;changineer.info> failed to connect to node

ログ出力の結果によって、大きく分けて以下2つのトラブルに分類する事ができます。

  • ログまったく出力されず、/etc/munin/munin.confでのNode 追加設定誤りが予想される。
  • ログが出力されるが、何らかの理由により接続が拒否されている。

/etc/munin/munin.confの設定誤りの場合は、munin.confの設定をもう一度見直してください。

# a simple host tree
[localhost]
    address 127.0.0.1
    use_node_name yes

[changineer.info]
    address 133.242.169.96
    use_node_name yes

接続を拒否されている場合は、telnetコマンドを用いてtcp4949に接続可能かどうかを確かめます。以下のように”No route to host”と表示される場合は、tcpによる接続ができない事を意味します。Layer 4以下のネットワーク上の問題で、iptablesやファイアウォールの設定を疑うと良いでしょう。

[root@localhost ~]# telnet 133.242.169.96 4949
Trying 133.242.169.96...
telnet: connect to address 133.242.169.96: No route to host
[root@localhost ~]#

telnet接続時に、”Escape character is”と表示された後に、”Connection closed by foreign host”と表示された場合は、ネットワーク上の問題ではありません。これは接続した後に切断されている事を意味するので、Munin Nodeの動作である事が予想されます。/etc/munin/munin-node.confのallowやcidr_allowの設定が漏れていると、このような動作になります。

[root@localhost ~]# telnet 133.242.169.96 4949
Trying 133.242.169.96...
Connected to 133.242.169.96.
Escape character is '^]'.
Connection closed by foreign host.
[root@locahost ~]#

 

Plugin 有効化 (監視項目追加) に関するトラブルシューティング

“munin-node-configure –suggest”実行時に、Suggestions欄にnoとのみ表示され、何もヒントが得られない事があります。以下、mysql_を例に挙げ、munin-node-configureコマンドでヒントが得られない場合の対応方法について説明します。

[root@localhost ~]# munin-node-configure --suggest
Plugin                     | Used | Suggestions
------                     | ---- | -----------
acpi                       | no   | no [cannot read []
amavis                     | no   | no

 <omitted>

memory                     | yes  | yes
munin_stats                | no   | no [munin-update was not found at /usr/share/munin/munin-update]
mysql_                     | no   | no
netstat                    | yes  | yes

munin-node-configureは、各プラグインに引数autoconfを渡して実行した場合の標準出力を整形しているツールになります。従って、 各プラグインがエラーを標準出力しない場合は、作業で実行する事でトラブルシューティングする事ができます。

/usr/share/munin/plugins/mysql_を実行した時のトラブル事例は、以下の通りです。以下の出力の場合では、perlモジュール DBD::mysql がインストールされていない事が推測する事ができます。

[root@localhost ~]# /usr/share/munin/plugins/mysql_ autoconf
no (install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 15) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: DBM, ExampleP, File, Gofer, Pg, Proxy, Sponge.
)
[root@localhost ~]#

Munin 実際の監視画面

このサイト「ネットワークチェンジニアとして」の監視結果を紹介します。実際の画面を見て頂き、muninの雰囲気を感じとって頂ければと思います。

Tips

Munin Plugin MySQL 有効時のトラブル

Missing dependency Cache::Cache

サーバの構成によっては、デフォルト設定でMySQL監視が有効にならない事もあります。munin-node-configure –suggestを実行した結果、”Missing dependency Cache::Cache”とのヒントが表示された場合の対応方法について説明します。

[root@localhost~]# munin-node-configure --suggest | grep -i mysql
mysql_                     | no   | no [Missing dependency Cache::Cache]
# The following plugins caused errors:
# fail2ban:
#       Junk printed to stderr

エラーの原因を探るため、MySQL Pluginである/usr/share/munin/plugins/mysql_のソースを読みます。”Missing dependency Cache::Cache”というキーワードで検索しながらソースを読むと、Cache::SharedMemoryCacheというCPANモジュールをrequireできない時に発生するエラーである事が分かります。/usr/share/munin/plugins/mysql_の”Missing dependency Cache::Cache”に関連する処理を抜粋すると以下のようになります。

BEGIN {
    eval 'require Cache::SharedMemoryCache';
    $has_cache = $@ ? 0 : 1;
}

my $shared_memory_cache ;
if ($has_cache)
{
  $shared_memory_cache = Cache::SharedMemoryCache->new(\%cache_options)
    or die("Couldn't instantiate SharedMemoryCache");
}

CPANモジュールperl-Cache-Cacheをインストールする事でエラーを解消できます。

# yum install perl-Cache-Cache
mysql_innodb_io_pend, mysql_innodb_insert_buf

MySQLは設定やバージョンによっては、一部のデータが取得できない可能性があります。/var/log/munin/munin-update.logをよく観察すると、mysql_innodb_io_pend, mysql_innodb_insert_bufのグラフに関する値が取得できていない事が分かります。

[root@localhost ~]# tail -f /var/log/munin/munin-update.log
2014/07/10 23:25:08 [WARNING] Service mysql_innodb_io_pend on skr145.changineer.info/133.242.152.145:4949 returned no data for label ib_iop_sync
2014/07/10 23:25:08 [WARNING] Service mysql_innodb_io_pend on skr145.changineer.info/133.242.152.145:4949 returned no data for label ib_iop_log
2014/07/10 23:25:08 [WARNING] Service mysql_innodb_io_pend on skr145.changineer.info/133.242.152.145:4949 returned no data for label ib_iop_ibuf_aio
2014/07/10 23:25:12 [INFO] Remaining workers: changineer.info;skr145.changineer.info, changineer.info;vps096.changineer.info, changineer.info;aws.changineer.info
2014/07/10 23:25:12 [INFO] Reaping Munin::Master::UpdateWorker<changineer.info;aws.changineer.info>.  Exit value/signal: 20/0
2014/07/10 23:25:12 [INFO] Reaping Munin::Master::UpdateWorker<changineer.info;vps096.changineer.info>.  Exit value/signal: 18/0
2014/07/10 23:25:18 [WARNING] 3 lines had errors while 0 lines were correct (100.00%) in data from 'fetch mysql_innodb_insert_buf' on skr145.changineer.info/133.242.152.145:4949
2014/07/10 23:25:18 [WARNING] Service mysql_innodb_insert_buf on skr145.changineer.info/133.242.152.145:4949 returned no data for label ib_ibuf_merged_rec
2014/07/10 23:25:18 [WARNING] Service mysql_innodb_insert_buf on skr145.changineer.info/133.242.152.145:4949 returned no data for label ib_ibuf_inserts
2014/07/10 23:25:18 [WARNING] Service mysql_innodb_insert_buf on skr145.changineer.info/133.242.152.145:4949 returned no data for label ib_ibuf_merges

念のため、munin-runコマンドも用いて、確かにエラーが出力される事を確認します。

[root@localhost ~]# munin-run mysql_innodb_io_pend
Use of uninitialized value in printf at /etc/munin/plugins/mysql_innodb_io_pend line 885.
ib_iop_log.value
Use of uninitialized value in printf at /etc/munin/plugins/mysql_innodb_io_pend line 885.
ib_iop_sync.value
ib_iop_flush_bpool.value 0
ib_iop_flush_log.value 0
Use of uninitialized value in printf at /etc/munin/plugins/mysql_innodb_io_pend line 885.
ib_iop_ibuf_aio.value
Use of uninitialized value in printf at /etc/munin/plugins/mysql_innodb_io_pend line 885.
ib_iop_aioread.value
Use of uninitialized value in printf at /etc/munin/plugins/mysql_innodb_io_pend line 885.
ib_iop_aiowrite.value
[root@localhost ~]#

これはSHOW ENGINE INNODB STATUSの出力がMySQLのバージョンによって異なるためです。muninプラグインが、現在お使いのMySQLのバージョンと合わない場合は、プラグインを手作業で修正する必要があります。

まずはMySQLのSHOW ENGINE INNODB STATUSの出力を観察します。

[root@localhost ~]# mysql -uroot -e "SHOW ENGINE INNODB STATUS"
+--------+------+---------------------------------------------

 <omitted>

--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
1157 OS file reads, 1448721 OS file writes, 744803 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s

SHOW ENGINE INNODB STATUSの出力に合わせて、/usr/share/munin/plugins/mysql_ を修正します。なお、修正方法は、MySQLの環境によって異なると思いますので、適宜対応をお願いします。

--- mysql_      2014-04-26 10:10:45.000000000 +0900
+++ /usr/share/munin/plugins/mysql_     2014-07-10 23:52:39.487107624 +0900
@@ -1186,14 +1186,17 @@
 sub parse_file_io {
     parse_section(
        sub {
-           m/\GPending normal aio reads: (\d+), aio writes: (\d+),\n\s*ibuf aio reads: (\d+), log i\/o's: (\d+), sync i\/o's: (\d+)\n/gc && do {
+            m/\GPending normal aio reads: (\d+) \[(\d+), (\d+), (\d+), (\d+)\] , aio writes: (\d+)/gc && do {
                $data->{ib_iop_aioread}  = $1;
-               $data->{ib_iop_aiowrite} = $2;
-               $data->{ib_iop_ibuf_aio} = $3;
-               $data->{ib_iop_log}      = $4;
-               $data->{ib_iop_sync}     = $5;
+               $data->{ib_iop_aiowrite} = $6;
                return 1;
            };
+            m/\G ibuf aio reads: (\d+), log i\/o\'s: (\d+), sync i\/o\'s: (\d+)\n/gc && do {
+                $data->{ib_iop_ibuf_aio} = $1;
+                $data->{ib_iop_log}      = $2;
+                $data->{ib_iop_sync}     = $3;
+                return 1;
+            };
            m/\GPending flushes \(fsync\) log: (\d+); buffer pool: (\d+)\n/gc && do {
                $data->{ib_iop_flush_log}   = $1;
                $data->{ib_iop_flush_bpool} = $2;

munin-runコマンドを用いて、エラーが解消された事を確認します。

[root@localhost ~]# munin-run mysql_innodb_io_pend
ib_iop_log.value 0
ib_iop_sync.value 0
ib_iop_flush_bpool.value 0
ib_iop_flush_log.value 0
ib_iop_ibuf_aio.value 0
ib_iop_aioread.value 0
ib_iop_aiowrite.value 0
[root@localhost ~]#
Unknown section: INDIVIDUAL BUFFER POOL INFO

MySQL構成によっては殆どのデータが取得できない事があります。/var/log/munin/munin-update.logをよく観察すると、殆どの監視項目において”no data for label”と表示されているのが分かります。

[root@localhost ~]# tail -f /var/log/munin/munin-update.log
2014/07/11 01:15:13 [WARNING] Service mysql_connections on localhost.localdomain/172.31.3.22:4949 returned no data for label Connections
2014/07/11 01:15:13 [WARNING] Service mysql_connections on localhost.localdomain/172.31.3.22:4949 returned no data for label Threads_connected
2014/07/11 01:15:13 [WARNING] Service mysql_connections on localhost.localdomain/172.31.3.22:4949 returned no data for label max_connections
2014/07/11 01:15:13 [WARNING] Service mysql_connections on localhost.localdomain/172.31.3.22:4949 returned no data for label Aborted_clients
2014/07/11 01:15:13 [WARNING] Service mysql_connections on localhost.localdomain/172.31.3.22:4949 returned no data for label Max_used_connections
2014/07/11 01:15:13 [WARNING] Service mysql_connections on localhost.localdomain/172.31.3.22:4949 returned no data for label Aborted_connects

何が起きているかを確かめるため、munin-runコマンドも用いて手動でデータを取得します。

[root@localhost ~]# munin-run mysql_commands
Unknown section: INDIVIDUAL BUFFER POOL INFO at /etc/munin/plugins/mysql_commands line 1098.
[root@localhost ~]#

/etc/munin/plugins/mysql_commandsの1098行目前後を読むと、どうやらSHOW ENGINE INNODB STATUSのパース処理でエラーが出力されている事が読み取れます。

SHOW ENGINE INNODB STATUSの出力を観察すると、”Unknown section: INDIVIDUAL BUFFER POOL INFO”というメッセージの通り、INDIVIDUAL BUFFER POOL INFOというセクションが存在する事が分かります。

[root@localhost ~]# mysql -uroot -e "SHOW ENGINE INNODB STATUS"
+--------+------+---------------------------------------------

 <omitted>

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 49089216512; in additional pool allocated 0
Dictionary memory allocated 172322
Buffer pool size   2927548
Free buffers       1144135
Database pages     1783286
Old database pages 658118
Modified db pages  59312
Pending reads 0
Pending writes: LRU 0, flush list 59, single page 0
Pages made young 429881, not young 19593139
0.00 youngs/s, 0.00 non-youngs/s
Pages read 189920, created 2121354, written 9726037
0.00 reads/s, 5.99 creates/s, 4356.64 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 1783286, unzip_LRU len: 0
I/O sum[552608]:cur[9048], unzip sum[0]:cur[0]
----------------------
INDIVIDUAL BUFFER POOL INFO
----------------------
---BUFFER POOL 0
Buffer pool size   365944
Free buffers       143543
Database pages     222384
Old database pages 82070
Modified db pages  7913
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 54478, not young 37127
0.00 youngs/s, 0.00 non-youngs/s
Pages read 24412, created 264143, written 1284170
0.00 reads/s, 0.00 creates/s, 683.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 222384, unzip_LRU len: 0
I/O sum[69076]:cur[1131], unzip sum[0]:cur[0]
---BUFFER POOL 1
Buffer pool size   365943
Free buffers       143094
Database pages     222836
Old database pages 82237
Modified db pages  7438
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 53770, not young 703
0.00 youngs/s, 0.00 non-youngs/s
Pages read 23956, created 265010, written 1212636
0.00 reads/s, 0.00 creates/s, 603.40 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 222836, unzip_LRU len: 0
I/O sum[69076]:cur[1131], unzip sum[0]:cur[0]
---BUFFER POOL 2
Buffer pool size   365944
Free buffers       143266
Database pages     222660
Old database pages 82172
Modified db pages  7916

munin mysqlプラグインは、innodb buffer poolが複数に分かれる場合に対応していない事が分かりました。この現象を回避するには、INDIVIDUAL BUFFER POOL INFOに関するパース処理をスキップするよう/usr/share/munin/plugins/mysql_を改修します。

--- mysql_      2014-07-11 21:25:17.223518994 +0900
+++ /usr/share/munin/plugins/mysql_     2014-07-11 21:24:49.293507918 +0900
@@ -1065,40 +1065,41 @@
 sub parse_innodb_status {
     local $_ = shift;

     # Add a dummy section to the end in case the innodb status output
     # has been truncated (Happens for status > 64K characters)
     $_ .= "\n----------\nDUMMY\n";

     my %section_map = (

        'BUFFER POOL AND MEMORY'   => \&parse_buffer_pool_and_memory,
        'FILE I/O'                 => \&parse_file_io,
        'INSERT BUFFER AND ADAPTIVE HASH INDEX'
            => \&parse_insert_buffer_and_adaptive_hash_index,
        'LATEST DETECTED DEADLOCK' => \&skip,
        'LATEST FOREIGN KEY ERROR' => \&skip,
        'LOG'                      => \&parse_log,
        'ROW OPERATIONS'           => \&skip,
        'SEMAPHORES'               => \&parse_semaphores,
        'TRANSACTIONS'             => \&parse_transactions,
        'BACKGROUND THREAD'        => \&skip,
+       'INDIVIDUAL BUFFER POOL INFO'        => \&skip,
     );

     skip_heading();
     for (;;) {
        m/\G(.*)\n/gc;
        my $sec = $1;

munin-runコマンドを実行し、エラーが解消された事を確認します。

[root@localhost ~]# munin-run mysql_commands
Com_delete.value 6546
Com_insert.value 226170
Com_insert_select.value 0
Com_load.value 0
Com_replace.value 0
Com_replace_select.value 0
Com_select.value 1297378
Com_update.value 15288
Com_update_multi.value 0
[root@localhost ~]#

XML::SAX::Base.3pm.gz conflicts

epel, rpmforgeの2つのリポジトリを有効にしてしまうと、現時点(2014/06/22)では以下のような依存環境のエラーが発生します。

[root@localhost ~]# yum install munin-node

 <omitted>

================================================================================
 Package                      Arch      Version               Repository   Size
================================================================================
Installing:
 munin-node                   noarch    2.0.21-1.el6          epel        399 k
Installing for dependencies:
 munin-common                 noarch    2.0.21-1.el6          epel         87 k
 perl-Crypt-DES               x86_64    2.05-9.el6            epel         19 k
 perl-DBD-Pg                  x86_64    2.15.1-4.el6_3        base        196 k
 perl-DBI                     x86_64    1.609-4.el6           base        705 k
 perl-Digest-HMAC             noarch    1.01-22.el6           base         22 k
 perl-Digest-SHA1             x86_64    2.12-2.el6            base         49 k
 perl-List-MoreUtils          x86_64    0.22-10.el6           base         53 k
 perl-Net-CIDR                noarch    0.14-1.el6            epel         17 k
 perl-Net-DNS                 x86_64    0.65-5.el6            base        232 k
 perl-Net-SNMP                noarch    5.2.0-4.el6           epel        100 k
 perl-Net-Server              noarch    0.99-1.el6.rf         rpmforge    171 k
 perl-Time-HiRes              x86_64    4:1.9721-136.el6      base         48 k
 perl-XML-LibXML              x86_64    1:1.70-5.el6          base        364 k
 perl-XML-NamespaceSupport    noarch    1.10-3.el6            base         17 k
 perl-XML-SAX                 noarch    0.96-7.el6            base         78 k
 perl-XML-SAX-Base            noarch    1.04-1.el6.rf         rpmforge     27 k
 postgresql-libs              x86_64    8.4.20-1.el6_5        updates     201 k
 sysstat                      x86_64    9.0.4-22.el6          base        230 k

Transaction Summary
================================================================================
Install      19 Package(s)

 <omitted>

Transaction Check Error:
  file /usr/share/man/man3/XML::SAX::Base.3pm.gz conflicts between attempted installs of perl-XML-SAX-0.96-7.el6.noarch and perl-XML-SAX-Base-1.04-1.el6.rf.noarch
  file /usr/share/man/man3/XML::SAX::Exception.3pm.gz conflicts between attempted installs of perl-XML-SAX-0.96-7.el6.noarch and perl-XML-SAX-Base-1.04-1.el6.rf.noarch

Error Summary
-------------

rpmforgeのperl-XML-SAX-Baseが新しい過ぎるため、依存関係のエラーが発生しています。以下のようにリポジトリをbaseとepelに限定する事で、依存関係を解消する事ができます。

# yum install --disablerepo=* --enablerepo=base,epel munin-node

Invalid UTF-8 string passed to pango_layout_set_text()

munin-cronコマンド実行時に以下のようなエラーメッセージが表示される事があります。

# sudo -u munin munin-cron
(process:29465): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

これはmunin-plugin内にUTF-8以外の文字が紛れ込んでしまったためです。 以下のファイルの”°”を削除する事で対応可能です。

--- hddtemp_smartctl.bak 2012-05-20 16:45:21.000000000 +0900
+++ hddtemp_smartctl 2012-05-20 16:45:39.000000000 +0900
@@ -135,7 +135,7 @@
} elsif ($ARGV[0] eq 'config') {
print "graph_title HDD temperature\n";
print "graph_args --base 1000 -l 0\n";
- print "graph_vlabel temp in °C\n";
+ print "graph_vlabel temp in C\n";
print "graph_category sensors\n";
print "graph_info This graph shows the temperature in degrees Celsius of the hard drives in the machine.\n";
print "$_.label $_\n" foreach @drives;

PHP Parse error: syntax error, unexpected T_STRING

PHPの設定によっては、Parse errorによりブラウズができない事もあります。 ブラウザで白い画面が表示されapache error logに以下のようなPHP Parse errorが出力されている場合は、 php.iniの設定を疑います。

# tail -f /var/log/httpd/error_log
[Sun May 20 11:40:21 2012] [error] [client XX.XX.XX.XX] PHP Parse error: syntax error, unexpected T_STRING in /var/www/munin/index.html on line 1
[Sun May 20 11:40:36 2012] [error] [client XX.XX.XX.XX] PHP Parse error: syntax error, unexpected T_STRING in /var/www/munin/index.html on line 1

これはshort_open_tagの機能によるものです。 short_open_tagとは、<?php ?>だけでなく、<? ?>もphp tagとして認める機能です。 PHP5ではshort_open_tagはデフォルトで有効になっていますが、 この機能は<?xml version=”1.0″ encoding=”iso-8859-1″?>のようなXML宣言をPHPタグと誤解してしまう難点があります。 muninによって生成されるHTMLはXML宣言を含んでいますので、 /etc/php.iniを以下のように編集しshort_open_tagを無効化させて下さい。

--- php.ini.bak 2012-05-21 00:24:03.000000000 +0900
+++ php.ini 2012-05-20 11:46:13.000000000 +0900
@@ -138,7 +138,7 @@
; servers which are not under your control, because short tags may not
; be supported on the target server. For portable, redistributable code,
; be sure not to use short tags.
-short_open_tag = On
+short_open_tag = Off

; Allow ASP-style <% %> tags.
asp_tags = Off

動作確認

動作確認を行った環境は以下の通りです。

  • 動作確認日 : 2015/01/03
  • CentOS 6.6 64bit (Sakura VPS), Redhat 6.5 64bit ( AWS : Amazon Web Service )
  • munin-2.0.25-1
  • munin-node-2.0.25-1
タイトルとURLをコピーしました