Application Insights で Azure Functions のテレメトリを分析する

Azure Functions は、関数アプリの監視をより適切に行えるように Application Insights と統合されています。 Application Insights では、アプリからログに書き込まれる情報など、関数アプリによって生成されたテレメトリ データを収集します。 Application Insights との統合は、通常、関数アプリが作成されるときに有効にされます。 お使いの関数アプリにインストルメンテーション キーが設定されていない場合は、まず Application Insights との統合を有効にする必要があります。

既定では、関数アプリから収集されたデータは、Application Insights に格納されます。 Azure portal では、Application Insights によって、テレメトリ データの広範囲にわたるセットの視覚化が提供されます。 エラー ログ、クエリ イベント、メトリックの詳細を表示できます。 この記事では、収集したデータを表示してクエリを実行する方法の基本的な例を示します。 Application Insights での関数アプリ データの詳細については、「Application Insights とは何か?」を参照してください。

関数アプリから Application Insights のデータを表示できるようにするには、その関数アプリに少なくとも共同作成者ロールのアクセス許可を付与する必要があります。 また、Application Insights インスタンスに監視閲覧者のアクセス許可を付与する必要があります。 これらのアクセス許可は、作成するすべての関数アプリと Application Insights インスタンスに対して既定で付与されます。

データ保有と、かかる可能性のあるストレージ コストの詳細については、「Application Insights でのデータの収集、保有、保存」を参照してください。

[監視] タブでのテレメトリの表示

Application Insights 統合が有効になっている場合は、 [監視] タブでテレメトリ データを表示できます。

  1. 関数アプリのページで、Application Insights が構成されてから少なくとも 1 回実行された関数を選択します。 次に、左側のウィンドウで [監視] を選択します。 関数呼び出しの一覧が表示されるまで、 [更新] を一定間隔で選択します。

    Invocations list

    Note

    テレメトリ クライアントではサーバーに送信するデータをバッチ処理するため、一覧が表示されるには最大で 5 分かかる場合があります。 この遅延は、Live Metrics Stream には適用されません。 このサービスは、ページの読み込み時に Functions ホストに接続するため、ログがページに直接ストリーム配信されます。

  2. 特定の関数呼び出しのログを表示するには、その呼び出しの [日付 (UTC)] 列のリンクを選択します。 その呼び出しのログ出力は、新しいページに表示されます。

    Invocation details

  3. [Application Insights で実行する] を選択して、Azure ログ内の Azure Monitor ログ データを取得するクエリのソースを表示します。 サブスクリプションで Azure Log Analytics を初めて使用する場合は、有効にするように求められます。

  4. Log Analytics を有効にすると、次のクエリが表示されます。 クエリの結果が過去 30 日間 (where timestamp > ago(30d)) に制限されていることがわかります。また、結果に表示されるのはわずか 20 行 (take 20) です。 一方、関数の呼び出し詳細の一覧には、過去 30 日間のデータが無制限で表示されます。

    Application Insights Analytics invocation list

詳細については、後述の「テレメトリをクエリする」を参照してください。

Application Insights でテレメトリを表示する

Azure portal で関数アプリから Application Insights を開くには:

  1. Azure portal でお使いの関数アプリに移動します。

  2. 左側のページの [設定] で、 [Application Insights] を選択します。

  3. お使いのサブスクリプションで Application Insights を初めて使用する場合は、それを有効にするようメッセージが表示されます。 これを行うには、 [Application Insights を有効にする] を選択してから、次のページで [適用] を選択します。

Open Application Insights from the function app Overview page

Application Insights の使用方法については、「Application Insights のドキュメント」をご覧ください。 このセクションでは、Application Insights でデータを表示する方法の例をいくつか示します。 Application Insights を既に使い慣れている場合は、テレメトリ データの構成とカスタマイズの方法に関するセクションに直接進んでかまいません。

Application Insights Overview tab

Application Insights の次の領域は、関数の動作、パフォーマンス、およびエラーを評価するときに役立ちます。

調査 説明
障害 関数の失敗やサーバーの例外に基づいてグラフやアラートを作成します。 [操作名] は関数名です。 依存関係に関するカスタム テレメトリを実装している場合を除き、依存関係のエラーは表示されません。
パフォーマンス クラウド ロール インスタンスあたりのリソース使用率とスループットを表示して、パフォーマンスの問題を分析します。 このパフォーマンス データは、基になっているリソースの処理が関数のために滞っている場合のデバッグに役立つことがあります。
メトリック メトリックに基づいたグラフやアラートを作成します。 メトリックには、関数呼び出しの数、実行時間、成功率が含まれます。
ライブ メトリック メトリック データが作成されたときに、ほぼリアルタイムに表示します。

テレメトリをクエリする

Application Insights Analytics では、データベース内のテーブルの形式ですべてのテレメトリ データにアクセスできます。 Analytics では、データを抽出、操作、視覚化するためのクエリ言語が用意されています。

[ログ] を選択して、ログに記録されたイベントを探索または照会します。

Analytics example

以下は、直近 30 分間の worker あたりの要求数の分布を示すクエリの例です。

requests
| where timestamp > ago(30m) 
| summarize count() by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart

使用可能なテーブルは、左側の [スキーマ] タブに表示されます。 次のテーブルで、関数呼び出しによって生成されたデータを確認できます。

テーブル 説明
traces ランタイムによって作成されたログ、スケール コントローラー、関数コードからのトレース。
requests 関数呼び出しごとの要求。
exceptions ランタイムによってスローされた例外。
customMetrics 呼び出しの成功数と失敗数、成功率、時間。
customEvents ランタイムによって追跡されたイベント。たとえば、関数をトリガーする HTTP 要求など。
performanceCounters 関数が実行されているサーバーのパフォーマンスに関する情報。

その他のテーブルには、可用性テストと、クライアントとブラウザーのテレメトリがあります。 カスタム テレメトリを実装して、テーブルにデータを追加できます。

各テーブルでは、関数固有のデータの一部が customDimensions フィールドに保存されます。 たとえば、次のクエリでは、ログ レベルが Error のすべてのトレースが取得されます。

traces 
| where customDimensions.LogLevel == "Error"

ランタイムにより、customDimensions.LogLevel フィールドと customDimensions.Category フィールドが提供されます。 関数コードで記述したログにフィールドを追加できます。 C# での例については、.NET クラス ライブラリ開発者ガイドの「構造化ログ」を参照してください。

クエリ関数の呼び出し

すべての関数呼び出しには一意の ID が割り当てられます。 InvocationId はカスタム ディメンションに含まれており、特定の関数実行からのすべてのログを関連付けるために使用できます。

traces
| project customDimensions["InvocationId"], message

テレメトリの関連付け

さまざまな関数のログは、operation_Id を使用して関連付けることができます。 特定の論理操作のすべてのログを返すには、次のクエリを使用します。

traces
| where operation_Id == '45fa5c4f8097239efe14a2388f8b4e29'
| project timestamp, customDimensions["InvocationId"], message
| order by timestamp

サンプリング率

サンプリング構成を使用して、テレメトリの量を減らすことができます。 サンプリングが操作可能かどうかを判断するには、次のクエリを使用します。 いずれかの種類の RetainedPercentage が 100 未満である場合、その種類のテレメトリはサンプリングされています。

union requests,dependencies,pageViews,browserTimings,exceptions,traces
| where timestamp > ago(1d)
| summarize RetainedPercentage = 100/avg(itemCount) by bin(timestamp, 1h), itemType

スケール コントローラー ログのクエリを実行する

この機能はプレビュー段階にあります。

スケール コントローラー ログの記録Application Insights 統合の両方を有効にすると、Application Insights ログ検索を使用して、出力されたスケール コントローラー ログのクエリを実行することができます。 スケール コントローラー ログは、ScaleControllerLogs カテゴリの traces コレクションに保存されます。

次のクエリを使用すると、指定した期間内の現在の関数アプリのスケール コントローラー ログをすべて検索することができます。

traces 
| extend CustomDimensions = todynamic(tostring(customDimensions))
| where CustomDimensions.Category == "ScaleControllerLogs"

次のクエリは、前のクエリで展開して、スケールの変更を示すログのみを取得する方法を示しています。

traces 
| extend CustomDimensions = todynamic(tostring(customDimensions))
| where CustomDimensions.Category == "ScaleControllerLogs"
| where message == "Instance count changed"
| extend Reason = CustomDimensions.Reason
| extend PreviousInstanceCount = CustomDimensions.PreviousInstanceCount
| extend NewInstanceCount = CustomDimensions.CurrentInstanceCount

従量課金プランに特有のメトリック

従量課金プランでの実行時には、1 回の関数実行の実行 "コスト" は、"GB 秒数" で測定されます。 実行コストは、そのメモリ使用量と実行時間を組み合わせて計算されます。 詳細については、「従量課金プランのコストの見積もり」を参照してください。

次のテレメトリ クエリは、従量課金プランで実行される関数のコストに影響を与えるメトリックに特有のものです。

メモリの使用量を確認する

[Monitoring](監視)[ログ (Analytics)] を選択した後、次のテレメトリ クエリをコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 このクエリでは、サンプリングされた各時刻におけるメモリ使用量の合計が返されます。

performanceCounters
| where name == "Private Bytes"
| project timestamp, name, value

結果は次の例のようになります。

タイムスタンプ [UTC] name value
9/12/2019, 1:05:14.947 AM Private Bytes 209,932,288
9/12/2019, 1:06:14.994 AM Private Bytes 212,189,184
9/12/2019, 1:06:30.010 AM Private Bytes 231,714,816
9/12/2019, 1:07:15.040 AM Private Bytes 210,591,744
9/12/2019, 1:12:16.285 AM Private Bytes 216,285,184
9/12/2019, 1:12:31.376 AM Private Bytes 235,806,720

継続時間を確認する

Azure Monitor ではリソース レベルでメトリックが追跡され、Functions の場合は関数アプリです。 Application Insights の統合では、関数ごとにメトリックが出力されます。 関数の平均継続時間を取得するための分析クエリの例を次に示します。

customMetrics
| where name contains "Duration"
| extend averageDuration = valueSum / valueCount
| summarize averageDurationMilliseconds=avg(averageDuration) by name
name averageDurationMilliseconds
QueueTrigger AvgDurationMs 16.087
QueueTrigger MaxDurationMs 90.249
QueueTrigger MinDurationMs 8.522

次の手順

Azure Functions の監視の詳細を確認してください。