ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Application Insights のテレメトリデータを Stream Analytics を使って転送する

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 のテレメトリデータが転送されます。

f:id:TonyTonyKun:20200328133029p:plain

転送先の 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
      • 日付
        • 時刻

このディレクトリ構造に対応させると、下記のような Path pattern となります。

ApplicationInsightsName_InstrumentalKey/Event/{date}/{time}

合わせて、Date Format を区切り文字をダッシュの YYYY-MM-DD に変更します。

f:id:TonyTonyKun:20200328181308p:plain

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 ファイルをダウンロードしておくと、実データを使ったテストを行いながらクエリを書くことができます。

f:id:TonyTonyKun:20200328134153p:plain

転送先の 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 に転送されたことを確認できます。

f:id:TonyTonyKun:20200328132302p:plain
SQL Database

f:id:TonyTonyKun:20200328132207p:plain
Functions

まとめ

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