はじめに
Azure App Serviceでフロントエンド(Node.js/Express)とバックエンド(FastAPI)を運用する際、API呼び出しのエラーを適切に追跡することが重要です。しかし、Application InsightsのKQL(Kusto Query Language)でどのテーブルを見るべきかを理解していないと、エラーを見逃してしまいます。
この記事では、まずApplication Insightsの基本的な仕組みを理解した上で、実際のトラブルシューティング経験をもとに、正しいテーブルの選択方法とKQLクエリを解説します。
本記事に含まれるコマンドやクエリは、実際の環境に適用する前に以下の点を必ず確認してください:
- リソース名、リソースグループ名、アプリケーション名は例示です。実際の環境に合わせて変更してください
- Application Insights接続文字列などの機密情報は、環境変数やKey Vaultで管理してください
- 本番環境への適用前に、開発環境での十分なテストを実施してください
リクエストの流れと Application Insights の役割
Application Insightsによる監視を理解するには、まずリクエストがどのように流れ、どこで記録されるかを知ることが重要です。
1. ユーザー操作
ユーザーがブラウザやSPA(Single Page Application)上でボタンをクリックしたり、ページを読み込んだりすると、フロントエンドでイベントが発生します。
2. フロントエンド → バックエンドへの HTTP Request
フロントエンドは、API呼び出しなどの形でバックエンドにHTTPリクエストを送信します。
ここで重要: このフロントエンドからの外部呼び出しは、Application Insightsによって**Dependency telemetry(依存関係テレメトリ)**として記録されます。
┌───────────────┐
│ フロントエンド │ ──HTTP Request→ バックエンド
└───────────────┘
↓
[dependencies テーブルに記録]
3. バックエンドでのリクエスト処理
バックエンドがHTTPリクエストを受け取ると、そのリクエストは**Request telemetry(リクエストテレメトリ)**として記録されます。
フロントエンド ──> ┌──────────────┐
│ バックエンド │
└──────────────┘
↓
[requests テーブルに記録]
4. バックエンド → 外部サービス(Dependencies)
バックエンドは、データベースや外部APIなどの依存サービスにアクセスします。これらの呼び出しもDependency telemetryとして Application Insightsに記録されます。
┌──────────────┐
フロントエンド ──> │ バックエンド │ ──→ データベース/外部API
└──────────────┘
↓
[dependencies テーブルに記録]
5. 可視化と分析
Application Insightsのポータルでは、フロントエンドの操作からバックエンドの処理、さらに依存サービスへの呼び出しまでを一連のトレースとして確認できます。これにより、ボトルネックや障害箇所の特定が容易になります。
テレメトリの記録場所まとめ
| 動作 | 記録されるテーブル | 視点 |
|---|---|---|
| フロントエンド → バックエンド | dependencies | フロントエンド |
| バックエンドがリクエスト受信 | requests | バックエンド |
| バックエンド → DB/外部API | dependencies | バックエンド |
| アプリケーション例外 | exceptions | 発生箇所 |
| ログ出力 | traces | 発生箇所 |
この基本を理解した上で、実際のトラブルシューティングを見ていきましょう。
調査報告: よくある誤解と正しいエラー追跡方法
発生した問題: requestsテーブルを見てもエラーが見つからない
問題のシナリオ
「APIエラーが頻発しているのに、以下のKQLクエリではsuccess=Trueの結果しか表示されない」
// これではフロントエンドのAPIエラーは見つからない
requests
| where timestamp > ago(24h)
| order by timestamp desc
| take 100
原因: テーブルの役割を誤解している
requestsテーブルは:
- バックエンドが受け取ったリクエストを記録
- バックエンドが404や401などを「正常に返却した」場合、
success=Trueになる - バックエンド視点での成功/失敗を記録
フロントエンドから見たAPIエラーは:
- dependenciesテーブルに記録される
- フロントエンド視点での外部依存関係(バックエンドAPI)の成功/失敗を記録
Application Insightsのテーブル構成
主要テーブルの役割
| テーブル名 | 記録内容 | フロントエンドAPIエラー | バックエンドエラー |
|---|---|---|---|
| dependencies | 外部依存関係の呼び出し | ✅ ここを見る | - |
| requests | 受信したHTTPリクエスト | - | ✅ ここを見る |
| exceptions | アプリケーション例外 | ✅ | ✅ |
| traces | ログメッセージ | ✅ | ✅ |
フロントエンド-バックエンド間エラーの正しい追跡方法
1. フロントエンドから見たAPIエラー(dependenciesテーブル)
// フロントエンドからのバックエンドAPI呼び出しエラー
dependencies
| where timestamp > ago(24h)
| where success == false // これがAPIエラー
| project
timestamp,
name, // API エンドポイント
target, // バックエンドのホスト名
resultCode, // HTTPステータスコード
duration,
data, // リクエストURL
cloud_RoleName // アプリケーション名
| order by timestamp desc
| take 100
2. エラーがない場合のデバッグ手順
ステップ1: dependenciesテーブルにデータがあるか確認
// dependenciesテーブルに何かデータがあるか確認
dependencies
| where timestamp > ago(24h)
| take 10
結果が空の場合 → フロントエンドのApplication Insights計装に問題あり
ステップ2: すべての依存関係を確認(successフィルターなし)
// フィルター条件を緩めて確認
dependencies
| where timestamp > ago(24h)
| project
timestamp,
name,
success,
resultCode,
target,
type,
cloud_RoleName
| order by timestamp desc
| take 100
ステップ3: アプリケーション名でデータを確認
// どのアプリケーション名でデータが記録されているか
dependencies
| where timestamp > ago(24h)
| summarize count() by cloud_RoleName, type
3. 全体像を把握する統合クエリ
// すべてのテーブルから直近のデータを確認
union requests, dependencies, exceptions, traces
| where timestamp > ago(24h)
| summarize count() by
TableName = itemType,
cloud_RoleName,
success = tostring(success)
| order by count_ desc
このクエリで、どのテーブルにどのようなデータが記録されているかが一目で分かります。
バックエンドエラーの追跡
バックエンドでの処理失敗を確認
// バックエンドで受け取ったリクエストのエラー(500エラーなど)
requests
| where timestamp > ago(24h)
| where cloud_RoleName contains "back" // バックエンド名でフィルタ(実際の名前に変更)
| where success == false // バックエンド側の処理失敗
| project
timestamp,
name,
resultCode,
success,
duration,
url
| order by timestamp desc
| take 100
cloud_RoleNameについて:
cloud_RoleNameは、Application Insightsに設定されたアプリケーション名です。実際の環境では、Azure PortalのApplication Insightsで確認してください。
HTTPステータスコード別の集計
// エラーコード別の集計(4xx, 5xx)
requests
| where timestamp > ago(24h)
| extend StatusCode = toint(resultCode)
| where StatusCode >= 400
| summarize
Count = count(),
AvgDuration = avg(duration),
MaxDuration = max(duration)
by resultCode, name
| order by Count desc
実用的なKQLクエリ集
エラー率の時系列グラフ
// エラー率の時系列チャート(5分間隔)
dependencies
| where timestamp > ago(24h)
| where type == "Http"
| summarize
TotalCalls = count(),
FailedCalls = countif(success == false),
ErrorRate = round(100.0 * countif(success == false) / count(), 2)
by bin(timestamp, 5m)
| order by timestamp asc
| render timechart
フロントエンド-バックエンド間の統合エラービュー
// フロントエンド-バックエンド間通信エラーの統合ビュー
union requests, dependencies, exceptions
| where timestamp > ago(24h)
| where success == false or (type == "exception")
| extend
ErrorType = case(
itemType == "request", "Backend Request Error",
itemType == "dependency", "External Dependency Error",
itemType == "exception", "Application Exception",
"Other"
),
StatusCode = tostring(coalesce(resultCode, "N/A")),
ErrorMessage = tostring(coalesce(outerMessage, message, "Unknown error"))
| project
timestamp,
ErrorType,
name,
StatusCode,
ErrorMessage,
duration,
operation_Id,
cloud_RoleName
| order by timestamp desc
| take 100
エラーコード別の円グラフ
// エラーコード別の分布
dependencies
| where timestamp > ago(24h)
| where success == false
| summarize Count = count() by resultCode
| render piechart
トラブルシューティング: dependenciesテーブルにデータがない場合
原因1: フロントエンドの計装が未設定
**server.js(またはapp.js)**で以下が設定されているか確認:
const appInsights = require("applicationinsights");
appInsights
.setup(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING) // 環境変数から取得
.setAutoDependencyCorrelation(true)
.setAutoCollectRequests(true)
.setAutoCollectPerformance(true)
.setAutoCollectExceptions(true)
.setAutoCollectDependencies(true) // ← dependenciesテーブルへの記録に重要
.setAutoCollectConsole(true)
.start();
セキュリティのポイント:
- 接続文字列は絶対にソースコードにハードコードしないでください
- 環境変数
APPLICATIONINSIGHTS_CONNECTION_STRINGで管理してください - Azure Key Vaultの使用も検討してください
原因2: 環境変数が設定されていない
Azure App Serviceの環境変数を確認:
# 環境変数の確認(リソース名は実際の環境に合わせて変更)
az webapp config appsettings list \
--resource-group <your-resource-group> \
--name <your-frontend-app-name> \
--query "[?name=='APPLICATIONINSIGHTS_CONNECTION_STRING']"
環境変数が設定されていない場合:
# 環境変数の設定(接続文字列はAzure Portalから取得)
az webapp config appsettings set \
--resource-group <your-resource-group> \
--name <your-frontend-app-name> \
--settings APPLICATIONINSIGHTS_CONNECTION_STRING="<your-connection-string>"
原因3: データ送信の遅延
Application Insightsへのデータ送信には最大5分程度の遅延があります。直近のエラーを確認する場合は時間範囲を広げてください。
// 過去1時間に範囲を広げる
dependencies
| where timestamp > ago(1h)
| where success == false
| order by timestamp desc
| take 100
Azure Dashboardへの統合
ダッシュボードの作成手順
- Azure Portal → ダッシュボード → + 新しいダッシュボード
- ダッシュボード名を入力(例: "API Error Monitoring")
- Application Insights → ログ でクエリを実行
- クエリ結果の上部にある 「📌 ダッシュボードにピン留め」 をクリック
- タイトルとサブタイトルを設定して 「適用」
推奨ダッシュボードレイアウト
効果的な監視ダッシュボードには以下のタイルを配置することをおすすめします:
- エラー率の時系列グラフ - トレンド把握
- 最新エラーリスト - 即座の問題確認
- エラーコード別分布(円グラフ) - 問題の種類を把握
- 依存関係エラー - 外部サービスの問題を特定
- 例外トップ10 - アプリケーションレベルの問題
まとめ
フロントエンド-バックエンド間のエラー追跡のポイント
| 確認したいこと | 使用するテーブル | 重要なフィルタ |
|---|---|---|
| フロントエンドから見たAPIエラー | dependencies | success == false |
| バックエンドの処理エラー | requests | success == false |
| アプリケーション例外 | exceptions | cloud_RoleName |
| ログメッセージ | traces | severityLevel >= 2 |
よくある間違い
❌ 間違い: requestsテーブルでフロントエンドのAPIエラーを探す
✅ 正解: dependenciesテーブルでフロントエンドのAPIエラーを探す
❌ 間違い: success == falseがないからエラーがないと判断
✅ 正解: まずdependenciesテーブル自体にデータがあるか確認
トラブルシューティングの手順
-
dependenciesテーブルにデータがあるか確認 -
cloud_RoleNameでアプリケーションを特定 -
success == falseでエラーをフィルタ - 統合クエリで全体像を把握
この手順で、フロントエンド-バックエンド間の通信エラーを確実に追跡できます。
セキュリティチェックリスト
この記事を参考に実装する際は、以下を必ず確認してください:
- Application Insights接続文字列を環境変数で管理している
- ソースコードに機密情報をハードコードしていない
- Azure Key Vaultの使用を検討している
- リソース名は実際の環境に合わせて変更している
- 本番環境への適用前に開発環境でテストしている
- KQLクエリに個人情報や機密情報のフィルタを追加していない