Azureリソースとアプリケーションを監視する

Azure Monitorを使用して、JavaScript アプリケーションと、それらが依存するAzure サービス全体でログ、メトリック、アラートを収集します。 Azure Monitor は、テレメトリを収集して格納する中央プラットフォーム サービスです。 Application Insights を使用してアプリケーションをインストルメント化できます。 ホストされているアプリケーション サービス、アプリケーションが統合するAzure サービス、およびアプリケーション のソース コード自体を監視する必要があります。

ログ、メトリック、アラートについて

テレメトリは、アプリケーションとサービスから収集され、その正常性、パフォーマンス、使用状況を監視するために収集されるデータです。 Azureでは、テレメトリはログ、メトリック、アラートに分類されます。

Azureには、次の 4 種類のテレメトリが用意されています。

テレメトリタイプ それがあなたに与えるもの サービスごとに検索する場所
メトリック 数値、時系列データ (CPU、メモリなど) ポータルまたは CLI のaz monitor metrics
アラート しきい値に達したときのプロアクティブ通知 ポータルまたは CLI でのaz monitor metrics alert
ログ テキスト ベースのイベントと診断 (Web、アプリ) App Service ログ 、Functions モニター、Container Apps 診断
カスタム ログ App Insights を使用した独自のアプリケーション テレメトリ Application Insights リソースの ログ (トレース) テーブル

質問に適したテレメトリを選択します。

シナリオ ログの使用... メトリックの使用... アラートの使用...
"Web アプリは起動して応答しましたか? App サービス Web サーバー ログ なし なし
"関数がタイムアウトしているか、失敗していますか? 関数呼び出しログ (モニター) 関数の実行期間メトリック "関数エラー >0" に関するアラート
サービスの混雑具合はどのくらいで、スケーラブルですか? なし メトリックにおけるサービススループット/CPU CPU% > 70% での自動スケール アラート
私のコードはどんな例外をスローしていますか? Application Insights のカスタム トレース ログ なし "ServerExceptions >0" に関するアラート
"トランザクションまたはクォータの制限を超えましたか? なし クォータ関連のメトリック (トランザクション、スロットリング) "ThrottlingCount >0" に対するアラート

コストの最適化

Azure Monitorのコストを大幅に削減するには>ベスト プラクティスを理解して、収集するデータの量を減らす構成オプションと機会を得ることができます。

すべてのAzure リソースのログとメトリックを有効にする

Azure内の各サービスには、独自のログ機能とメトリック機能があります。 エンド ツー エンド アプリケーション全体を監視するために必要なテレメトリを確保するために、各Azure リソースのログ記録を有効にします。

Azure Monitor リソースを作成する

Azure Monitor リソースを作成して、Azure リソースからログとメトリックを収集できます。 このリソースは通常、ログとメトリックが格納されるLog Analytics ワークスペースです。

このリソースは、いくつかの方法で作成できます。

  • Azure portal: Azure ポータルを使用してLog Analytics ワークスペースを作成し、リソースの診断設定を構成します。
  • Azure CLI: Azure CLI を使用してLog Analytics ワークスペースを作成し、リソースの診断設定を構成します。
  • PowerShell: PowerShell を使用してLog Analytics ワークスペースを作成し、リソースの診断設定を構成します。
  • Bicep: Bicep テンプレートを使用して、Azure Monitor リソースを宣言によって定義およびデプロイします。

Azure CLIを使用してLog Analytics ワークスペースを作成する

Azure CLIを使用して、ログとメトリックが格納されるLog Analytics ワークスペースを作成します。 例:

# Variables
resourceGroup="myResourceGroup"
location="eastus"
workspaceName="myWorkspace"
webAppName="myWebApp"
diagName="${webAppName}/appServiceLogging"
SUBSCRIPTION_ID=$(az account show --query id -o tsv)

# 1) Create a Log Analytics workspace
workspaceId=$(az monitor log-analytics workspace create \
  --resource-group $resourceGroup \
  --workspace-name $workspaceName \
  --location $location \
  --query id -o tsv)

# 2) Enable diagnostic settings on your App Service
az monitor diagnostic-settings create \
  --name "$diagName" \
  --resource "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$webAppName" \
  --workspace $workspaceId \
  --logs '[{"category": "Administrative", "enabled": true},{"category":"AppServiceConsoleLogs","enabled":true},{"category":"AppServiceHTTPLogs","enabled":true}]' \
  --metrics '[{"category":"AllMetrics","enabled":true}]'

Bicep を使用してLog Analytics ワークスペースを作成する

Bicepを使用して、Azure Monitor リソースを宣言によって定義およびデプロイします。 この例では、Log Analytics ワークスペースを作成し、App Service の診断設定を構成します。

Bicep diagnosticSettings リソース リファレンスを使用して、IaC テンプレートにログ記録、メトリック、アラートを含めます。 例 (Bicep):

param webAppName string

resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: 'myWorkspace'
  location: resourceGroup().location
}

resource diagSettings 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: '${webApp.name}/appServiceLogging'
  properties: {
    workspaceId: logAnalytics.id
    logs: [
      { category: 'AppServiceConsoleLogs'; enabled: true }
      { category: 'AppServiceHTTPLogs'; enabled: true }
    ]
    metrics: [
      { category: 'AllMetrics'; enabled: true }
    ]
  }
}

リソースのアラートを作成する

メトリックのアラートは、Azure ポータル または Azure CLI を使用して設定できます。 アラートには、特定のメトリック、通信ストリーム (電子メールなど)、頻度を含めることができます。

ポータルまたはプログラムでメトリック アラートを作成するには、次の例を使用します。

  • Azure CLI: az monitor metrics alert を使用したクイック セットアップ
  • Bicep: Microsoft.Insights/metricAlerts の宣言型 IaC 定義

アラートでは、ターゲット メトリック、通知チャネル (電子メール、Webhook)、重大度、評価頻度、およびアクション グループを指定できます。

az monitor metrics alert create \
  --name HighCpuAlert \
  --resource-group MyResourceGroup \
  --scopes /subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/Microsoft.Web/sites/myApp \
  --condition "avg CpuPercentage > 70" \
  --description "Alert when CPU goes above 70%" \
  --severity 2 \
  --window-size 5m \
  --evaluation-frequency 1m \
  --action /subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/microsoft.insights/actionGroups/MyActionGroup
resource cpuAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
  name: 'highCpuAlert'
  location: resourceGroup().location
  properties: {
    description: 'Alert when CPU goes above 70%'
    severity: 2
    enabled: true
    scopes: [
      webApp.id
    ]
    evaluationFrequency: 'PT1M'
    windowSize: 'PT5M'
    criteria: {
      allOf: [
        {
          criterionType: 'StaticThresholdCriterion'
          name: 'HighCpu'
          metricName: 'CpuPercentage'
          metricNamespace: 'Microsoft.Web/sites'
          operator: 'GreaterThan'
          threshold: 70
          timeAggregation: 'Average'
        }
      ]
    }
    autoMitigate: false
    actions: [
      {
        actionGroupId: '/subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/microsoft.insights/actionGroups/MyActionGroup'
      }
    ]
  }
}

ログ データを表示する

Azure ポータルでログ データを表示するには、Log Analytics ワークスペースに移動し、Logs を選択します。 ログに対して Kusto クエリ言語 (KQL) クエリを実行できます。

ログストリーム

ログのストリーミング方法の詳細については、次の表を参照してください。

Azure MCPのサーバー

ローカルで開発する場合は、Azure MCP Servermonitor ツールを使用して、IDE を終了せずにログを照会できます。 サーバーをインストールすると、次のようなCopilotプロンプトが表示されます。

  • ワークスペースを一覧表示する: "サブスクリプション内のすべてのLog Analyticsワークスペースを表示する"。
  • テーブルの検索: "ワークスペース 'security-logs' 内のすべてのテーブルを一覧表示する"
  • 複雑なクエリ: "過去 24 時間の Web サーバーの CPU 使用率の傾向を表示する"

コードにログ記録を追加する

アプリケーション ログの場合、Application Insights は次の機能を提供できます。

  • 初期化に応じて、Azure サービス内およびソースコード内の標準ロギング。
  • デプロイ パイプラインとソース コードからのカスタム ログ。

標準コンソールログ出力 (stdout/stderr)

Azure Web アプリとAzure Functionsは、適切なログ機能を使用する場合、stdout と stderr にカスタム ログを自動的に提供します。

  • Web アプリでは console.log('your message here')を使用します。
  • 関数アプリは context.log('your message here')を使用します。

カスタム Application Insights のログ記録を追加する

Azure Monitorで Application Insights を使用して、より豊富なカスタム ログを追加できます。 Application Insights には、 サーバー (Node.js) と クライアント (ブラウザー) のシナリオが用意されています。

  • Application Insights SDK をソース コードに追加します。
  • npm パッケージを使用して Node.js からログを記録します。
    • カスタム コンソール ログを収集するには、 enableAutoCollectConsole: true を使用して Node.js SDK を構成してください。
  • npm パッケージを使用してクライアント コードからログを記録します。
  • Kubernetes クラスターまたはAzure仮想マシンからログを記録します。

SDK パイプライン ログを有効にする (@Azure/logger)

SDKの詳細度をAZURE_LOG_LEVEL環境変数または@azure/logger npmパッケージを使用して制御します。

import { setLogLevel } from "@azure/logger";
// Options: 'error', 'warning', 'info', 'verbose'
setLogLevel(process.env.AZURE_LOG_LEVEL || "info");

Application Insights Node.js SDK を構成する

サンプリング、依存関係の収集、およびコンソール ログ キャプチャを使用して、 Node.js SDK の Application Insights を初期化します。

import appInsights from "applicationinsights";
appInsights
  .setup(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || "<YOUR_CONNECTION_STRING>")
  .setAutoCollectConsole(true, true)        // collect console.log
  .setAutoCollectDependencies(true)        // track outgoing requests
  .setInternalLogging(false, true)         // SDK internal logs
  .start();

// Optional: add custom properties to all telemetry
appInsights.defaultClient.commonProperties = { serviceName: "my-service" };

相関関係と分散トレースを追加する

Application Insights SDK は、操作 ID と関連付け ID を要求に自動挿入します。 カスタム関連付けまたはプロパティを追加するには:

appInsights.defaultClient.trackTrace({
  message: "Custom trace",
  properties: { userId: user.id }
});

詳細情報: 分散トレース のガイダンス

開発スクリプトでテレメトリをフラッシュする

ローカル開発中にプロセスが終了する前にログが送信されていることを確認します。

appInsights.defaultClient.flush({
  callback: () => process.exit(0)
});

クライアント側のテレメトリのセットアップ

クライアント アプリケーションの場合は、 @microsoft/applicationinsights-web パッケージ を使用します。

import { ApplicationInsights } from "@microsoft/applicationinsights-web";
const ai = new ApplicationInsights({ config: {
  connectionString: "<YOUR_CONNECTION_STRING>",
  enableAutoRouteTracking: true
}});
ai.loadAppInsights();