Application Insights でのデータの収集、保持、保存

ご利用のアプリに Azure Application Insights SDK をインストールすると、アプリに関するテレメトリがクラウドに送信されます。 当然ながら、担当開発者は、送信されるデータ、データに対して発生すること、それを制御する方法について知りたいと考えます。 特に、機密データの送信、その保存先、安全性が重要です。

まず、手短に言えば次のようになります。

  • 「難しい設定なしで」動く標準の製品利用統計情報モジュールは、多くの場合、機密データをサービスに送信しません。 製品利用統計情報は、負荷指標、パフォーマンス指標、利用率指標、例外レポート、その他の診断データに関連します。 診断レポートに表示される主なユーザー データは URL ですが、いかなる場合も、アプリは URL にプレーンテキストで機密データを入力するべきではありません。
  • 診断と監視利用に役立つ追加のカスタム製品利用統計情報を送信するコードを記述できます。 (この拡張機能は Application Insights の優れた機能です。)手違いにより、このコードを記述し、個人データやその他の機密データが含まれてしまうことはあります。 アプリケーションがそのようなデータを利用する場合、記述するあらゆるコードに徹底したレビュー プロセスを適用してください。
  • アプリを開発し、テストするとき、SDK により送信される内容は簡単に調査できます。 データは IDE とブラウザーのデバッグ出力ウィンドウに表示されます。
  • 新しい Application Insights リソースを作成するときに場所を選択できます。 リージョンごとの Application Insights の可用性の詳細については、こちらを参照してください。
  • 収集されたデータを確認します。これには、ある状況では許可されても他の状況では許可されないデータが含まれている可能性があるためです。 典型的な例は、デバイス名です。 サーバーからのデバイス名はプライバシーに影響を与えず便利ですが、電話やノート PC のデバイス名はプライバシーに影響を与え、あまり役に立たない場合があります。 主にサーバーを対象にして開発された SDK は、既定でデバイス名を収集することがあります。これは、通常のイベントと例外の両方で、上書きしなければならない場合があります。

この記事の残りの部分では、以上の答えについてもっと詳しく説明します。 設計は自己完結型であり、直近のチームに入っていない同僚にも見せることができます。

Application Insights とは何か?

Azure Application Insights は、ライブ アプリケーションのパフォーマンスと使いやすさの改善に役立つ、Microsoft が提供するサービスです。 テスト中と公開後またはデプロイ後の両方で、実行中のアプリケーションを常時監視します。 Application Insights が作成するグラフや表を見ると、たとえば、1 日の中でユーザー数が最も多い時間帯、アプリの反応性、アプリが依存している外部サービスのサービス性能などがわかります。 クラッシュ、エラー、パフォーマンス問題が発生した場合、製品利用統計情報データを詳しく調査し、原因を診断できます。 アプリの可用性やパフォーマンスに変化があった場合、サービスからメールが届きます。

この機能を入手するには、アプリケーションに Application Insights SDK をインストールします。インストールすることでそのコードの一部になります。 アプリの実行中、SDK はその操作を監視し、製品利用統計情報を Application Insights サービスに送信します。 これは Microsoft Azure がホストするクラウド サービスです。 ただし、Application Insights は、Azure にホストされているアプリケーションだけでなく、あらゆるアプリケーションで動作します。

Application Insights サービスは製品利用統計情報を保存し、分析します。 分析を確認し、保存されている製品利用統計情報を検索するには、Azure アカウントにサインインし、アプリケーションの Application Insights リソースを開きます。 データへのアクセスをチームの他のメンバーや指定した Azure サブスクライバーと共有することもできます。

Application Insights サービスから、たとえば、データベースや外部ツールにデータをエクスポートできます。 サービスから取得した特別なキーを各ツールに提供します。 キーは必要に応じて取り消すことができます。

Application Insights SDK はさまざまなアプリケーション タイプに利用できます。独自の Java EE サーバー、ASP.NET サーバー、または Azure にホストされている Web サービス、Web クライアント (Web ページで実行されるコード)、デスクトップのアプリとサービス、デバイス アプリ (Windows Phone、iOS、Android) などです。 これらはすべて同じサービスに製品利用統計情報を送信します。

どのようなデータが収集されますか。

データ ソースは 3 つあります。

  • SDK は開発時または実行時にアプリと統合します。 アプリケーションの種類が違えば SDK も違います。 Web ページ用の SDK もあります。ページと共にエンド ユーザーのブラウザーに読み込まれます。

    • それぞれの SDK にはさまざまな モジュールがあり、さまざまな手法でさまざまな種類の製品利用統計情報を収集します。
    • デプロイ時に SDK をインストールする場合、標準のモジュールに加え、その API を利用し、独自の製品利用統計情報を送信できます。 このカスタム製品利用統計情報にあらゆるデータを含め、送信できます。
  • 一部の Web サーバーには、アプリと共に実行され、CPU、メモリ、ネットワーク占有率に関する製品利用統計情報を送信するエージェントもあります。 たとえば、Azure VM、Docker ホスト、Java EE サーバーにそのようなエージェントがあります。

  • 可用性テスト は Microsoft が実行するプロセスであり、定期的な間隔で要求を Web アプリに送信します。 結果は Application Insights サービスに送信されます。

どのような種類のデータが収集されますか。

主なカテゴリは次のとおりです。

  • Web サーバー製品利用統計情報 -HTTP 要求。 URI、要求の処理にかかる時間、応答コード、クライアント IP アドレス。 Session id.
  • Web ページ - ページ、ユーザーとセッションの数。 ページの読み込み時間。 例外。 AJAX 呼び出し。
  • パフォーマンス カウンター - メモリ、CPU、IO、ネットワーク占有率。
  • クライアントとサーバーのコンテキスト - OS、ロケール、デバイスの種類、ブラウザー、画面の解像度。
  • 例外とクラッシュ - スタック ダンプbuild id、CPU タイプ。
  • 依存関係 - REST、SQL、AJAX など、外部サービスの呼び出し。 URI または接続文字列、期間、成功、コマンド。
  • 可用性テスト - テストとステップの期間、応答。
  • トレース ログカスタム テレメトリ - コード化してログまたはテレメトリに入れるすべて

詳細

収集された内容はどのような方法で検証しますか。

Visual Studio でアプリを開発している場合、デバッグ モードでアプリを実行してください (F5)。 製品利用統計情報は出力ウィンドウに表示されます。 そこから、それをコピーし、JSON として書式設定すれば、調査が簡単になります。

Visual Studio のデバッグ モードでのアプリの実行を示すスクリーンショット。

[診断] ウィンドウには、さらに読みやすいビューもあります。

Web ページの場合、ブラウザーのデバッグ ウィンドウを開きます。

F12 を押し、[ネットワーク] タブを開きます。

送信前に製品利用統計情報を絞り込むコードを記述できますか。

製品利用統計情報プロセッサ プラグインを記述することで可能です。

データはどれだけの期間保持されますか。

生データ ポイント (つまり、Analytics でクエリを実行したり Search で調べることができる項目) は、最大 730 日間保持されます。 30、60、90、120、180、270、365、550 または 730 日間のリテンション期間を選択できます。 730 日以上データを保持する必要がある場合は、連続エクスポートを使用して、データ インジェスト中にストレージ アカウントにコピーすることができます。

90 日より長く保持されるデータには、追加料金が発生します。 Application Insights の価格の詳細については、「Azure Monitor の価格」ページを参照してください。

集計されたデータ (つまり、メトリックス エクスプローラーに表示されるカウント、平均、その他の統計データ) は、1 分の詳細度であれば 90 日の期間にわたって保持されます。

デバッグ スナップショットは 15 日間格納されます。 この保持ポリシーは、アプリケーションごとに設定されます。 この値を増やす必要がある場合は、Azure portal でサポート ケースを開くことによって増加を要求できます。

誰がデータにアクセスできますか。

お客様と、組織アカウントを持っている場合はチーム メンバーが、データを見ることができます。

お客様とチーム メンバーはデータをエクスポートできます。また、他の場所にデータをコピーしたり、第三者にデータを渡したりすることもできます。

アプリから Application Insights に送信された情報を Microsoft はどのように利用しますか。

Microsoft は、お客様にサービスを提供する目的でのみデータを使用します。

データが保持されている場所はどこですか。

  • 新しい Application Insights リソースを作成するときに場所を選択できます。 リージョンごとの Application Insights の可用性の詳細については、こちらを参照してください。

データのセキュリティは保たれますか。

Application Insights は Azure サービスのひとつです。 セキュリティ ポリシーについては、Azure のセキュリティ、プライバシー、およびコンプライアンスに関するホワイト ペーパーをご覧ください。

データは、Microsoft Azure サーバーに保管されます。 Azure portal のアカウントの場合、アカウントの制限は Azure のセキュリティ、プライバシー、コンプライアンスの文書に記載されています。

Microsoft のスタッフによるデータへのアクセスは制限されます。 Microsoft は、Application Insights の使用をサポートするために必要であれば、ユーザーからアクセス許可を得た上でデータにアクセスします。

このほか、Application Insights の機能の向上に役立てるために、すべてのお客様のアプリケーションのデータ (データ レート、トレースの平均サイズなど) を集計のうえ使用します。

だれかのテレメトリが Application Insights データに干渉する可能性はありますか。

Web ページのコード内にインストルメンテーション キーがある場合には、だれかがそれを使用してお客様のアカウントに追加のテレメトリを送信することができます。 追加データの量が多いと、アプリのパフォーマンスと使用状況がメトリックに適切に示されなくなる可能性があります。

コードを他のプロジェクトと共有する場合は、インストルメンテーション キーを必ず削除してください。

データは暗号化されますか。

すべてのデータが、保存時とデータ センター間での移動時に暗号化されます。

アプリケーションから Application Insights サーバーに送信されるときにデータは暗号化されますか。

はい。ほぼすべての SDK からポータル (Web サーバー、デバイス、HTTPS Web ページなど) への送信に https が使用されます。

SDK では一時的なローカル ストレージが作成されますか?

はい。特定のテレメトリ チャネルは、エンドポイントに到達できない場合、データをローカルで保持します。 どのフレームワークおよびテレメトリ チャネルが影響を受けるかを以下で確認してください。

ローカル ストレージを利用するテレメトリ チャネルは、TEMP または APPDATA ディレクトリ内に一時ファイルを作成します。これらは、アプリケーションを実行している特定のアカウントだけに制限されます。 これは、エンドポイントが一時的に使用できなくなったか、または調整制限に達した場合に発生する可能性があります。 この問題が解決されると、テレメトリ チャネルは、すべての新しいデータおよび保持されているデータの送信を再開します。

この保持されているデータはローカルでは暗号化されません。 これが問題になる場合は、データを確認して、プライベート データのコレクションを制限します。 詳細については、「プライベート データをエクスポートして削除する方法」を参照してください。

顧客がこのディレクトリを特定のセキュリティ要件で構成する必要がある場合は、フレームワークごとに構成できます。 アプリケーションを実行しているプロセスにこのディレクトリへの書き込みアクセス権があることを確認してください。ただし、意図しないユーザーによってテレメトリが読み取られることを防ぐために、このディレクトリが保護されていることも確認してください。

Java

C:\Users\username\AppData\Local\Temp はデータを保持するために使用されます。 この場所は config ディレクトリからは構成できす、このフォルダーにアクセスするためのアクセス許可は、必要な資格情報を持つ特定のユーザーに制限されています。 詳細については、実装に関するページを参照してください。

.NET

既定では、ServerTelemetryChannel は、現在のユーザーのローカル アプリ データ フォルダー %localAppData%\Microsoft\ApplicationInsights または一時フォルダー %TMP% を使用します。 (ここにある実装を参照してください。)

構成ファイルを使用する場合:

<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel,   Microsoft.AI.ServerTelemetryChannel">
    <StorageFolder>D:\NewTestFolder</StorageFolder>
</TelemetryChannel>

コードを使用する場合:

  • 構成ファイルから ServerTelemetryChannel を削除します。
  • 構成に次のスニペットを追加します。
    ServerTelemetryChannel channel = new ServerTelemetryChannel();
    channel.StorageFolder = @"D:\NewTestFolder";
    channel.Initialize(TelemetryConfiguration.Active);
    TelemetryConfiguration.Active.TelemetryChannel = channel;
    

NetCore

既定では、ServerTelemetryChannel は、現在のユーザーのローカル アプリ データ フォルダー %localAppData%\Microsoft\ApplicationInsights または一時フォルダー %TMP% を使用します。 (ここにある実装を参照してください。)

Linux 環境では、ストレージ フォルダーが指定されていない限り、ローカル ストレージは無効になります。

注意

リリース 2.15.0-beta3 以降、ローカル ストレージは Linux、Mac、Windows で自動的に作成されるようになりました。 Windows 以外のシステムの場合、SDK は次のロジックに基づいてローカル ストレージ フォルダーを自動的に作成します。

  • ${TMPDIR} - ${TMPDIR} 環境変数が設定されている場合、この場所が使用されます。
  • /var/tmp - 前述の場所が存在しない場合は、/var/tmp が試行されます。
  • /tmp - 前述のどちらの場所も存在しない場合は、tmp が試行されます。
  • これらの場所のいずれも存在しない場合、ローカル ストレージは作成されず、引き続き手動による構成が必要になります。 実装の詳細については、こちらをご覧ください

次のコード スニペットは、Startup.cs クラスの ConfigureServices() メソッドで ServerTelemetryChannel.StorageFolder を設定する方法を示しています。

services.AddSingleton(typeof(ITelemetryChannel), new ServerTelemetryChannel () {StorageFolder = "/tmp/myfolder"});

詳細については、AspNetCore のカスタム構成に関するページを参照してください。

Node.js

既定では、%TEMP%/appInsights-node{INSTRUMENTATION KEY} はデータを保持するために使用されます。 このフォルダーにアクセスするためのアクセス許可は、現在のユーザーと管理者に制限されています。 (ここにある実装を参照してください。)

フォルダー プレフィックス appInsights-node は、Sender.ts にある静的変数 Sender.TEMPDIR_PREFIX のランタイム値を変更することによって上書きできます。

JavaScript (ブラウザー)

データを永続化するには、HTML5 セッション ストレージを使用します。 AI_bufferAI_sent_buffer という 2 つの別のバッファーが使用されます。 バッチ処理され、送信を待機しているテレメトリは AI_buffer に格納されます。 送信されたテレメトリは、インジェスト サーバーが正常に受信されたことを応答するまで AI_sent_buffer に配置されます。 テレメトリが正常に受信されると、すべてのバッファーから削除されます。 一時的なエラーが発生した場合 (たとえば、ユーザーがネットワーク接続を失った場合)、正常に受信されるか、インジェスト サーバーがテレメトリが無効であると応答するまで (たとえば、不正なスキーマ、古すぎる)、テレメトリは AI_buffer に格納されたままです。

テレメトリ バッファーを無効にするには、enableSessionStorageBufferfalse に設定します。 セッション ストレージがオフの場合、代わりにローカル アレイが永続ストレージとして使用されます。 JavaScript SDK はクライアント デバイス上で実行されるため、ユーザーはブラウザーの開発者ツールを介してこの格納場所にアクセスできます。

OpenCensus Python

既定では、OpenCensus Python SDK は現在のユーザー フォルダー %username%/.opencensus/.azure/ を使用します。 このフォルダーにアクセスするためのアクセス許可は、現在のユーザーと管理者に制限されています。 (ここにある実装を参照してください。)永続化されたデータを含むフォルダーは、テレメトリを生成した Python ファイルの名前が付けられます。

使用しているエクスポーターのコンストラクターで storage_path パラメーターを渡すことによって、ストレージ ファイルの場所を変更できます。

AzureLogHandler(
  connection_string='InstrumentationKey=00000000-0000-0000-0000-000000000000',
  storage_path='<your-path-here>',
)

TLS 1.2 を使用して Application Insight にデータを送信するにはどうすればよいですか。

Application Insight エンドポイントへのデータの転送時のセキュリティを保証するため、少なくとも Transport Layer Security (TLS) 1.2 を使用するようにアプリケーションを構成することを強くお勧めします。 以前のバージョンの TLS/SSL (Secure Sockets Layer) は脆弱であることが確認されています。現在、これらは下位互換性を維持するために使用可能ですが、推奨されていません。さらに、業界はこれらの以前のプロトコルのサポートを中止する方向へ急速に動いています。

PCI Security Standards Council は、2018 年 6 月 30 日を期限として、TLS/SSL の以前のバージョンを無効にし、より安全なプロトコルにアップグレードすることを求めています。 Azure がレガシー サポートを廃止した場合、アプリケーション/クライアントが TLS 1.2 以上で通信できないと Application Insight にデータを送信できなくなります。 アプリケーションの TLS のサポートをテストおよび検証する方法は、オペレーティング システム/プラットフォームのほか、アプリケーションで使用する言語/フレームワークによって異なります。

アプリケーションで TLS 1.2 のみを使用するように明示的に設定することは、必要な場合を除いてお勧めしません。そうすることで、TLS 1.3 などのより新しくより安全なプロトコルを自動的に検出して利用できるようにするプラットフォーム レベルのセキュリティ機能が無効になる可能性があるためです。 アプリケーションのコードを徹底的に監査して、特定の TLS/SSL バージョンのハードコーディングを確認することをお勧めします。

プラットフォーム/言語に固有のガイダンス

プラットフォーム/言語 サポート 詳細情報
Azure App Service サポートされています。構成が必要な場合があります。 サポートは 2018 年 4 月に発表されました。 構成の詳細のお知らせを参照してください。
Azure Function App サポートされています。構成が必要な場合があります。 サポートは 2018 年 4 月に発表されました。 構成の詳細のお知らせを参照してください。
.NET サポートされています。構成はバージョンによって異なります。 .NET 4.7 およびそれ以前のバージョンの詳細な構成情報については、これらの手順を参照してください。
Status Monitor サポートされています。構成が必要です Status Monitor は、TLS 1.2 をサポートするために OS 構成 + .NET 構成に依存します。
Node.js サポートされています。v10.5.0 では構成が必要な場合があります。 アプリケーションに固有の構成については、公式の Node.js TLS/SSL ドキュメントを使用してください。
Java サポートされています。JDK の TLS 1.2 のサポートは、JDK 6 更新プログラム 121 および JDK 7 で追加されました。 JDK 8 では、既定で TLS 1.2 が使用されます。
Linux Linux ディストリビューションでは、TLS 1.2 のサポートに関して OpenSSL に依存する傾向があります。 OpenSSL の Changelog を参照して、使用している OpenSSL のバージョンがサポートされていることを確認してください。
Windows 8.0 - 10 サポートされています。既定で有効になっています。 既定の設定を使用していることを確認するには。
Windows Server 2012 - 2016 サポートされています。既定で有効になっています。 既定の設定を使用していることを確認するには
Windows 7 SP1 および Windows Server 2008 R2 SP1 サポートされていますが、既定では有効になっていません。 有効にする方法の詳細については、「トランスポート層セキュリティ (TLS) のレジストリ設定」を参照してください。
Windows Server 2008 SP2 TLS 1.2 のサポートには、更新プログラムが必要です。 Windows Server 2008 SP2 に TLS 1.2 のサポートを追加する更新プログラムに関するページを参照してください。
Windows Vista サポートされていません。 該当なし

Linux ディストリビューションで実行されている OpenSSL のバージョンを確認する

インストールされている OpenSSL のバージョンを確認するには、ターミナルを開き、次のコマンドを実行します。

openssl version -a

Linux 上でテスト TLS 1.2 トランザクションを実行する

Linux システムが TLS 1.2 で通信できるかどうかを確認する基本的な予備テストを実行するには、ターミナルを開いて、次のように実行してください。

openssl s_client -connect bing.com:443 -tls1_2

Application Insights に格納される個人データ

この件については、Application Insights の個人データに関する記事に詳しく説明されています。

ユーザーは Application Insights を無効にできますか。

直接無効にすることはできません。 ユーザーが Application Insights を無効にするために操作できるスイッチはありません。

ただし、アプリケーションでそのような機能を実装することはできます。 すべての SDK には、テレメトリの収集を無効にする API 設定が含まれています。

Application Insights によって送信されるデータ

SDK はプラットフォームごとに異なり、インストールできるコンポーネントは複数あります (「Application Insights - 概要」をご覧ください。)各コンポーネントは、それぞれ異なるデータを送信します。

さまざまなシナリオで送信されるデータのクラス

操作 収集されるデータのクラス (次の表を参照)
Application Insights SDK を .NET Web プロジェクトに追加する ServerContext
Inferred
Perf counters
Requests
例外
Session
users
Status Monitor を IIS にインストールする 依存関係
ServerContext
Inferred
Perf counters
Application Insights SDK を Java Web アプリに追加する ServerContext
Inferred
Request
Session
users
JavaScript SDK を Web ページに追加する ClientContext
Inferred
ページ
ClientPerf
Ajax
既定のプロパティを定義する Properties (すべての標準イベントおよびカスタム イベント)
TrackMetric を呼び出す 数値
Properties
Track* を呼び出す イベント名
Properties
TrackException を呼び出す 例外
Stack dump
Properties
SDK はデータを収集できません。 次に例を示します。
- パフォーマンス カウンターにアクセスできない
- テレメトリ初期化子で例外が発生した
SDK diagnostics

他のプラットフォームの SDK については、該当するドキュメントを参照してください。

収集されるデータのクラス

収集されるデータのクラス 含まれるデータ (網羅的なリストではありません)
Properties コードによって決まる任意のデータ
DeviceContext Id、IP、ロケール、デバイス モデル、ネットワーク、ネットワークの種類、OEM の名前、画面解像度、ロール インスタンス、ロール名、デバイスの種類
ClientContext OS、ロケール、言語、ネットワーク、ウィンドウの解像度
Session session id
ServerContext コンピューター名、ロケール、OS、デバイス、ユーザー セッション、ユーザー コンテキスト、操作
Inferred IP アドレス、タイムスタンプ、OS、ブラウザーからの geo ロケーション
メトリック メトリックの名前と値
events イベントの名前と値
PageViews URL とページ名または画面名
Client perf URL/ページ名、ブラウザーの読み込み時間
Ajax Web ページからサーバーへの HTTP 呼び出し
Requests URL、期間、応答コード
依存関係 種類 (SQL、HTTP、...)、接続文字列または URI、同期または非同期、期間、成功、SQL ステートメント (Status Monitor による)
例外 種類、メッセージ、呼び出し履歴、ソース ファイル、行の番号、thread id
Crashes Process idparent process idcrash thread id。アプリケーションの修正プログラム、id、ビルド。例外の種類、アドレス、理由。難読化されたシンボルとレジスタ、バイナリの開始アドレスと終了アドレス、バイナリ名とパス、CPU の種類
Trace メッセージ と重大度レベル
Perf counters プロセッサ時間、使用可能なメモリ、要求レート、例外レート、プロセスのプライベート バイト、IO レート、要求の期間、要求のキューの長さ
可用性 Web テストの応答コード、各テスト ステップの期間、テスト名、タイムスタンプ、成功、応答時間、テストの場所
SDK diagnostics トレース メッセージまたは例外

ApplicationInsights.config を編集して、データの一部をオフにすることができます

注意

クライアント IP は地理的な場所の推論に使用されますが、既定では、IP データは格納されなくなっており、関連するフィールドにはすべてゼロが書き込まれます。 個人データの処理について詳しく理解するには、こちらの記事をお勧めします。 IP アドレスのデータを格納する必要がある場合は、IP アドレスの収集に関する記事のオプションについての説明をご覧ください。

収集後にデータを変更または更新できますか。

いいえ。データは読み取り専用であり、消去機能による削除のみが可能です。 詳細については、「Log Analytics と Application Insights に格納される個人データに関するガイダンス」をご覧ください。

謝辞

この製品には、MaxMind によって作成された GeoLite2 データが含まれています。MaxMind は https://www.maxmind.com から入手できます。