スナップショット デバッガーを使用してライブ ASP.NET Azure Kubernetes サービスをデバッグする

スナップショット デバッガーは、対象コードの実行時に実稼働アプリのスナップショットを取得します。 スナップショットを取得するようにデバッガーに指示するには、コードでスナップショットとログポイントを設定します。 デバッガーでは、実稼働アプリケーションのトラフィックに影響を与えることなく、問題を正確に確認できます。 スナップショット デバッガーは、実稼働環境で発生する問題の解決にかかる時間を大幅に短縮するのに役立ちます。

スナップポイントとログポイントはブレークポイントと似ていますが、ブレークポイントとは異なり、スナップポイントはヒットしてもアプリケーションが停止しません。 通常、スナップポイントでスナップショットをキャプチャするには 10 から 20 ミリ秒かかります。

このチュートリアルでは、次のことを行います。

  • スナップショット デバッガーを起動する
  • スナップポイントを設定してスナップショットを表示する
  • ログポイントを設定する

前提条件

  • Azure Kubernetes サービス用のスナップショット デバッガーは、Azure 開発ワークロードに対して Visual Studio 2019 Enterprise 以降でのみ使用できます。 ([個別のコンポーネント] タブの [デバッグとテスト]>[スナップショット デバッガー] にあります)。

    まだ Visual Studio 2019 Enterprise がインストールされていない場合はインストールしてください。

  • スナップショット コレクションは、次の Azure Kubernetes サービス Web アプリに使用できます。

    • Debian 9 上の .NET Core 2.2 以降で実行されている ASP.NET Core アプリケーション。

    • Alpine 3.8 上の .NET Core 2.2 以降で実行されている ASP.NET Core アプリケーション。

    • Ubuntu 18.04 上の .NET Core 2.2 以降で実行されている ASP.NET Core アプリケーション。

      Note

      AKS でスナップショット デバッガーをサポートできるように、Docker イメージに対する設定方法を示す一連の Dockerfile を含むリポジトリを提供しています。

プロジェクトを開いてスナップショット デバッガーを起動する

  1. デバッグのスナップショットを取得するプロジェクトを開きます。

    重要

    デバッグのスナップショットを取得するには、Azure Kubernetes サービスに公開されているものと同じバージョンのソース コードを開く必要があります。

  2. [デバッグ] > [スナップショット デバッガーのアタッチ] を選びます。Web アプリがデプロイされる AKS リソースと Azure ストレージ アカウントを選択し、[アタッチ] をクリックします。 スナップショット デバッガーは Azure App ServiceAzure Virtual Machines (VM) および Virtual Machine Scale Sets もサポートしています。

    Launch the snapshot debugger from the Debug menu

    Select Azure Resource

    Note

    (Visual Studio 2019 バージョン 16.2 以降) スナップショット デバッガーで、Azure クラウドのサポートが有効になりました。 選択する Azure リソースと Azure Storage アカウントの両方が、同じクラウドからのものであることを確認します。 企業の Azure コンプライアンス構成についてご不明な点がある場合は、Azure 管理者にお問い合わせください。

これで、Visual Studio はスナップショット デバッグ モードになりました。

Snapshot debugging mode

[モジュール] ウィンドウは、Azure App Service のすべてのモジュールが読み込まれたときに表示されます (このウィンドウを開くには、[デバッグ] > [ウィンドウ] > [モジュール] を選びます)。

Check the Modules window

スナップポイントを設定する

  1. コード エディターで、目的のコード行の横にある左側の余白をクリックしてスナップポイントを設定します。 実行されることがわかっているコードを選択します。

    Set a snappoint

  2. [コレクションの開始] をクリックしてスナップポイントを有効にします。

    Turn on the snappoint

    ヒント

    スナップショットを表示するときはステップ実行できませんが、コード内に複数のスナップポイントを配置して、コードのさまざまな行の実行を追跡することができます。 コード内に複数のスナップポイントがある場合、スナップショット デバッガーでは、対応するスナップショットが同じエンドユーザー セッションに由来していることが確認されます。 スナップショット デバッガーでは、アプリをヒットするユーザーが多数の場合でもこの処理が実行されます。

スナップショットを作成する

スナップポイントを設定したら、Web サイトのブラウザー ビューに移動して、マークされたコード行を実行してスナップショットを手動で生成することも、ユーザーがサイトを使用してスナップショットを生成するのを待機することもできます。

スナップショット データを調べる

  1. スナップポイントにヒットすると、[診断ツール] ウィンドウにスナップショットが表示されます。 このウィンドウを開くには、[デバッグ] > [ウィンドウ] > [診断ツールの表示] を選びます。

    Open a snappoint

  2. スナップポイントをダブルクリックして、コード エディターでスナップショットを開きます。

    Inspect snapshot data

    このビューから、変数にポイントしてデータヒントを表示し、[ローカル][ウォッチ]、および [コール スタック] ウィンドウを使用できます。また、式を評価することもできます。

    Web サイト自体はまだ稼働中であり、エンド ユーザーは影響を受けません。 既定では、スナップポイントごとに 1 つのスナップショットのみがキャプチャされます。スナップショットがキャプチャされると、スナップポイントは無効になります。 そのスナップポイントで別のスナップショットをキャプチャする場合は、[コレクションの更新] をクリックしてスナップポイントを元に戻すことができます。

アプリにスナップポイントを追加して [コレクションの更新] ボタンをクリックして有効にすることもできます。

お困りの際は、 トラブルシューティングと既知の問題スナップショットのデバッグに関する FAQ のページを参照してください。

条件付きスナップポイントを設定する

アプリで特定の状態を再現することが難しい場合は、条件付きスナップポイントの使用を検討してください。 条件付きスナップポイントを使用すると、変数値に調査する特定の値が含まれている場合など、いつスナップショットを取得するかを制御できます。 式、フィルター、またはヒット数を使用して条件を設定できます。

条件付きスナップポイントを作成するには

  1. スナップポイント アイコン (白抜きの球) を右クリックして、[設定] を選択します。

    Choose Settings

  2. スナップポイント設定ウィンドウで式を入力します。

    Type an expression

    前の図では、visitor.FirstName == "Dan" のときにのみ、スナップポイントのスナップショットが取得されます。

ログポイントを設定する

スナップポイントにヒットしたときにスナップショットを取得するだけでなく、メッセージをログに記録する (つまりログポイントを作成する) ようにスナップポイントを構成することもできます。 ログポイントは、アプリを再配置することなく設定できます。 ログポイントは仮想的に実行されるので、実行中のアプリケーションには影響も副作用もありません。

ログポイントを作成するには

  1. スナップポイント アイコン (青色の六角形) を右クリックして、[設定] を選択します。

  2. スナップポイント設定ウィンドウで [アクション] を選択します。

    Create a logpoint

  3. [メッセージ] フィールドには、ログに記録する新しいログ メッセージを入力できます。 ログ メッセージ内の変数を中かっこで囲んで評価することもできます。

    [出力ウィンドウに送信します] を選択した場合、ログポイントにヒットすると、メッセージが [診断ツール] ウィンドウに表示されます。

    Logpoint data in the Diagnostic Tools window

    [アプリケーション ログに送信します] を選択した場合、ログポイントにヒットすると、App Insights など、System.Diagnostics.Trace (.NET Core では ILogger) からメッセージを表示できる任意の場所にメッセージが表示されます。

このチュートリアルでは、Azure Kubernetes 用のスナップショット デバッガーの使用方法を学習しました。 必要に応じて、この機能の詳細な記事を参照してください。