AzureServiceBusとAzureFunctionsのサービスをAzureApplicationInsightsとSlackで監視する


GYAOのtsです。
我々のチームは、オールパブリッククラウドで、Microservice Architectureを採用した次期バックエンドを設計中です。

経緯

前回の投稿でfunctionsを使用したAPIの作成と監視についてチーム内で話し合ったが、チームとして下記の方向で概ね合意が取れているので、この記事で監視も含めてプロトタイプを作成してみる。構成は下記のような形。

今回のscopeはPowerBIとLogicAppsの部分は割愛する(別記事で)。

Hands on

今回実現したいことは以下の通り。

■ AzureFunctionsでAPIを2本作成する。

・DB登録用API・・・store
・DB削除用API・・・remove

■ storeAPI、removeAPIはAzureServiceBusの特定のトピック(storeトピック)にpublish。

■ AzureFunctions(subscriber)がAzureServiceBusの特定のトピック(storeトピック)をsubscribe。DB(cosmosDB)に対して処理を行う。

以上、たったこんだけ。
+ 監視は適宜行います。

AzureServiceBus

まずはPublish、 Subscribeするトピックを作成します。

AzureFunctions

store

Http-ServiceBusのPublisherを作成する。

詳しくは前回の投稿を参照。

#r "Newtonsoft.Json"

using System;
using System.Net;
using System.Threading.Tasks;
using Newtonsoft.Json;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ICollector<string> outputSbQueue, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    // Get request body
    string jsonContent = await req.Content.ReadAsStringAsync();
    dynamic data = JsonConvert.DeserializeObject(jsonContent);

    if (data == null) {
        return req.CreateResponse(HttpStatusCode.BadRequest, 
            "Please pass a messsage in the request body.");
    }
    else {
        outputSbQueue.Add($"{data}");
        return req.CreateResponse(HttpStatusCode.OK, $"{data}");
    }
}

remove

同じHttp-ServiceBusのPublisherを作成するが、publishする際のデータ構造が変わっただけなので割愛

doStore

subscriber。topicに流れてきたデータをもとに実際にcosmosDBに対して処理を行う。

using System;
using System.Threading.Tasks;

public static void Run(string mySbMsg, TraceWriter log, out object outputDocument)
{
    log.Info($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
    outputDocument = mySbMsg;
}

AzureAppInsights

Functions、ServiceBusの監視をApplicationsで一元管理します。
今回はErrorやExceptionがあった場合、slackにサマリーを飛ばします。

Functions

Functions自体の監視は前回の投稿を参照。
今回はそれに加えてErrorsWebhookという関数を作成した。Azureのリソースのメトリックアラートをすべてここに飛ばし、監視する。

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("Error was occurred...");

    // Get request body
    dynamic data = await req.Content.ReadAsAsync<object>();
    log.Error($"{data}");

    return req.CreateResponse(HttpStatusCode.OK);
}

ServiceBus

servicebusに関しては
アクティビティログアラートで設定する形か?現在調査中。

webhookで先程作成したfunctions(ErrorsWebhookを指定する)

ApplicationInsightsとSlack

ApplicationInsightsで拾ったErrorについてはSlackに送信したいので下記を使用する。
cloudbot
定期便とエラー毎のレポートを送ってくれる

定期便

エラーpush