Sensuプラグインをインストール、設定して、監視/通知してみようSensuで始めるクラウド時代のシステム監視(5)

新たなクラウド監視ツールとして注目され始めている「Sensu」の活用方法を解説する本連載。今回は、Sensuが監視や通知を行う際に使用するプラグインのインストールと設定方法、独自プラグインの開発方法を解説します。

» 2017年05月16日 05時00分 公開
[堀内晨彦@IT]
「Sensuで始めるクラウド時代のシステム監視」のインデックス

連載目次

Sensuプラグインを使って監視/通知する

 前回は、「Sensu」本体とSensuのダッシュボードである「Uchiwa」のインストールと設定方法を説明しました。設定ファイルがJSON形式で簡素であること、「Ansible」などの構成管理ツールを利用することでミドルウェアの導入も含めた構築を自動化できるという点を理解いただけたと思います。

 今回はSensuが監視や通知を行う際に使用するプラグインについて、そのインストールと設定方法、そして、簡単な独自プラグインの開発方法を説明します。

Sensuプラグインとは?

 Sensuのプラグイン(Sensu Plugins)はコミュニティーの有志によって開発されており、「Sensu Plugins」で公開されています(画面1)。以前は「Sensu Community Plugins」と呼ばれていましたが、リニューアルされたようです。

画面1 画面1 「Sensu Plugins」サイト。ここでSensuのプラグインが公開されている

 CPUやメモリといった基本的な項目から、「Redis」や「Elasticsearch」といったミドルウェアまで、監視に必要なプラグインは一通りそろっているため、まずはここを見るとよいでしょう。

 Sensuのv0.21以降では、「sensu-install」コマンドを使うことで簡単にプラグインをインストールすることができます。

 例えば、「sensu-plugins-cpu-checks」をインストールする場合は、以下のsensu-installコマンドを実行します。


# sensu-plugins-cpu-checksをインストール
$ sudo sensu-install -p cpu-checks
# CPU使用率を監視するプラグインを手動で実行
$ /opt/sensu/embedded/bin/check-cpu.rb
CheckCPU TOTAL OK: total=0.0 user=0.0 nice=0.0 system=0.0 idle=100.0 iowait=0.0 irq=0.0 softirq=0.0 steal=0.0 guest=0.0 guest_nice=0.0
▲sensu-installコマンドでプラグインをインストールする(bash)

 内部では「Gem」(Rubyのライブラリマネージャ)を使っており、依存するライブラリもインストールされます。プラグインは、Sensu同梱のRubyのディレクトリ(/opt/sensu/embedded)に保存されます。

Sensuで利用可能な3種類のプラグイン

 Sensuのプラグインには「Check」「Handler」「Mutator」の3種類があります。ここでは、それぞれの機能と設定をチュートリアル形式で説明していきます。前回までに構築したオールインワンのSensu環境で試しながら読み進めてください。

Check

 「Check」は、実際に監視したり、メトリクスを測定したりするためのプラグインです。以下のような項目を監視したり、測定したりできます。


  • CPUやメモリ、ディスクの使用率が閾値を越えていないか
  • ミドルウェアのサービス(デーモン)は起動しているか

 設定は「sensu-server」上で行い、プラグインは実行する各「sensu-client」にインストールします。ここでは、先ほどインストールした「check-cpu.rb」の設定例を紹介します。

 最初に、sensu-serverで「/etc/sensu/conf.d/check-cpu.rb」を下記の内容で作成します。準備ができたら、設定を有効にするためにsensu-serverを再起動してください。


{
  "checks": {
    "check-cpu": {
      // CPU使用率が80%以上でWARNING、90%以上でCRITICAL
      "command": "check-cpu.rb -w :::cpu.warning|80::: -c :::cpu.critical|90:::",
      // 60秒間隔で監視を実行
      "interval": 60,
      // 10回の監視(10分)ごとに通知
      "refresh": 10,
      // subscriptionsにallを含むsensu-clientを監視
      "subscribers": ["all"],
      // 次章で設定するhandler-slackで通知
      "handlers": ["slack"]
    }
  }
}
▲/etc/sensu/conf.d/check-cpu.rb

 次に、sensu-clientの設定ファイルを開き、「subscriptions」の配列に「all」を追加します。sensu-clientを再起動してしばらく待つと、監視結果をUchiwa上で確認できるようになります(画面2)。

画面2 画面2 Uchiwa上でCPUの監視結果を確認できる

 また、sensu-clientごとにアラートを出す閾値を変更することもできます。sensu-clientの設定ファイル(/etc/sensu/conf.d/client.json)に下記のように「cpu」項目を追加して再起動します(プラグイン設定の「cpu.warning」や「cpu.critical」に対応しています)。


{
  "client": {
    "subscriptions": ["all"],
    "cpu": {
      "warning": 70,
      "critical": 80
    }
  }
}
▲/etc/sensu/conf.d/client.json

Handler

 「Handler」は、監視結果をメールやチャットを介して通知するためのプラグインです。「PagerDuty」など、他のエスカレーションを行うサービスと連携させることも可能です。ここでは、Slackに通知する「sensu-plugins-slack」の設定を紹介します。

 sensu-installコマンドでプラグインをインストールし、設定ファイルを作成します。Handlerはsensu-server上で実行されるため、sensu-client側での準備は不要です。


# sensu-plugins-slackをインストール
$ sudo sensu-install -p slack
▲sensu-plugins-slackのインストール(bash)


{
  "handlers": {
    "slack": {
      "type": "pipe",
      "command": "handler-slack.rb"
     }
  },
  "slack": {
    // https://my.slack.com/services/new/incoming-webhook/ でURLを作成
    "webhook_url": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
    // https://github.com/sensu-pluginsのアイコンを使用
    "icon_url": "https://avatars2.githubusercontent.com/u/10713628"
  }
}
▲/etc/sensu/conf.d/handler-slack.rb

 CPU使用率が閾値を越えると、10分ごとにSlackに通知されます(画面3)。通知文面はカスタマイズすることも可能です。詳細は「README」をご覧ください。

画面3 画面3 CPU使用率の監視結果がSlackに通知された

Mutator

 「Mutator」は、Checkの監視結果をHandlerに渡す前に整形するためのプラグインです。あまり使う機会はないのですが、他のサービスと連携するときに必要な場合があるようです。

 例えば、Sensuで取得したメトリクスを「Graphite」に保存できるように、sensu-client名に含まれる「.(ピリオド)」を「_(アンダースコア)」に置換するMutatorが提供されています。

【番外編】Filterの紹介

 Sensuにはプラグインに近い機能として「Filter」があります。

 Filterの条件に一致する場合は、Checkの実行結果(Event)がHandlerに渡されます。ここでは、よく使いそうなFilterを2つ紹介しましょう。

商用環境(production)のアラートだけ通知する


{
  "filters": {
    "filter-production": {
      "attributes": {
        // ClientやCheckの属性でフィルタリング可能
        "client": {
          "environment": "production"
        }
      }
    }
  }
}
▲/etc/sensu/conf.d/filter-prodction.json

メンテナンス時間(金曜日20時台)はアラートを通知しない


{
  "filters": {
    "filter-maintenance": {
      // 条件に一致しない場合にHandlerで処理
      "negate": true,
      "attributes": {
        // evalでRubyのコードを使用可能、属性の値はvalueに格納
        "check": {
          "executed": "eval: Time.at(value).wday == 5 && Time.at(value).hour == 20"
        }
      }
    }
  }
}
▲/etc/sensu/conf.d/filter-maintenance.json

 Filterを追加したら、設定を有効にするためにsensu-serverを再起動してください。アラートを通知する条件は細かく設定することができるので、ぜひ活用してみてください。

独自のプラグインを作成してみよう

 Sensu Pluginsには用意されていない、独自のサービスなどを監視したい場面もあると思います。そんなときは、独自のプラグインを簡単に開発することができます。

 Sensuでは、プラグインの開発を補助する「sensu-plugin」というライブラリが提供されています。今回は例として、URLにアクセスし、意図したステータスコードが帰るかどうかを確認するプラグインを作ってみます。


#!/opt/sensu/embedded/bin/ruby
require 'sensu-plugin/check/cli'
require 'net/http'
class CheckHttp < Sensu::Plugin::Check::CLI
  option :url, short: '-u URL', long: '--url URL'
  option :status, short: '-s CODE', long: '--status CODE'
  def run
    response = Net::HTTP.get_response(URI.parse(config[:url]))
    if response.code == config[:status]
      ok "#{config[:url]} #{response.code}"
    else
      critical "#{config[:url]} #{response.code}"
    end
  end
end
▲/opt/sensu/embedded/bin/check-http.rb

 「option」でコマンドラインオプションを定義し、「config」に格納されます。また、「/etc/sensu/conf.d」の設定ファイルも「settings」で読み込むことができます(「handler-slack.rb」の場合は、「settings[:slack][:webhook_url]」など)。

 例えば、「http://www.atmarkit.co.jp」が200を返すことを確認する場合は、以下のようなコマンドになります。


$ /opt/sensu/embedded/bin/check-http.rb -u http://www.atmarkit.co.jp -s 200
CheckHttp OK: http://www.atmarkit.co.jp 200
▲URLにアクセスし、意図したステータスコードが帰るかどうかを確認するコマンド

 CheckだけでなくHandlerも開発できるので、ぜひ独自プラグインを作成してみてください。

 SensuのプラグインはRubyが一般的ですが、数が増えるとオーバーヘッドが大きくなりがちです。言語は限定されていないため、筆者は高速なGo言語でプラグインを開発していました。簡単なライブラリもありますので、興味のある方は使ってみてください。

終わりに

 今回はSensuの3種類のプラグイン「Check」「Handler」「Mutator」のインストールと設定方法、sensu-pluginライブラリを使った独自プラグインの開発方法について説明しました。Sensu Pluginsには多くのプラグインが用意されており、ない場合も自分で簡単に開発することできます。

 次回はSensuで取得したCPU使用率などのメトリクスを時系列データベースに格納し、可視化ツールを使ってグラフやダッシュボードを作る方法について説明します。

筆者紹介

堀内 晨彦(ほりうち あきひこ)

生まれも育ちも香川県。香川大学大学院 情報科出身。学生時代は研究の傍ら、勉強会やコミュニティー活動に積極的に参加し、「Sensu Deep Talks」などを主催。2016年4月からは上京し、ICT企業でベアメタルクラウドの開発に従事。趣味は料理とカメラ。

Webサイト:https://hico-horiuchi.github.io/


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。