しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions と Stream Analytics を使ってアプリケーションのログをリアルタイムに処理する

この間、Event Hubs に構造化されたログを吐き出す TraceListener を作ったので、ログの保存や集計などの処理を追加で行ってみました。前回の記事は以下になります。

Event Hubs からのリアルタイムなデータを処理するには Stream Analytics が最適です。ログは基本的に保存しておきたいですが、量が多くなるので Azure Table に保存するようにします。

Stream Analytics は出力に数多くのストレージを選べるようになっているので、ログの生データを Azure Table に、そしてある程度集計した結果を Event Hubs に書き出して、最後に通知やメール送信などの処理を Azure Functions に任せればよさそうです。

Stream Analytics の設定

とりあえず Stream Analytics を作成し、入力と出力に別々の Event Hubs を 1 つずつ追加しました。

Azure Table への書き出しは PartitionKey と RowKey として扱うカラム名を指定しないといけないので、少しはまりやすいです。今回は EventType と Timestamp を使いました。

クエリは単純に入力データを Azure Table に書き出すものと、Tumbling Window を使って 1 分単位で集計するものの 2 つを用意しました。集計した結果が 5 件以上のデータのみを書き出します。

これで設定がすべて完了したので Stream Analytics を起動し、Trace クラスを使ってログを書き出すと生データが Azure Table に追加されていきます。

Azure Portal から EventHubTrigger な Azure Functions を作成して、設定をしておくと Stream Analytics からのデータがこちらにも出力されていきます。

一通りの流れは問題ないので、あとは Azure Functions で必要な処理を行うだけです。イベント駆動型の処理を書く場合は Azure Functions が最高にお手軽です。

Azure Functions に処理を追加する

まずは Stream Analytics の出力を JSON に設定してあるので、Json.NET を使ってデシリアライズを行います。#r でアセンブリへの参照を追加し、using を追加すれば使えるようになります。

Json.NET は Azure Functions のランタイムに存在しているので、特に設定の必要もなく使えるようになっているようです。いつも通りに JsonConvert クラスを使います。

今回は EventType が Error のデータが存在すれば、ひとまずログに書き出す処理にしました。本来なら Slack やメールなどを使って通知する処理を追加するべきだと思うのですが、面倒なのでとりあえずこれで。

実行すると EventType が Error の件数がログに書き出されました。

Stream Analytics 側のクエリが単純なので大した処理には見えないですが、工夫すればこれまでに出力されていないエラーの場合のみ通知といったことも実現できそうです。