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
このディレクトリ構造に対応させると、下記のような 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 に転送されたことを確認できます。
SQL Database
Functions
まとめ
Application Insights に蓄積されるテレメトリデータを Stream Analytics を使って、SQL Database と Functions に転送してみました。
Application Insights では直近で保持したい期間とサイズを設定しておき、古いデータは Blob Storage に転送しておくと、課金コストを抑えることができます。
Stream Analytics 以外にも、EventGrid や Data Factory などを活用すると、幅広い用途でデータの分析などが行えるようになります。