Edited at

Azure Functionsでエラー検知してChatworkにメッセージを送る

More than 1 year has passed since last update.


背景

Azureにはアラートという機能があって、エラー検知してWebhookでリクエストが送れる。

でも、その検知するエラーの内容がイマイチわからないし、

検知したいのは、Azureのストレージに載せたアプリのログで、

それはテーブルストレージに格納されるので、

エラーログのレコードが追加されたらその内容を知りたい。

ということで、パーフェクトな感じではないけど、Azure Functionsのタイマーで、

エラー検知したら、チャットワークに投げようと思います。


方法

1. Azure Functions でTimerTrigger-JavaScriptを選択し、1分間隔で実行

2. kuduでパッケージをインストール

npm init -y

npm install request underscore --save

3. 統合タブの入力で、取得するテーブルストレージのテーブルを選択

4. 関数に下記の処理を書く

var counter = 0;

var error_counter = 0;
var _ = require('underscore');

module.exports = function (context, myTimer) {
if (counter != context.bindings.RbTraceLog.length) {
var i = 0;
var info = _.where(context.bindings.RbTraceLog, { Category: 'error' });
var len = info.length - error_counter;
for (; i < len ; i++) {
setTimeout(function(i) {
postChat(info[info.length - i - 1], context);
}, 1000 * i, i);
}
error_counter = info.length;
}

counter = context.bindings.RbTraceLog.length;

context.done();
};

function postChat(body, context) {
var request = require('request');
var end_point = 'https://api.chatwork.com/v2/rooms/るーむID/messages';
var header = {'X-ChatWorkToken': 'トークン'};
var options = {
url: end_point,
headers: header,
form: {"body": JSON.stringify(body)}
};

request.post(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
context.log('success: '+ response.statusCode);
} else {
context.log('error: '+ response.statusCode);
}
});
}


まとめ

ちなみにFunctionsは100万回/月が無料なので、1分に一回だと無料です。

アラートからいい感じに検知できるようになったら、また書きたいと思います。