munin でデータを可視化する

今日は少し趣向を変えて [munin](http://munin-monitoring.org/) の話です。

munin といえばサーバーのリソースを外部からモニタリングするツールの定番ですが、ある意味でこれもデータ可視化ソリューションの一種と言えます。

また、プラグイン形式で機能を拡張することができ、その実はサーバーのリソースに限らずありとあらゆるデータを可視化することに使えるというスグレモノです。単なる汎用データ可視化ソフトウェアとしても十分使えます。たとえば日々の各社の株価の推移を munin でグラフにするといったことですら可能です。

さらにそのプラグインは単なる実行形式であり、出力の文字列さえ既定のフォーマットに収まっているなら、どのような言語でも記述することができます。シェルスクリプトや各種スクリプト言語はもちろんのこと、静的言語でコンパイルしたバイナリであろうとも何でもオッケーです。

このような便利モニタリングツールを通して、数値で集積されたさまざまなデータを何でもグラフにして可視化するという習慣を身に付けていくのも一興かと思います。

以下は munin によるデータ可視化の一例です。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/c854efd9-c080-72f6-7a58-389c02b6aaad.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2b6a4c8a-fbd0-e9a7-ac8e-6e4a4b4f9440.png)

どの日の時間帯にどのような負荷が発生してどういったリソースが足りないのかといったことが一目瞭然ですね。

## munin のインストール

まずはパッケージを入れます。

Debian 系 (Ubuntu など)

```bash
sudo apt-get install munin munin-node
```

Red Hat Enterprise Linux (RHEL) またはそのクローン (CentOS など)

```bash
sudo yum install munin --enablerepo=epel 
```

### 注意点など

#### Perl のモジュール perl-XML-SAX がコンフリクトする。

以下を参考に特定バージョンをアンインストールし rpmforge から除外する。
https://github.com/repoforge/rpms/issues/211

#### パッケージが無い。

Debian 系なら non-free リポジトリを、 RHEL 系なら rpmforge を有効にする。

#### 定期的に起動する munin-run が失敗する。

cron ジョブが異常終了するので root 宛にメールが来ます。これは Debian 系の munin のバグで munin-run のパスが見つからないのが原因です。
/etc/cron.d/munin-node を編集して /usr/sbin/munin-run のように絶対パスを指定するよう書き換えるなどすれば解決します。

### プラグインの有効化

/usr/share/munin/plugins の下にプラグインの本体があります。
/etc/munin/plugins にシンボリックリンクを貼ることでプラグインが munin 本体から認識されます。
必要に応じて既定のプラグインを有効にすれば良いでしょう。
以下は一例です。

```bash
# apt を監視する
sudo ln -s /usr/share/munin/plugins/apt              /etc/munin/plugins/
# ntp を監視する
sudo ln -s /usr/share/munin/plugins/ntp_             /etc/munin/plugins/
# S.M.A.R.T. で計測可能な HDD の温度を監視する
sudo ln -s /usr/share/munin/plugins/hddtemp_smartctl /etc/munin/plugins/
```

また独自作成したプラグインは /usr/local/share/munin/plugins に置いて上記と同様シンボリックリンクを貼ると良いでしょう。

### Apache から閲覧可能にする / 認証やアクセス制限を付ける

Apache の conf.d (Debian 系なら conf-available) ディレクトリに munin のための Apache 用設定ファイルがあると思います。

ここに要件に応じて任意の設定を記述すれば良いでしょう。

```bash
# munin が作成するグラフへのエイリアス (/munin で閲覧可能に)
Alias /munin /var/cache/munin/www

# ディレクトリの設定
<Directory /var/cache/munin/www>
  Order allow,deny
  # どこからでも閲覧可能にする (IP によるアクセス制限無し)
  AllowOverride all
  Allow from all
  Options None
  # 一応 Basic 認証をかけておく
  # htpasswd ファイルを指定
  AuthUserFile /etc/apache2/secret/.htpasswd
  AuthName "Munin"
  AuthType Basic
  require valid-user
  <IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault M310
  </IfModule>
</Directory> 
```

munin-node サービスを有効化すれば、あとは自動的に munin-run プログラムが定期実行されてグラフが生成されます。

## munin の設定

[こちら](http://loumo.jp/wp/archive/20130520084003/)が詳しいです。 munin の設定は /etc/munin/muninc.conf で設定できます。主に監視する閾値の変更や、異常時のメールの送付先といったことを設定することが多いでしょう。

以下は閾値の設定例です。まず munin-run 本体の出力を確認します。

```bash
$ munin-run df
_dev_mapper_vg_hoge_LogVol06.value 53.7212929535153
# 現在の値が表示される
# 上記の例ではストレージの使用率が約 53% となっている
```

現在値を見ながら munin.conf に warning と critical の値を設定します。

```
[localhost]
    address 127.0.0.1
    use_node_name yes
    df._dev_mapper_vg_hoge_LogVol06.warning 95
    df._dev_mapper_vg_hoge_LogVol06.critical 98.75
```

上記の設定では 95% を超えたら warning 、さらに 98.75% を超えたら critical という扱いにするよう設定しています。

warning や critical になるとグラフの枠の色が黄色や赤色に変化したり、設定によっては警告のメールが送信されたりします。

## munin の既定のグラフの意味

[このへん](http://www.seeds-std.co.jp/seedsblog/488.html)が親切丁寧で詳しいので参照すると良いです。なので解説は省略します。

## munin を利用した色々なデータの可視化 (独自プラグインの作成)

冒頭で説明した通り munin のプラグインはどのような言語でも作成することができます。とはいえ、最初は既存のプラグインを見よう見真似で作ると良いでしょう。既定のプラグインの多くはシェルスクリプトや Perl です。

作り方は[このへん](http://munin-monitoring.org/wiki/plugins)や[このへん](http://munin-monitoring.org/wiki/HowToWritePlugins)を参照してください。

### プラグインの外部仕様

簡単に言うと、仕様を満たすために次のことをすれば良いです。

#### autoconf 引数で yes を出力する

autoconf を指定した場合は環境のチェックをおこない、適合すれば yes を出力するという仕様にします。

```
$ ./plugin_name autoconf
yes
```

#### config 引数でグラフのタイトルや種類を出力する

config を指定した場合に出力される文字列によってグラフの種類などが決まります。

```
$ ./plugin_name config
graph_title Some Graph
graph_order something
graph_args --base 10 -l 0
graph_vlabel some values
graph_info This graph shows something
graph_category custom
something.label Something
something.draw LINE2
something.warning 10
something.info Value of Something
```

#### 引数無しで観測値を出力する

観測した結果を項目名と数値で出力します。この値が定期的に集計されグラフとなります。

```
$ ./plugin_name
something.value 5
```

外部仕様は以上です。内部実装は自由です。

## まとめ

munin が単なるサーバーリソースのモニタリングツールに止まらず、データ可視化ソフトウェアとして汎用的に利用できることがおわかりになったかと思います。

日々計測する必要のある数値は munin のプラグインで可視化するといった方法もひとつのソリューションです。