Muninを(^ω^)ペロペロするスクリプトを書いてみた(muniinwalk/muninget)

Muninを(^ω^)ペロペロするスクリプトを書いてみた(muniinwalk/muninget) はてなブックマーク - Muninを(^ω^)ペロペロするスクリプトを書いてみた(muniinwalk/muninget)


先日、GitHub に Munin のデータを取得する CLI を公開しました。

muninwalk and muninget – GitHub
https://github.com/zembutsu/muninwalk

今日のポストは、Munin についてと、コミットした muninwalk と muninget の概要。そして、簡単なチュートリアルです。使い方だけが知りたい場合は、後半をご覧くだしあ

muninwalk および muninget は、コマンドラインで munin-node から、手軽にデータを取得出来るツールです。

<実行例>
$ muninwalk localhost load
localhost::load.load = 0.21

◆munin とは?

Munin というリソースモニタリング用のツールはご存知ですか? Munin は、サーバのリソース推移の監視に特化したツールです。Munin はPerl で書かれていて、オープンソースとして公開されています。現在の安定版は version 1.4 系です。version 2.0 系が開発中で、今年に入ってからは頻繁に RC 版(正式リリース候補版)が公開されており、開発も活発になってきてます。

サーバのリソースというのは、メモリの使用率だったり、CPU の使用率、空きメモリ、Load Average の推移、トラフィック容量…などなどです。実際の画面は、Munin 2.0 のサンプルのページを公開していますので、ご覧下さい。

Munin のアーキテクチャは、非常にシンプル。Perl 言語で書かれている Munin は、データを収集する役割と、収集したデータを元にグラフ生成します。Munin は、Munin-node (Perl でサーバに常駐する軽量エージェント)と TCP 経由で通信を行います(デフォルトでは TCP Port 4949 を経由し、5分間ごとにデータの収集を行います)。ここで収集するリソースは、munin-node に対応したプラグインで指定することが可能です。プラグインは、デフォルトでも数多く用意されています。特に何も気にしなくても、非常に多くのプラグインを自動実行することが出来るでしょう。

一般的なツールと違い、MySQL のクエリ数の推移を表示するプラグインや、HTTP の応答時間の表示、Apache の稼働状況など、比較的簡単に取得出来ます。また、プラグインの作成も非常にシンプルです。Munin は数値化できるものは、基本的に何でも視覚化できます。

他の監視ツールやリソース視覚化ツールとの違いは、「構造がシンプル」な事。Perl が動作する環境であれば、動作します。特段、データベースの設定も必要ありません。簡単にインストールして、すぐに使えるのが良いところだと思います。

詳しくは、私の Slideshare の投稿をご覧下さい。

◆ Muninget & Muninwalk

監視と言えば、古くから SNMP が一般的ですが、そこからパクッた…のではなく、インスパイアされたというか、ヒントを得たのが muninwalk / muninget であります。その名前の通り、SNMP の OID のように、リモート上の munin-node から、データを取得して、表示するだけのシンプルなものです。

そんな、俺得ツールです。以上
…だと何も分からないと思いますので、少々の補足をさせてください。

もし障害が発生したら、皆さんどうされていますか?
同時に複数のサーバを比較・確認しなくてはいけないときに、助かるのが Munin です。

僕は普段、インフラエンジニア的な仕事をしています。その中でも、とりわけ運用(オペレーション)や、運用に付随するシステムの開発を行っています。運用と言えば、障害は切り離せません。

例えば「Webサーバの応答が重くなった場合」です。サーバが完全に落ちてしまっている場合であれば、電源オフオン対応しか手段はありません。しかし、判断が付かないとき(例えば”妙にサイトが重たい”場合)は、まず対象サーバにログインすることが殆どだと思います。

一昔前の Web 系システムの環境は、さほどサーバの台数は多くありませんでした。サーバの運用環境は、1~2台程度、多くても片手で収まる範囲のシステムが殆どだったように思います。台数が少ない場合は、それぞれのサーバにログインして、コマンドを実行するのも、さほど大変ではありませんでした。

しかし、今日では、管理する対象サーバの台数が非常に多くなってきています。この背景には、SNS の発展やモバイルコンピューティングの発達、Eコマースの普及など、様々用途があると思いますが…とにかく増えています。

私の場合、サーバにログインしたあとは、uptime コマンドを実行し、誰かが作業をしていないかや、load average の状況を確認します。そして top を実行しつつ、メモリの状況や CPU 使用率の推移を観察、ログの確認、sar 実行…等々調べます。しかし、Munin があれば、ログインせずとも、視覚的に複数のサーバの推移を把握することが出来るのです。

さて、それでは muninwalk と muninget が出てきた背景。

確かに、障害発生時、画面を見て状況を把握するのも1つの方法ではあります。ですが、結局はサーバにログインして、コマンドを叩かざるを得ません。しかし、複数のサーバの状況を同時に把握するには、色々なツールを使う必要があります。そんな時、

「munin のデータを取得できる CLI があれば、便利じゃね?」

と思い、コードを書き始めました。それと、CEP ( Complex Event Engine ) を使い、通常の監視システムが検出できないような「短時間」かつ「複雑な状況」を監視・判定・通知する仕組みが出来ると、現場的に楽になるのではという考えも出てきました。こちらは、別途取組中です。

監視のアイディア(イベント駆動監視)については、次のスライドをご覧下さい。

 

◆必要環境

  • Perl 5 が動作する環境
  • OS : Linux (開発環境は Red Hat Enterprise Linux 5)

◆インストール方法

# wget https://github.com/zembutsu/muninwalk/blob/master/muninwalk.pl
# mv ./muninwalk.pl /usr/local/bin/muninwalk
# chmod 755 /usr/local/bin/muninwalk

動作確認は、単純に muninwalk と実行してみてください。

$ muninwalk
No hostname specified.
USAGE: muninwalk <HOSTNAME[:PORT]> COMMAND [COMMAND...] [OPTION]

  Version: 0.0.1
  Github:  http://github.com/zembutsu/
  Web:     http://pocketstudio.jp/
  Email:   zem@pocketstudio.jp

COMMAND:
  list                display node enable plugins
  nodes               dispaly nodes
  <plugins names>     fetch data
  version             display munin-node's version
  walk                walkmode (fetch all plugins data)

OPTION:
  -c[char]            change delimiter
  -d                  debug mode
  -h                  display this help message
  -v                  version

◆muninwalk・muninget チュートリアル

ヘルプは README をご覧下さい。
https://github.com/zembutsu/muninwalk/blob/master/README

一番簡単な使い方は、「muninwalk ホスト名」と指定することです。引数無しで実行すると、対応しているプラグインの一覧情報を表示します。ホスト名は、ローカルホスト(127.0.0.1)でもリモートでも構いません。通常の munin の設定と同様、munin.conf でポートへの接続が許可されている(allow)環境であれば、データを取得することが出来ます。

$ muninwalk localhost
acpi apache_accesses apache_processes apache_volume cpu cpubyuser df
 df_inode entropy forks fw_packets hddtemp_smartctl http_loadtime
if_err_eth0 if_eth0 interrupts iostat iostat_ios irqstats load load1
 load15 memory mysql_ mysql_bytes mysql_innodb mysql_isam_space_
mysql_queries mysql_slowqueries mysql_threads netstat open_files
open_inodes postfix_mailqueue postfix_mailvolume postgres_bgwriter
postgres_cache_ postgres_checkpoints postgres_connections_
postgres_connections_db postgres_locks_ postgres_querylength_
postgres_scans_ postgres_size_ postgres_transactions_ postgres_tuples_
postgres_users postgres_xlog proc_pri processes sendmail_mailqueue
sendmail_mailstats sendmail_mailtraffic smart_sda smart_sdb swap tcp
threads uptime users vmstat yum

もし接続できない場合は、ネットワークの疎通状況や、munin.conf における許可状況、あるいは iptables やファイアウォール等の
設定をみなおしてください。

このように引数が無かった場合は、デフォルトで「list」モードが実行されます。list モードは、munin-node のプラグイン情報の一覧を表示します。

list モードで表示されるプラグイン情報は、muninwalk や muninget で全て取得可能です。

次に、munin-node が持っている情報を、すべて表示させてみましょう。munin-node が持っている情報をすべて表示したい場合は「walk」オプションをつけてください。

$ muninwalk localhost walk | more
## WALKMODE ##
localhost::acpi.* = proc
localhost::apache_accesses.accesses80 = 16109394
localhost::apache_processes.busy80 = 2
localhost::apache_processes.idle80 = 16
localhost::apache_processes.free80 = 1238
localhost::apache_volume.volume80 = 219911081984
localhost::cpu.user = 103318974
localhost::cpu.nice = 40498612
localhost::cpu.system = 22262438
localhost::cpu.idle = 1992649581
localhost::cpu.iowait = 49873357
localhost::cpu.irq = 264704
localhost::cpu.softirq = 1510104
localhost::cpu.steal = 0
localhost::cpubyuser.zem = 0
localhost::cpubyuser.web = 0.4
localhost::cpubyuser.mysql = 0
localhost::cpubyuser.postgres = 0
localhost::df._dev_sda2 = 59.9751203633782
localhost::df._dev_sda1 = 7.904156843711
localhost::df._dev_shm = 0
(長いので残りは省略)

ここで表示されるのは「ホスト名::プラグイン名.value名 = 値(value)」の形式です。

———————————
localhost::cpu.user = 103318974
ホスト名   プラグイン名  value
———————————

<データを取得してみよう!>

チュートリアルでは、ディスク容量の情報を確認してみましょう。

この中で、ディスクの使用率プラグイン “df” の値だけを出したいときは、
次のように実行してください。

$ muninwalk localhost df
localhost::df._dev_sda2 = 59.9751203633782
localhost::df._dev_sda1 = 7.904156843711
localhost::df._dev_shm = 0
localhost::df._dev_sda3 = 40.5221073508594
localhost::df._dev_sdb1 = 3.74608679016492

ここでは df プラグインが持っている情報を、すべて返します。
表示される順番は、プラグインが持っているままで読みにくい場合があります。そんなときは、sort にパイプすると便利です。

$ muninwalk localhost df | sort
localhost::df._dev_sda1 = 7.904156843711
localhost::df._dev_sda2 = 59.9751203633782
localhost::df._dev_sda3 = 40.5221424165673
localhost::df._dev_sdb1 = 3.74608679016492
localhost::df._dev_shm = 0

このように、結果が読みやすくなります。

プラグイン名だけを指定した状態では、複数の情報が表示されます。特定の情報、たとえば /dev/sda1 の情報だけ知りたい場合は、プラグン名のあとに、要素名を入力します。

$ muninwalk localhost df._dev_sda1
localhost::df._dev_sda1 = 7.904156843711

このように入力すると、該当する値だけが表示されます。

もし /dev/sda1 と /dev/sda2 の情報を知りたい場合は、どうしたらいいでしょうか。
オプションとして、複数の要素の指定が可能です。

$ muninwalk localhost df._dev_sda1 df._dev_sda2
localhost::df._dev_sda1 = 7.904156843711
localhost::df._dev_sda2 = 59.9750893689919
要素はスペースで区切ります。

このように、指定した要素分だけの情報が表示されます。

次に、複数のホストからデータを取得したい場合。それは muninget を使います。

muninwalk と muninget の基本的な構造は同じですが、少々役割が違います。

  • muniinwalk … 単一ホストから複数のメトリクスを取得する
  • muninget … 複数ストから単一メトリクスを継続取得する(ループ)

muninget も、 muninwalk と使い方は同じです。ローカルホストの Load Average を継続取得したい場合は、次のように実行します。

$ muninget localhost load
12/04/11 21:41:06.084646::localhost::load.load = 0.16
12/04/11 21:41:07.136572::localhost::load.load = 0.16

このように、muninget はコマンド実行時の時刻を表示します。中断したいときは Ctrl+C です。

複数のホストからデータを取得したい場合は、ホスト名を「,」で区切ります。例えば、node1とnode2とうホスト名のmunin-nodeからの取得は次のようになります。

$ muninget node1,node2 load
12/04/11 21:42:51.895727::node1::load.load = 0.67
12/04/11 21:42:51.946590::node2::load.load = 0.13
12/04/11 21:42:53.000443::node1::load.load = 0.66
12/04/11 21:42:53.051397::node2::load.load = 0.13

また、デフォルトではループ間隔は 1秒です。-s オプションで変更が可能です。例えば、0.5秒間隔で実行したい場合、次のようにします。

$ munin node1,node2 load -s0.5
12/04/11 21:44:55.674071::node1::load.load = 0.57
12/04/11 21:44:55.724940::node2::load.load = 0.12
12/04/11 21:44:56.280103::node1::load.load = 0.57
12/04/11 21:44:56.331063::node2::load.load = 0.12

ただし、プラグイン実行に時間がかかるのものについては、当然値の取得にも時間がかかります。またサーバの負荷になってしまうものもありますので、ご注意ください(vmstatプラグイン系)

◆既知のバグ

diskstat  など階層系のプラグインには、まだ対応できていません。今後対応予定です。また、表示形式のフォーマット機能は実装予定です。データそのままでは読みづらい場合、sprintf のように、ケタ数や単位の整形ができるような仕組みを考えています。

◆まとめ

いろいろ長くなりましたが、

Munin(^ω^)ペロペロ ←結論

であります。
もし宜しければ、フィードバックをいただけると、とっても嬉しいかなってヽ(・∀・)ノ

http://munin-monitoring.org/

2 thoughts on “Muninを(^ω^)ペロペロするスクリプトを書いてみた(muniinwalk/muninget)