ようへいの日々精進XP

よかろうもん

たかが monit されど monit ... M/Monit で垣間見た monit の本当の実力

ども、かっぱです。

M/Monit って...

monit をエージェントとして動作する統合監視ツール

f:id:inokara:20150306093200p:plain

monit のドキュメントとか設定ファイルを見ていて、しょっちゅう M/Monit って文字が踊っているのでなんだろって思っていたら...

monit をエージェントとして利用している統合監視ツールようです。iPhone やアンドロイド端末向けのクライアントアプリも提供されていたり、HTTP API を利用して監視の状態を取得出来たりとなかなか面白そうな統合監視ツールかと思います。残念ながら(という言い方は良くないかもしれませんが...)有償とはなっていますが、一回払いきりのライセンスのようですので意外に安い印象です。

f:id:inokara:20150306093353p:plain

ということで、今回は 30 日間のお試し期間をダウンロードして試してみたいと思います。

で、monit て...

(個人的に)monit は対象となるプロセスを監視して、プロセスが停止したら自動的に叩き起こすツールだと思っていました。そう、M/Monit に出会うまでは...。M/Monit を使うことでタダのプロセス叩き起こしツールから monit が稼働するサーバーの監視ツールとしての片鱗を見ることが出来ました。

M/Monit と monit のアーキテクチャ

ドキュメントには以下のように書かれています。

Monit is a small, powerful monitoring program that runs on each host monitored by M/Monit. With regular intervals, Monit will send a message to M/Monit with the status of the host it is running on. If a service fails or Monit has to perform an action to fix a problem, an event message is sent to M/Monit at once. Both status and event messages are stored in a database. Upon receiving an event message from Monit, M/Monit will consult its rule-set and perform an alert notification if a rule matched. From M/Monit, you can start, stop and restart services on any of your hosts running Monit.

ざっくり意訳すると...

  • monit からホストの状態を M/Monit にメッセージを送る
  • もしホストで問題(監視しているプロセスが止まったりしたら)があれば monit は問題を解決した上で M/Monit にイベントを通知する
  • M/Monit はその通知を保存する(保存先は多分 sqlite
  • monit からの通知を受けると M/Monit はルールに基づいた通知を送る
  • M/Monit からは各種サービスの起動や停止、再起動を実行することが出来る

リンク


試す

環境

以下のような環境を Docker コンテナで用意しました。

  • M/Monit 環境✕ 1
  • monit 入りサーバー✕ 3

OS はおなじみの CentOS 6 系で...。

ちなみに M/Monit 環境のコンテナは以下のように起動して 8080 ポートへアクセス出来るようにしておきましょう。

docker run --name=mmonit -t -i -p 8080 -d your_mmonit_image

monit のインストールと設定

monit の設定は以下のように yum で一発!

yum install --enablerepo=rpmforge monit

rpmforge に登録されている monit がバージョンも新しいので個人的にはオススメでございます。

そして、インストールが終わったら /etc/monit.conf を以下のように設定します。

set daemon  60
set idfile /var/monit/id
set statefile /var/monit/state
set mmonit http://monit:monit@172.17.0.xxx:8080/collector
set httpd port 2812 and
    allow localhost
    allow 172.17.0.xxx

include /etc/monit.d/*

ポイントは set mmonit http://monit:monit@172.17.0.90:8080/collector の部分です。monit から M/Monit の collector にアクセスする為の設定を行っています。上記の例では M/Monit は 172.17.0.xxx 上のコンテナで稼働していてユーザー名 monit 及びパスワード monit でアクセスすることを定義しています。

設定したら以下のように monit を起動しておきましょう。

service monit start

以下のようなメッセージと共に起動します。

Stopping monit:                                            [  OK  ]
Starting monit: monit: Warning: M/Monit registration with credentials enabled, but no suitable credentials found in monit configuration file -- please add 'allow user:password' option to 'set httpd' statement
Starting monit daemon with http interface at [*:2812]
                                                           [  OK  ]

警告メッセージは monit 自身の HTTP インターフェースに認証を設定しましょうという警告となります。今回はお試しなので特に触れずに進めたいと思います。実際の運用の際には HTTP インターフェース自身を有効にするか等は検討する必要があると思います。

M/Monit のインストールと起動

M/Monit のインストールは簡単です。こちらからバイナリを落っことしてきて展開して適当なディレクトリに展開するだけ。

cd /usr/local/src/
wget https://mmonit.com/dist/mmonit-3.4-linux-x64.tar.gz
tar zxvf mmonit-3.4-linux-x64.tar.gz
cp mmonit-3.4-linux-x64 /usr/local/mmonit

起動も簡単。

/usr/local/mmonit/bin/mmonit

起動するとポート 8080 で mmonit が Listen するので、ブラウザで 8080 にアクセスするかコンテナにバインドされているポートにアクセスしましょう。

f:id:inokara:20150307102543p:plain

monit 君(というかは知りませんが)がお出迎えしてくれます。

M/Monit へログイン

デフォルトのユーザー名とパスワードはこちらに記載されている通り、ユーザー名が admin でパスワードが swordfish となるので入力してログインしましょう。

f:id:inokara:20150307102911p:plain

上図はダッシュボードで各ホストの monit から受け取ったメッセージのサマリがグラフによって可視化されています。

Status

Dashboard から Hosts Status をクリックするか、上部メニューの Status をクリックすると M/Monit にメッセージを送ってきているホストの一覧を確認することが出来ます。

f:id:inokara:20150307105333p:plain

一覧から一つをクリックするすると以下のように対象ホストのサマリ(CPU やメモリ使用率、monit で監視しているプロセスの状態)を確認することが出来ます。

f:id:inokara:20150307105621p:plain

上記ではアクティブになっていませんが、監視しているプロセスの起動や停止等を行うことが出来ます。

Reports

個人的には Reports 機能がよく出来ているなーと思っていたりしてます。 上部メニューをクリックすると Analytics / Uptime / Events の三つのサブメニューが現れるのでそれぞれ見ていきます。

f:id:inokara:20150307110111p:plain

まずは Analytics です。これはホストのリソース状態を可視化しています。上図では CPU と Memory 及び Swap と Load average が表示されていますが、ネットワークや対象となるポートのレスポンスタイム等をリアルタイムに分析して表示するようです。グラフの表示も上記の棒グラフに加えて円グラフや折れ線グラフでの表示も可能です。

f:id:inokara:20150307110744p:plain

次に Hosts Uptime です。対象ホストの Uptime のサマリが確認出来ます。

f:id:inokara:20150307110905p:plain

最後に Events です。対象ホストの monit から送られてくるイベントメッセージを確認することが出来ます。

Alarts

全ての機能を紹介するのは疲れるので最後に通知機能を少し。Admin メニューから Alerts を選択すると以下のように表示されます。

f:id:inokara:20150307111718p:plain

通知として利用出来るのは...メールと Jabber と呼ばれる IM サービスのみか... Slack に通知出来たら嬉しいのになあと思っていたら、Slack を通知先にする方法が以下に紹介されていました。

ブログ記事によると...

  • ルールを作成
  • ルールの Execute Program を利用して Slack の API を叩かせる

という若干力技にはなりますが Execute Program を利用することで Slack 以外にも PagerDuty 等に通知を飛ばせることになります。

早速、以下のように仕込んでみました。

f:id:inokara:20150307115047p:plain

スクリプトは以下のようなスクリプトです。

ruby -e "
    require 'net/https'
    require 'json'
    uri = URI.parse('https://hooks.slack.com/services/xxxxx/xxxxx/xxxxxxxxxxxxxxxxxx')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri.request_uri, {'Content-Type' => 'application/json'})
    request.body = { \"channel\"  => \"#monit-notification\", \"username\" => \"mmonit\", \"text\"     => \"[#{ENV['MONIT_HOST']}] #{ENV['MONIT_SERVICE']} - #{ENV['MONIT_DESCRIPTION']}\" }.to_json
    response = http.request(request)
    puts response.body
"

実際に monit で監視する Apache を止めたり、起動させたりすると以下のように Slack に通知が飛んできました。

f:id:inokara:20150307115324p:plain

おおっ。


ということで...

駆け足で M/Monit を触ってみた感想は以下の通りです。

  • monit 一個入れておけばリソースの管理、プロセスの監視をやってくれるのは嬉しい
  • monit だけにプロセスをたたき起こすことも自動で出来る上に M/Monit からコントロール出来るのも嬉しい
  • M/Monit の動作がめっちゃ軽い(台数が少ないってのもあるけど)
  • M/Monit と monit の関係は Sensu と同様に M/Monit 側で情報を持つ必要が無いのでディスポーザブルな環境でも導入し易い
  • 通知機能は一応 Slack 等の外部 API を叩ける
  • 残念ながら有償、でも安いかも

ということで、使用期限が切れるまでは M/Monit で遊んでみたいと思います。