皆様、Bluemix上に構築したアプリケーションの性能やエラーといったモニタリングを行っていますか?
前回のMonitoring and Analyticsに引き続き今回は、普段利用する機会が少ないであろうサービスの1つ「IBM Alert Notification」を使い、アプリケーションのエラーを検知・通知する方法をご紹介したいと思います。

IBM Alert Notification

機能概要

「IBM Alert Notification」で提供している機能は、プログラム内で発生したエラーを通知するサービスとなっております。プログラム内のエラー検知方法は、プログラム内のエラーハンドリング処理にて、「IBM Alert Notification」に対してエラー内容をPOST(REST-API)する事で検知しております。

「IBM Alert Notification」のプランは有料プランのみで、2016/10時点では「¥945.00 JPY/ユーザー/月」となっております。金額の詳細はリンク先のページをご確認下さい。

サービス利用手順

事前準備

「IBM Alert Notification」の利用前提として、監視対象となるアプリケーションが必要になります。そこで、今回はnode.jsで作成したサンプルプログラムを用意致しました。このプログラムを利用してご紹介したいと思います。

https://bitbucket.org/personalok/bm_alert_notification/src

プログラム説明

○index.js
index.jsを起動すると、存在しないディレクトリ(./alert)にわざとアクセスするようになっております。
「fs.readdir」がディレクトリにアクセスするための関数になります。アクセス先のディレクトリは存在しないため、エラー内容が「err」変数に登録され「if (err)」処理が実行されます。
「if (err)」配下では「IBM Alert Notification」に対して「YYYYMMDD HH:MM:SS :fs.readdir function err」というエラー文章をPOSTする処理となっております。実際の通知処理は外部関数として呼び出した「alert.bluemixalert」で実行しております。「alert.bluemixalert」については、次の項で説明致します。

// preprocessing
  //モジュール・外部関数の呼び出し
  var http = require('http');
  var fs = require('fs');
  var request = require('superagent');
  var alert = require('./bluemixalert');

  // Webサーバの設定
  var port = (process.env.VCAP_APP_PORT || 3000);
  var host = (process.env.VCAP_APP_HOST || 'localhost');

// main
  // テスト用処理
  var serverHandler = function(req,res) {
      // Webレスポンスの設定
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.write('Hello World<br />');

      // Alert出力用エラー関数(./alertディレクトリは存在しないためエラー)
      fs.readdir('./alert', function(err, files){
          if (err) {
            //日時取得
            require('date-utils');
            var date = new Date();
            var postdate = date.toFormat("YYYY/MM/DD HH24:MI:SS");
            //標準出力にエラーを出力
            console.log(postdate+" :"+err);
            // アラートメッセージのPOST
            alert.bluemixalert(postdate+" :fs.readdir function err")
        };
      });
    // Webレスポンスの設定
      res.end('Good Bye<br />');
  };

  // Webサーバの起動
  var server = http.createServer( serverHandler );
  server.listen(port,host);

○bluemixalert.js
「bluemixalert.js」は「IBM Alert Notification」に対してエラー文章をPOSTする処理を記載しております。POST方法については基本的にはAPIのリファレンスに沿って送信しております。
https://ibmnotifybm.mybluemix.net/docs/alerts/v1/

APIの仕様については上記のリンクに詳細が記載されておりますのが、サービスにPOST可能な情報は以下の通りです。

{
  "Identifier": "string",
  "ShortId": "string",
  "What": "string",
  "Where": "string",
  "Severity": "Fatal",
  "Source": "string",
  "ApplicationsOrServices": [
    "string"
  ],
  "URLs": [
    {
      "Description": "string",
      "URL": "string"
    }
  ],
  "Details": [
    {
      "Name": "string",
      "Value": "string"
    }
  ],
  "EmailMessageToSend": {
    "Subject": "string",
    "Body": "string"
  },
  "SMSMessageToSend": "string",
  "VoiceMessageToSend": "string",
  "DocType": "Alert",
  "NotificationState": "Unnotified",
  "FirstOccurrence": 0,
  "LastNotified": 0,
  "InternalTime": 0,
  "Expired": true
}

今回プログラムでは「What」・「Where」・「Severity」のみPOSTする仕組みにしております。

var request = require('superagent');

// IBM Alert Nortificationの資格情報定義
var name="<NAME>";
var password="<Password>";

function bluemixalert(text){
    var alert_text = text;
    //出力メッセージの定義
    var alert = {
        "What": alert_text,
        "Where": "Bluemix-Alertapp",
        "Severity": "Critical",
    }

    // アラートメッセージPOST
    request
        .post("https://ibmnotifybm.mybluemix.net/api/alerts/v1")
        .auth(name,password)
        .set('Content-Type', 'application/json')
        .send(JSON.stringify(alert))
        .end(function(err, result) {
          if (err) {
            console.log("Error sending alert: " +err);
          } else {
            console.log("Successfully sent alert");
          }
        });
}

exports.bluemixalert = bluemixalert;

サービスのオーダー方法

Bluemixログイン後、「カタログ→DevOps→IBM Alert Notification」と選択して下さい。
ws000000

「IBM Alert Notification」のオーダー画面にて、接続設定については今回はアンバインドのままで問題ありません。
ws000001

料金プランは有料プラン以外選択できませんので、デフォルトのまま「作成」ボタンをクリックしてください。
ws000002

無事サービスの作成が完了すると以下の画面が表示されます。
ws000003

さっそく「起動」ボタンをクリックして「IBM Alert Notification」にアクセスしたいところですが、サンプルプログラムで使用する資格情報の取得を先に行いたいと思います。「サービス資格情報」にアクセス頂いて「user」・「password」をコピーして下さい。
ws000004

必要な情報の取得が完了したら、「IBM Alert Notification」にアクセスしたいと思います。
「起動」ボタンをクリックして頂くと以下の画面が表示されますので、実際にアラートの検知・通知について紹介したいと思います。
ws000006

通知設定

まずは、アラートの通知先と通知ルールの設定をしたいと思います。
画面上の「Getting Started→IBM Alert Notificationの使用を開始する→Eメール、SMS、または音声による通知→プロファイルの編集」をクリックして下さい
ws000007

デフォルトではサービスの作成者(自分)が自動的に登録されております。
また、個人宛だけではなくグループ宛に通知することも可能ですが、いくつか手順を踏まないといけませんので、後ほどご紹介したいと思います。
ws000008

プロファイルの編集では通知先以外にも、通知可能な時間帯(サービス上は業務時間と表現)といった設定も行う必要がありますので、設定値をご紹介したいと思います。
「勤務時間」は曜日・時間を設定することが可能です。
今回のデモでは月曜日にチェックを付け、時間帯も9時~17時と設定致しました
ws000009

ws000010

「通知」は登録した勤務時間に対して通知のon/offといった項目を設定できます。

ws000011

今回は「通常の勤務時間中」には「Eメール」で通知するという設定を行いました。それ以外は通知しない設定をしました。
ws000027
設定が完了したら「保存」ボタンをクリックして登録を完了して下さい。

通知設定が完了したら、今度はプログラムからPOSTされたメッセージのフィルタリング設定画面を紹介したいと思います。
「IBM Alert Notification」は送られてきたエラーメッセージを全て通知する事も出来ますし、キーワードマッチングといった細かいフィルタリングも可能です。

フィルタリングの設定画面は「Getting Started→IBM Alert Notificationの使用を開始する→すべてのクリティカルな問題についてユーザにアラートを送信するための通知ポリシーの作成→ポリシーの作成」をクリックして下さい。
ws000013

以下のポリシー設定画面が表示されます。
ws000014

名前フィールドに値を入れないと他の設定画面が表示されませんので、適当な名前を入れましょう。
名前を登録後、画面上に表示されている「ルールの追加」をクリックして下さい。
ws000015

画面遷移後、キワードマッチングの詳細設定画面に移ります。
ws000016

今回のテストでは「すべての着信アラートに一致」のみ選択して設定を完了致しますが、こちらの設定は皆様の監視要件に合わせて自由に選択して下さい。
ws000026

折角なので、その他の設定画面についても今回ご紹介します。
上部に表示された「ルールの追加」をクリックすると、実際のキーワードマッチングの条件を登録する画面が表示されます。
ws000017

ws000018

ws000019

それでは、先程の「事前定義」のタブに戻り「すべての着信アラートに一致」が設定されていることを確認し、保存ボタンをクリックして下さい。
画面遷移後、「通知ポリシーの作成」ウィンドウに戻り、「すべての着信アラートに一致」が表示されている事が確認できます。
ws000020

また、設定前には表示されていなかった「通知の遅延」設定が確認出来るかと思います。
こちらは監視製品を利用されている方はよくご存知かと思いますが、同じアラートが指定した時間内に何回か連続で検知した場合に通知を行いたいといった設定が可能な項目となっております。
下記のキャプチャ画面では紹介のため「通知の遅延」にチェックを入れておりますが、実際のテストでは利用しませんのでチェックの消し忘れにご注意下さい。
ws000021

次のアラートの受信者の設定を行いたいと思います。こちらはとても簡単で、画面に表示されている「受信者の追加」をクリックして下さい。
ws000027

画面が遷移し、「ユーザの選択または検索」ウィンドウが表示されます。
ws000022

「ユーザの選択または検索」横の▽をクリックして頂くと、自動的にユーザが登録されますので保存ボタンをクリックして下さい。
ws000023

アラートの受信者設定を行うと、「アラートが確認されない場合はエスカレート」と「これらの以外に対するオーバーライド」の設定が表示されます。今回のテストでは利用しませんが、どういった設定が可能かは下記のキャプチャ画面をご参照下さい。
ws000025

以上で設定は完了です。
それでは実際に「IBM Alert Notification」でアラートの検知・通知が出来るか確認したいと思います。
資格情報画面で取得した情報をサンプルプログラムの「bluemixalert.js」内に記載し、Bluemixへアップロードして下さい。
アップロード完了後、サービスにアクセスしますと下記のエラーを「IBM Alert Notification」が検知している事がわかります。
ws000028

また、指定したメールアドレスにアラートメールが通知されていることも確認できます。
ws000029

まとめ

如何だったでしょうか。
Bluemixの標準ラインタイムではプログラム内のエラーを検知・通知する事は出来ないため、本サービスやその他サービスを利用してモニタリングする必要があります。
まだまだ、モニタリング&アラート系サービスが存在しておりますので、本ブログでご紹介していきたいと思います。

(補足)グループの作成方法

グループの作り方は、まずグループに所属するユーザ情報を登録し、登録後グループを作成するような流れになります。
実際に画面に沿って紹介しますと、「Getting Started→IBM Alert Notificationの使用を開始する→Eメール、SMS、または音声による通知→プロファイルの編集」をクリック後、画面の左上にある「Manage Users」をクリックして下さい。
ws000018

続いて「ユーザーの作成」をクリック
ws000019

追加するユーザの情報を登録して下さい
ws000020

ユーザ登録後、「Manage Groups→グループの作成」をクリックして頂くと、グループの登録画面が表示されますので、必要に応じて設定を行って下さい。
ws000031