LoginSignup
4
1

More than 3 years have passed since last update.

Blazor WebAssembly に Azure Application Insights を組み込む

Last updated at Posted at 2020-12-15

Azure Application Insights とは

Azure Application Insights とは、マイクロソフトのパブリッククラウドサービス「Microsoft Azure」上で提供されている、"アプリケーションパフォーマンス管理" サービスのひとつです。
アプリケーション上で発生するさまざまな "状況データ" (以降 "テレメトリ" と記載します) を、インターネットを経由して Azure 上の Application Insights サービスへ送信・集約することで、実行中のアプリケーションの監視を実現するものです。

App Insights サービスへのテレメトリ送信の仕掛けをアプリケーションに組み込むことで、異常の検出、問題の診断、ユーザー操作の把握を、Azure ポータル画面上などで可能とします。

詳しくは下記公式ドキュメントを参照ください。

ということで、では、この Azure Application Insights へのテレメトリ送信の仕掛けを、Blazor WebAssembly アプリに仕込んでみたいと思います。

BlazorApplicationInsights NuGet パッケージが頼みの綱

アプリケーションから Azure Application Insights へテレメトリ送信するための機能は、Java や Python、Node.js、そしてもちろん C# (ASP.NET) などなど、大抵の各種言語や処理系用に "SDK" が用意されています。

そのため、それら言語・処理系においては、Azure Application Insights の SDK (つまるところ、それら言語・処理系における "ライブラリ") をアプリケーションに組み込み、その SDK で提供されるクラスや関数などを使ったコードを数行書き足して、テレメトリ送信をセットアップすればよいです。

Blazor WebAssembly においても状況は同じですが、ただし、Microsoft からの標準・公式の SDK の提供は (今のところ) ありません

そのため、Blazor WebAssembly アプリに Azure Application Insights のテレメトリ送信機能を組み込むには、現在のところ、下記オープンソース (MIT ライセンス) の NuGet パッケージ「BlazorApplicationInsights」の利用が妥当な状況です。

組み込み手順は、この NuGet パッケージの GitHub リポジトリ (下記 URL) に記載があります。

実際に組み込んでみた結果

試しに、ASP.NET Core ホスト上の小さな Blazor WebAssembly プロジェクトを作り、上記 GitHub リポジトリに記載の手順に沿って、Azure Application Insights のテレメトリ送信機能を組み込んでみました。

また、この ASP.NET Core ホスト + Blazor WebAssembly のアプリには、わざと、捕捉されない例外が発生するような仕掛けを施しておきました。
捕捉されない例外の Azure Application Insights 上での記録の様子を見てみようと思ったためです。

さてひととり実装を終え、アプリケーションをビルド、ローカルで実行し、操作して、捕捉されない例外の発生を引き起こしてみました。

その上で、Web ブラウザで Azure ポータル画面 (https://portal.azure.com/) にサインインし、Application Insights のダッシュボードを開いて、この手元でローカル実行し例外を発生させた Blazor WebAssembly のテレメトリが表示されるか見てみました。

なお、テレメトリ送信後、Application Insights サービスでそのテレメトリが取りまとめられて、Azure ポータル画面で見られるようになるまで数分かかりますので、暫し待ちます。

今回は、Azure ポータル画面の Application Insights のブレードから、「Failures (失敗)」のカテゴリを開き、「Browser」のビューに切り替えて見てみました。

すると、ちゃんと捕捉されない例外の発生が記録されていました (下図)。
fig001.png
さらにそれら例外の項目を選択して画面を開いていくと、「どういうページを渡り歩いて、この例外の発生に至ったのか」のタイムラインや、例外の詳細情報を見ることができました (下図)。
fig002.png

感想

「BlazorApplicationInsights」NuGet パッケージを使うことで、Blazor WebAssembly アプリに、Azure Application Insights へのテレメトリ送信の機能を組み込むことができました。

その結果、Blazor WebAssembly アプリ上で捕捉されない例外が発生しても、Azure ポータル画面から、例外発生までの経緯や、例外情報を見ることができるようになりました。

ただ、本当に些細な事ながら、少々残念に感じる点もありました。

例外情報が構造化されていない

Azure Application Insights に記録された例外情報の形式上、"Message" も "Exception Type" も、例外オブジェクトをまるっと文字列化 (ToString()) した内容、つまり、スタックトレースも含めた文字列として記録されているのは、ちょっと残念なところです。

組み込みの手順が煩雑?

あと、難しくはないとはいえ、組み込みの手順がちょっと多いなー、と感じました。

とくに、

  • JavaScript コード片を、Microsoft 公式 Application Insights JavaScript SDK の GitHub リポジトリにある README からコピペさせて、かつ、パラメータ部分の書き換えが必要なあたりとか、
  • 同 NuGet パッケージに同梱の JavaScript ファイル _content/BlazorApplicationInsights/JsInterop.js を読み込む script タグを index.html に追記するとか、

そういった JavaScript 連携周りのセットアップが手間に感じました。

まぁ、BlazorApplicationInsights NuGet パッケージを無償で使わせてもらっているのに、あんまり偉そうにしては罰が当たるというものです 😅

ただ、自分が作成して公開している NuGet パッケージは、「なるべく利用者の手間をかけないように」という点も重視して作っていたりする自分の性格・嗜好もあって、そんな感想を持ちました。
上記 JavaScript 周りの "不満" については「こういう実装にすれば作業不要になるのでは?」というアイディアもあるため、時間と機会があれば、フィードバックしたい気持ちはあります。

ASP.NET Core サーバー側が原因の例外のとき

Blazor WebAssembly アプリ側からホストしている ASP.NET Core サーバー側の Web API を HttpClient を使って呼び出した際に、そのサーバー側で捕捉されない例外が発生した場合、Azure ポータル画面を自分が操作した限りでは、ブラウザ側はブラウザ側、サーバー側はサーバー側、で、別々のタイムラインでしか表示することができませんでした。

Azure Application Insights では、SPA 側のページビューの記録から、サーバー側での例外の発生に至るまでを、ブラウザ側・サーバー側を統合したタイムラインで見ることはできなかったでしょうか?

これは Azure Application Insights の仕様なのか、BlazorApplicationInsights NuGet パッケージの制約・限界なのか、そのあたりの切り分けも、今のところよくわかっていません。

もしなにか情報お持ちでしたら、コメントいただけるとありがたいです!

Learn, Practice, Share!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1