Azure Application Insights に蓄積されるテレメトリデータを活用して、独自の分析を行いたくなったので、Stream Analytics を使って転送してみました。
公式ドキュメントのチュートリアルに記載されているとおりですが、ページビューではなくカスタムイベントを題材に、SQL Database と Functions に転送しました。
docs.microsoft.com
事前準備
Azure Portal から Web Apps と Application Insights を作成し、ASP.NET Core のアプリケーションをデプロイします。
Privacy ページがクリックされたら、TelemetryClient
を使って Custom Event を送信するようにしました。
public class HomeController : Controller { private readonly TelemetryClient _telemetryClient; public HomeController(TelemetryClient telemetryClient) { _telemetryClient = telemetryClient; } public IActionResult Privacy() { _telemetryClient.TrackEvent("Click Privacy Page"); return View(); } }
Application Insights のテレメトリデータを Blob Storage に転送する
Application Insights の Continuous Export を利用して、テレメトリデータを Blob Storage に転送します。
Azure Portal から Storage を作成し、Continuous Export を設定します。Blob の appinsights
というコンテナに転送するようにします。
少し待つと、Application Insights のテレメトリデータが転送されます。
転送先の SQL Database を作成する
Azure Portal から SQL Database の telemetry
というデータベースを作成し、Custom Event を転送するテーブルも作成します。
CREATE TABLE [dbo].[CustomEventTable]( [eventName] [nvarchar](max) NOT NULL, [eventTime] [datetime2] NOT NULL ) CREATE CLUSTERED INDEX [eventTblIdx] ON [dbo].[CustomEventTable] ( [eventTime] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
Custom Event の名前とイベント発生時刻だけを保持するシンプルなテーブルレイアウトにしました。
Stream Analytics を使って SQL Database に転送する
Azure Portal から SQL Database に転送する Stream Analytics Job を作成し、JOB TOPOLOGY メニューから各種設定を行います。
Inputs
BlobInput
という名前で、転送元の Blob Storage を設定します。Storage Account や Container は迷うことはないと思いますが、重要なのは Path pattern
です。
実際に転送された Blob のディレクトリ構造を確認してみます。
- Application Insights 名 + Instrumental key
- Event
- 日付
- 時刻
- 日付
- Event
このディレクトリ構造に対応させると、下記のような Path pattern となります。
ApplicationInsightsName_InstrumentalKey/Event/{date}/{time}
合わせて、Date Format を区切り文字をダッシュの YYYY-MM-DD
に変更します。
Outputs
SqlDbOutput
という名前で、転送先の SQL Database を設定します。データベースやテーブル名は迷うことはないと思います。
Query
Query メニューでクエリを書き換えます。
SELECT event.ArrayValue.name as eventName, Input.context.data.eventTime as eventTime INTO [SqlDbOutput] FROM [BlobInput] Input CROSS APPLY GetElements(Input.[event]) as event
1つの Blob ファイルに複数の Custom Event が書き込まれるので、CROSS APPLY
を使っています。
Custom Event のデータモデルの詳細は、公式ドキュメントを参照してください。
docs.microsoft.com
あらかじめ Blob ファイルをダウンロードしておくと、実データを使ったテストを行いながらクエリを書くことができます。
転送先の Functions を作成する
Azure Portal から Function App を作成します。Stream Analytics 向けの Binding は用意されていないので、HTTP Trigger
の Function を追加します。
public static class SaFunction { [FunctionName("SaFunction")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Stream Analytics trigger function processed a request."); string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); log.LogInformation("requestBody : " + requestBody); log.LogInformation("Stream Analytics trigger function is success."); return new OkResult(); } }
Stream Analytics を使って Functions に転送する
Azure Portal から Functions に転送する Stream Analytics Job を作成し、JOB TOPOLOGY メニューから各種設定を行います。
Inputs
先ほどと同様に BlobInput
という名前で、転送元の Blob Storage を設定します。
Outputs
FuncOutput
という名前で、転送先の Function App を設定します。Function や Key は迷うことはないと思います。
Query
Query メニューでクエリを書き換えます。INTO 句の部分を SqlDbOutput から FuncOutput に変更した以外は、先ほどと同様のクエリです。
SELECT event.ArrayValue.name as eventName, Input.context.data.eventTime as eventTime INTO [FuncOutput] FROM [BlobInput] Input CROSS APPLY GetElements(Input.[event]) as event
結果確認
Web Apps にデプロイした ASP.NET Core のアプリケーションで Privacy ページを数回クリックします。
Blob Storage に転送された Application Insights のテレメトリデータが、Stream Analytics によって SQL Database と Functions に転送されたことを確認できます。
まとめ
Application Insights に蓄積されるテレメトリデータを Stream Analytics を使って、SQL Database と Functions に転送してみました。
Application Insights では直近で保持したい期間とサイズを設定しておき、古いデータは Blob Storage に転送しておくと、課金コストを抑えることができます。
Stream Analytics 以外にも、EventGrid や Data Factory などを活用すると、幅広い用途でデータの分析などが行えるようになります。