新たなクラウド監視ツールとして注目され始めている「Sensu」の活用方法を解説する本連載。今回は、Sensuが監視や通知を行う際に使用するプラグインのインストールと設定方法、独自プラグインの開発方法を解説します。
前回は、「Sensu」本体とSensuのダッシュボードである「Uchiwa」のインストールと設定方法を説明しました。設定ファイルがJSON形式で簡素であること、「Ansible」などの構成管理ツールを利用することでミドルウェアの導入も含めた構築を自動化できるという点を理解いただけたと思います。
今回はSensuが監視や通知を行う際に使用するプラグインについて、そのインストールと設定方法、そして、簡単な独自プラグインの開発方法を説明します。
Sensuのプラグイン(Sensu Plugins)はコミュニティーの有志によって開発されており、「Sensu Plugins」で公開されています(画面1)。以前は「Sensu Community Plugins」と呼ばれていましたが、リニューアルされたようです。
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
内部では「Gem」(Rubyのライブラリマネージャ)を使っており、依存するライブラリもインストールされます。プラグインは、Sensu同梱のRubyのディレクトリ(/opt/sensu/embedded)に保存されます。
Sensuのプラグインには「Check」「Handler」「Mutator」の3種類があります。ここでは、それぞれの機能と設定をチュートリアル形式で説明していきます。前回までに構築したオールインワンのSensu環境で試しながら読み進めてください。
「Check」は、実際に監視したり、メトリクスを測定したりするためのプラグインです。以下のような項目を監視したり、測定したりできます。
設定は「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"] } } }
次に、sensu-clientの設定ファイルを開き、「subscriptions」の配列に「all」を追加します。sensu-clientを再起動してしばらく待つと、監視結果をUchiwa上で確認できるようになります(画面2)。
また、sensu-clientごとにアラートを出す閾値を変更することもできます。sensu-clientの設定ファイル(/etc/sensu/conf.d/client.json)に下記のように「cpu」項目を追加して再起動します(プラグイン設定の「cpu.warning」や「cpu.critical」に対応しています)。
{ "client": { "subscriptions": ["all"], "cpu": { "warning": 70, "critical": 80 } } }
「Handler」は、監視結果をメールやチャットを介して通知するためのプラグインです。「PagerDuty」など、他のエスカレーションを行うサービスと連携させることも可能です。ここでは、Slackに通知する「sensu-plugins-slack」の設定を紹介します。
sensu-installコマンドでプラグインをインストールし、設定ファイルを作成します。Handlerはsensu-server上で実行されるため、sensu-client側での準備は不要です。
# sensu-plugins-slackをインストール $ sudo sensu-install -p slack
{ "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" } }
CPU使用率が閾値を越えると、10分ごとにSlackに通知されます(画面3)。通知文面はカスタマイズすることも可能です。詳細は「README」をご覧ください。
「Mutator」は、Checkの監視結果をHandlerに渡す前に整形するためのプラグインです。あまり使う機会はないのですが、他のサービスと連携するときに必要な場合があるようです。
例えば、Sensuで取得したメトリクスを「Graphite」に保存できるように、sensu-client名に含まれる「.(ピリオド)」を「_(アンダースコア)」に置換するMutatorが提供されています。
Sensuにはプラグインに近い機能として「Filter」があります。
Filterの条件に一致する場合は、Checkの実行結果(Event)がHandlerに渡されます。ここでは、よく使いそうなFilterを2つ紹介しましょう。
{ "filters": { "filter-production": { "attributes": { // ClientやCheckの属性でフィルタリング可能 "client": { "environment": "production" } } } } }
{ "filters": { "filter-maintenance": { // 条件に一致しない場合にHandlerで処理 "negate": true, "attributes": { // evalでRubyのコードを使用可能、属性の値はvalueに格納 "check": { "executed": "eval: Time.at(value).wday == 5 && Time.at(value).hour == 20" } } } } }
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
「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
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.