ROMANCE DAWN for the new world

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

Microsoft MVP for Microsoft Azure を再受賞しました

2020年7月1日付けで、Microsoft Most Valuable Professional (MVP) アワードを再受賞しました。受賞カテゴリは、Microsoft Azure です。

f:id:TonyTonyKun:20200804200527j:plain

昨年の主な活動内容

コミュニティ活動としては、東京の JAZUG で運営をお手伝いしました。例年通りのイベント以外にも、Ignite The Tour ではコミュニティブースを出しました。

  • Tokyo Jazug Night
  • Japan Azure User Group 9 周年イベント
  • Global Azure Bootcamp 2019@Tokyo
  • Ignite The Tour Tokyo

登壇は、JAZUG札幌支部(きたあず)と Ignite The Tour Tokyo & Osaka の3回でした。
gooner.hateblo.jp
gooner.hateblo.jp

ブログでは、Azure DevOps の Multi-Stage Pipelines 関連の記事を多く書きました。さくっとCI/CD 環境を作れるように、.NET Core 向けのみですがテンプレートっぽいものを用意しました。
gooner.hateblo.jp

コミュニティの運営も登壇もどちらも楽しかったですし、1年間の活動が評価された結果の再受賞なので嬉しく思います。

今年の活動目標

Azure Web Apps や Functions の加えて Static Web Apps が増えましたし、データストアのSQL Database や Cosmos DB のサーバーレス化も進んでいます。
ここ最近は Azure Kubernetes Service のテーマで登壇することが多かったですが、Azure の原点回帰というか、よりシンプルで強力な PaaS と Serverless のサービスにシフトしていきたいす。

新型コロナウイルスの影響により今までのようなオフラインの活動は難しいので、オンラインでのコミュニティ運営や登壇のお手伝いをしたいです。
セッションの間のちょっとした雑談だったり、懇親会で初めて話す人との会話だったり、そういった機会がなくなってしまうのは寂しいですね。
JAZUG が10周年になるので、今年はプチイベントを開催予定ですが、来年はオフラインでお祝いできるようになるといいなと思います。

そんな感じで今年も無事に MVP を更新できたので、引き続きよろしくお願いします。

de:code 2020 に Microsoft MVP パーソナルスポンサーとして参加してサンプルコードを提供しました

初めてのオンライン開催となった de:code 2020 ですが、延長されていた開催期間も来週の金曜日(7/17)までとなりました。
www.microsoft.com

Microsoft MVP パーソナルスポンサーとして参加し、Azure Pipelines でデプロイする .NET Core 向けの YAML ファイルのサンプルを公開しました。
github.com

私以外にも、たくさんの Microsoft MVP たちが役に立つサンプルコードやツールを提供しています。こちらのブログにまとめられているので、ぜひ活用してほしいです。
kogelog.com

Microsoft からはメールでのアナウンスぐらいで、いまひとつ情報が埋もれてしまっている気がするので、改めて共有しておきたいと思いました。

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 などを活用すると、幅広い用途でデータの分析などが行えるようになります。