しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Application Insights の Snapshot Debugger を使って本番環境のデバッグを効率的に行う

仕事でも Application Insights を弄っていたのに全く知らなかった機能である Snapshot Debugger ですが、チャックさんの記事で存在を知ったのと何となく試して見たかったので検証してみることにしました。

Tech Summit 2017 のチャックさんのセッションで話があったっぽいですね。Tech Summit 2017 は登壇側だったのと、登壇者は他のセッションに参加できないパスだったので見れてませんでした。

最近実装されたのかと思ってたらそんなことはなく、地味に前からある機能でした。ドキュメントもちゃんと整備されていて ASP.NET 4.6 以降と ASP.NET Core 2.0 アプリケーションならすぐに使えるようです。

上のスライドでは Visual Studio からの利用になってますが、アプリケーションにインストールしておくと、例外が投げられたタイミングでダンプを自動的に取るという素晴らしい機能です。

使い方も書いてある通りで、NuGet パッケージを 1 つ追加するだけで終わります。

プロダクション環境で発生した例外は Application Insights でも確認できますが、例外が発生したタイミングの変数の値などはデバッグに非常に役立ちます。なので今すぐ有効にした方が良い機能でした。

とりあえず試します。適当に MVC 5 アプリケーションを Web App / Application Insights を用意して、わざと落ちるようなアクションを書いてデプロイしました。

f:id:shiba-yan:20180213225312p:plain

Snapshot が取得できているとリクエストの横にアイコンが表示されます。

今回の Snapshot Debugger とは関係ないですが、Application Insights に Preview として実装されている E2E Transaction Diagnostics は有効にした方が調査が捗ります。

実際に Snapshot を確認するには、例外を選択して表示されるペインから Open debug snapshot を選びます。

f:id:shiba-yan:20180213225323p:plain

Snapshot を開くとコールスタックの確認が行えます。普通に Application Insights で確認出来るものより詳細な気がしますが、まあこっちはおまけみたいなものです。

f:id:shiba-yan:20180213225330p:plain

スクロールするとローカル変数の値を確認できるようになっています。こっちがメインの機能です。

コードが最適化されて消えてしまった場合は確認できないですが、大体のケースでは役に立つ情報が確認できるはずです。変数の値をログに書き出すよりも、ダンプがあった方が圧倒的に捗ります。

f:id:shiba-yan:20180213225341p:plain

少しのオーバーヘッドはあるでしょうが、圧倒的に便利な機能なので気にしません。

Visual Studio Enterprise を使っている場合には、収集された Debug Snapshot をダウンロードして Visual Studio でデバッグすることが出来ます。実際にデバッグするとソースコードと紐づいた形で確認できます。

f:id:shiba-yan:20180213230449p:plain

チャックさんの記事にもあったように、実行中のアプリケーションに対しても Visual Studio から Snapshot Debugger をアタッチすることが出来るので、プロダクション環境でデバッグが簡単に行えます。

f:id:shiba-yan:20180214000930p:plain

これまで Application Insights は他社の APM に比べると機能が少ないし、処理が遅くて残念に思っていましたが、最近は Profiler や Snapshot Debugger でかなりテコ入れがされた感じがあります。

そういえば Application Insights Profiler について書いてなかったので、暇な時にまとめます。