JavaScript 用 Azure Monitor クエリ クライアント ライブラリ - バージョン 1.2.0

Azure Monitor クエリ クライアント ライブラリは、 Azure Monitor の 2 つのデータ プラットフォームに対して読み取り専用クエリを実行するために使用されます。

  • ログ - 監視対象のリソースからログとパフォーマンス データを収集して整理します。 Azure サービスからのプラットフォーム ログ、仮想マシン エージェントからのログとパフォーマンス データ、アプリの使用状況とパフォーマンス データなど、さまざまなソースからのデータを 1 つの Azure Log Analytics ワークスペースに統合できます。 さまざまなデータ型は、Kusto 照会言語を使用して一緒に分析できます。
  • メトリック - 監視対象のリソースから時系列データベースに数値データを収集します。 メトリックは、一定の間隔で収集される数値であり、特定の時刻におけるシステムの何らかの特性を表しています。 メトリックは軽量で、ほぼリアルタイムのシナリオをサポートできるため、アラートや問題の迅速な検出に役立ちます。

リソース:

作業の開始

サポートされている環境

詳細については、 サポート ポリシーを参照してください。

前提条件

パッケージをインストールする

npm を使用して JavaScript 用 Azure Monitor クエリ クライアント ライブラリをインストールします。

npm install @azure/monitor-query

クライアントを作成する

ログまたはメトリックに対してクエリを実行するには、認証されたクライアントが必要です。 認証を行うために、次の例では、@azure/ID パッケージの DefaultAzureCredential を使用します。

import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient, MetricsBatchQueryClient } from "@azure/monitor-query";

const credential = new DefaultAzureCredential();

const logsQueryClient: LogsQueryClient = new LogsQueryClient(credential);
// or
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential);
// or
const endPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/

const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(
  endPoint,
  credential
);

Azure ソブリン クラウド用にクライアントを構成する

既定では、 LogsQueryClientMetricsQueryClient は、Azure パブリック クラウドを使用するように構成されています。 代わりにソブリン クラウドを使用するには、正しい endpoint 引数を指定します。 例:

import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient } from "@azure/monitor-query";

const credential = new DefaultAzureCredential();

const logsQueryClient = new LogsQueryClient(credential, {
  endpoint: "https://api.loganalytics.azure.cn/v1",
});

// or
const metricsQueryClient = new MetricsQueryClient(credential{
  endpoint: "https://management.chinacloudapi.cn",
});

: 現時点では、MetricsQueryClientメトリックのクエリに Azure Resource Manager (ARM) エンドポイントを使用しています。 このクライアントを使用する場合は、クラウドに対応する管理エンドポイントが必要です。 この詳細は、今後変更される可能性があります。

クエリを実行します

ログとメトリックのクエリの例については、「例」セクション 参照してください。

主要な概念

クエリレートの制限と調整をログに記録する

要求レートが高すぎると、Log Analytics サービスによって調整が適用されます。 返される行の最大数などの制限は、Kusto クエリにも適用されます。 詳細については、「 クエリ API」を参照してください。

メトリック データ構造

メトリック値の各セットは、次の特性を持つ時系列です。

  • 値が収集された時刻
  • 値に関連付けられているリソース
  • メトリックのカテゴリのように機能する名前空間
  • メトリック名
  • 値そのもの
  • 多次元メトリックで説明されているように、一部のメトリックには複数のディメンションがあります。 カスタム メトリックは最大 10 個のディメンションを持つことができます。

Logs クエリ

LogsQueryClient使用して、Kusto 照会言語を使用して Log Analytics ワークスペースのクエリを実行できます。 は timespan.duration 、ISO 8601 期間形式の文字列として指定できます。 一般的に Durations 使用される ISO 8601 の期間に用意されている定数を使用できます。

ワークスペース ID またはリソース ID でログに対してクエリを実行できます。 結果は、行のコレクションを含むテーブルとして返されます。

ワークスペース中心のログ クエリ

ワークスペース ID でクエリを実行するには、 メソッドを使用します LogsQueryClient.queryWorkspace

import { DefaultAzureCredential } from "@azure/identity";
import { Durations, LogsQueryClient, LogsQueryResultStatus, LogsTable } from "@azure/monitor-query";

const azureLogAnalyticsWorkspaceId = "<the Workspace Id for your Azure Log Analytics resource>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());

async function run() {
  const kustoQuery = "AppEvents | limit 1";
  const result = await logsQueryClient.queryWorkspace(azureLogAnalyticsWorkspaceId, kustoQuery, {
    duration: Durations.twentyFourHours,
  });

  if (result.status === LogsQueryResultStatus.Success) {
    const tablesFromResult: LogsTable[] = result.tables;

    if (tablesFromResult.length === 0) {
      console.log(`No results for query '${kustoQuery}'`);
      return;
    }
    console.log(`This query has returned table(s) - `);
    processTables(tablesFromResult);
  } else {
    console.log(`Error processing the query '${kustoQuery}' - ${result.partialError}`);
    if (result.partialTables.length > 0) {
      console.log(`This query has also returned partial data in the following table(s) - `);
      processTables(result.partialTables);
    }
  }
}

async function processTables(tablesFromResult: LogsTable[]) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

run().catch((err) => console.log("ERROR:", err));

リソース中心のログ クエリ

次の例では、Azure リソースから直接ログに対してクエリを実行する方法を示します。 ここでは、 メソッドが queryResource 使用され、Azure リソース ID が渡されます。 たとえば、「 /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name} 」のように入力します。

リソース ID を見つけるには:

  1. Azure portal内のリソースのページに移動します。
  2. [ 概要 ] ブレードで、[ JSON ビュー ] リンクを選択します。
  3. 結果の JSON で、 プロパティの値を id コピーします。
/**
 * @summary Demonstrates how to run a query against a Log Analytics workspace, using an Azure resource ID.
 */

import { DefaultAzureCredential } from "@azure/identity";
import {
  Durations,
  LogsQueryClient,
  LogsTable,
  LogsQueryOptions,
  LogsQueryResultStatus,
} from "@azure/monitor-query";
import * as dotenv from "dotenv";
dotenv.config();

const logsResourceId = process.env.LOGS_RESOURCE_ID;

export async function main() {
  const tokenCredential = new DefaultAzureCredential();
  const logsQueryClient = new LogsQueryClient(tokenCredential);

  if (!logsResourceId) {
    throw new Error("LOGS_RESOURCE_ID must be set in the environment for this sample");
  }

  const kustoQuery = `MyTable_CL | summarize count()`

  console.log(`Running '${kustoQuery}' over the last One Hour`);
  const queryLogsOptions: LogsQueryOptions = {
    // explicitly control the amount of time the server can spend processing the query.
    serverTimeoutInSeconds: 600, // sets the timeout to 10 minutes
    // optionally enable returning additional statistics about the query's execution.
    // (by default, this is off)
    includeQueryStatistics: true,
  };

  const result = await logsQueryClient.queryResource(
    logsResourceId, 
    kustoQuery,
    { duration: Durations.sevenDays },
    queryLogsOptions);

  const executionTime =
    result.statistics && result.statistics.query && (result.statistics.query as any).executionTime;

  console.log(
    `Results for query '${kustoQuery}', execution time: ${
      executionTime == null ? "unknown" : executionTime
    }`
  );

  if (result.status === LogsQueryResultStatus.Success) {
    const tablesFromResult: LogsTable[] = result.tables;

    if (tablesFromResult.length === 0) {
      console.log(`No results for query '${kustoQuery}'`);
      return;
    }
    console.log(`This query has returned table(s) - `);
    processTables(tablesFromResult);
  } else {
    console.log(`Error processing the query '${kustoQuery}' - ${result.partialError}`);
    if (result.partialTables.length > 0) {
      console.log(`This query has also returned partial data in the following table(s) - `);
      processTables(result.partialTables);
    }
  }
}

async function processTables(tablesFromResult: LogsTable[]) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exit(1);
});

ログのクエリ応答を処理する

LogsQueryClient 関数は queryWorkspace オブジェクトをLogsQueryResult返します。 オブジェクトの種類には、 または をLogsQueryPartialResult指定LogsQuerySuccessfulResultできます。 応答の階層を次に示します。

LogsQuerySuccessfulResult
|---statistics
|---visualization
|---status ("Success")
|---tables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

LogsQueryPartialResult
|---statistics
|---visualization
|---status ("PartialFailure")
|---partialError
    |--name
    |--code
    |--message
    |--stack
|---partialTables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

たとえば、テーブルを使用して応答を処理するには、次のようにします。

async function processTables(tablesFromResult: LogsTable[]) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

完全なサンプル については、こちらを参照してください

バッチ ログ クエリ

次の例では、バッチ クエリ API を使用して複数のクエリを同時に送信する方法を示します。 クエリは、オブジェクトの BatchQuery 一覧として表すことができます。

export async function main() {
  if (!monitorWorkspaceId) {
    throw new Error("MONITOR_WORKSPACE_ID must be set in the environment for this sample");
  }

  const tokenCredential = new DefaultAzureCredential();
  const logsQueryClient = new LogsQueryClient(tokenCredential);

  const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";
  const queriesBatch = [
    {
      workspaceId: monitorWorkspaceId,
      query: kqlQuery,
      timespan: { duration: "P1D" },
    },
    {
      workspaceId: monitorWorkspaceId,
      query: "AzureActivity | summarize count()",
      timespan: { duration: "PT1H" },
    },
    {
      workspaceId: monitorWorkspaceId,
      query:
        "AppRequests | take 10 | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId",
      timespan: { duration: "PT1H" },
    },
    {
      workspaceId: monitorWorkspaceId,
      query: "AppRequests | take 2",
      timespan: { duration: "PT1H" },
      includeQueryStatistics: true,
    },
  ];

  const result = await logsQueryClient.queryBatch(queriesBatch);

  if (result == null) {
    throw new Error("No response for query");
  }

  let i = 0;
  for (const response of result) {
    console.log(`Results for query with query: ${queriesBatch[i]}`);
    if (response.status === LogsQueryResultStatus.Success) {
      console.log(
        `Printing results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
      );
      processTables(response.tables);
    } else if (response.status === LogsQueryResultStatus.PartialFailure) {
      console.log(
        `Printing partial results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
      );
      processTables(response.partialTables);
      console.log(
        ` Query had errors:${response.partialError.message} with code ${response.partialError.code}`
      );
    } else {
      console.log(`Printing errors from query '${queriesBatch[i].query}'`);
      console.log(` Query had errors:${response.message} with code ${response.code}`);
    }
    // next query
    i++;
  }
}

async function processTables(tablesFromResult: LogsTable[]) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

ログのバッチ クエリ応答を処理する

LogsQueryClient 関数は queryBatch オブジェクトをLogsQueryBatchResult返します。 LogsQueryBatchResult には、次の可能な型を持つオブジェクトの一覧が含まれています。

  • LogsQueryPartialResult
  • LogsQuerySuccessfulResult
  • LogsQueryError

応答の階層を次に示します。

LogsQuerySuccessfulResult
|---statistics
|---visualization
|---status ("Success")
|---tables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

LogsQueryPartialResult
|---statistics
|---visualization
|---status ("PartialFailure")
|---partialError
    |--name
    |--code
    |--message
    |--stack
|---partialTables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

LogsQueryError
|--name
|--code
|--message
|--stack
|--status ("Failure")

たとえば、次のコードはバッチ ログクエリ応答を処理します。

async function processBatchResult(result: LogsQueryBatchResult) {
  let i = 0;
  for (const response of result) {
    console.log(`Results for query with query: ${queriesBatch[i]}`);
    if (response.status === LogsQueryResultStatus.Success) {
      console.log(
        `Printing results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
      );
      processTables(response.tables);
    } else if (response.status === LogsQueryResultStatus.PartialFailure) {
      console.log(
        `Printing partial results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
      );
      processTables(response.partialTables);
      console.log(
        ` Query had errors:${response.partialError.message} with code ${response.partialError.code}`
      );
    } else {
      console.log(`Printing errors from query '${queriesBatch[i].query}'`);
      console.log(` Query had errors:${response.message} with code ${response.code}`);
    }
    // next query
    i++;
  }
}

async function processTables(tablesFromResult: LogsTable[]) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

完全なサンプル については、こちらを参照してください

高度なログクエリシナリオ

ログクエリのタイムアウトを設定する

一部のログ クエリの実行には 3 分以上かかります。 既定のサーバー タイムアウトは 3 分です。 サーバーのタイムアウトを最大 10 分に増やすことができます。 次の例では、オブジェクトの serverTimeoutInSeconds プロパティをLogsQueryOptions使用して、サーバーのタイムアウトを 10 分に増やします。

// setting optional parameters
const queryLogsOptions: LogsQueryOptions = {
  // explicitly control the amount of time the server can spend processing the query.
  serverTimeoutInSeconds: 600, // 600 seconds = 10 minutes
};

const result = await logsQueryClient.queryWorkspace(
  azureLogAnalyticsWorkspaceId,
  kustoQuery,
  { duration: Durations.twentyFourHours },
  queryLogsOptions
);

const tablesFromResult = result.tables;

複数のワークスペースにクエリを実行する

同じログ クエリを複数の Log Analytics ワークスペースで実行できます。 Kusto クエリに加えて、次のパラメーターが必要です。

  • workspaceId - 最初の (プライマリ) ワークスペース ID。
  • additionalWorkspaces - パラメーターで指定されたワークスペースを除くワークスペースの workspaceId 一覧。 パラメーターのリスト アイテムは、次の識別子形式で構成できます。
    • 修飾されたワークスペース名
    • ワークスペース ID
    • Azure リソース ID

たとえば、次のクエリは 3 つのワークスペースで実行されます。

const queryLogsOptions: LogsQueryOptions = {
  additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};

const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
  azureLogAnalyticsWorkspaceId,
  kustoQuery,
  { duration: Durations.twentyFourHours },
  queryLogsOptions
);

各ワークスペースの結果を表示するには、 列を TenantId 使用して結果を並べ替えるか、Kusto クエリでフィルター処理します。

TenantId で結果を並べ替えます

AppEvents | order by TenantId

TenantId で結果をフィルター処理する

AppEvents | filter TenantId == "<workspace2>"

完全なサンプル については、こちらを参照してください

統計を含める

CPU やメモリ消費量などのクエリ実行統計をログに取得するには:

  1. LogsQueryOptions.includeQueryStatistics プロパティを trueに設定します。
  2. オブジェクト内の statistics フィールドに LogsQueryResult アクセスします。

次の例では、クエリの実行時間を出力します。

const workspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
const kustoQuery = "AzureActivity | top 10 by TimeGenerated";

const result = await logsQueryClient.queryWorkspace(
  monitorWorkspaceId,
  kustoQuery,
  { duration: Durations.oneDay },
  {
    includeQueryStatistics: true,
  }
);

const executionTime =
  result.statistics && result.statistics.query && result.statistics.query.executionTime;

console.log(
  `Results for query '${kustoQuery}', execution time: ${
    executionTime == null ? "unknown" : executionTime
  }`
);

ペイロードの構造は statistics クエリによって異なるため、戻り値の Record<string, unknown> 型が使用されます。 これには生の JSON 応答が含まれています。 統計は、JSON の query プロパティ内にあります。 例:

{
  "query": {
    "executionTime": 0.0156478,
    "resourceUsage": {...},
    "inputDatasetStatistics": {...},
    "datasetStatistics": [{...}]
  }
}

視覚化を含める

render 演算子を使用してログ クエリの視覚化データを取得するには:

  1. LogsQueryOptions.includeVisualization プロパティを trueに設定します。
  2. オブジェクト内の visualization フィールドに LogsQueryResult アクセスします。

例:

const workspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());

const result = await logsQueryClient.queryWorkspace(
    monitorWorkspaceId,
    @"StormEvents
        | summarize event_count = count() by State
        | where event_count > 10
        | project State, event_count
        | render columnchart",
    { duration: Durations.oneDay },
    {
      includeVisualization: true
    }
  );
console.log("visualization result:", result.visualization);

ペイロードの構造は visualization クエリによって異なるため、戻り値の Record<string, unknown> 型が使用されます。 これには生の JSON 応答が含まれています。 例:

{
  "visualization": "columnchart",
  "title": "the chart title",
  "accumulate": false,
  "isQuerySorted": false,
  "kind": null,
  "legend": null,
  "series": null,
  "yMin": "NaN",
  "yMax": "NaN",
  "xAxis": null,
  "xColumn": null,
  "xTitle": "x axis title",
  "yAxis": null,
  "yColumns": null,
  "ySplit": null,
  "yTitle": null,
  "anomalyColumns": null
}

メトリック クエリ

次の例では、 Azure Metrics Advisor サブスクリプションのメトリックを取得します。 リソース URI は、メトリックのクエリ対象のリソースの URI である必要があります。 通常は の形式 /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>です。

リソース URI を見つけるには:

  1. Azure portal内のリソースのページに移動します。
  2. [ 概要 ] ブレードで、[ JSON ビュー ] リンクを選択します。
  3. 結果の JSON で、 プロパティの値を id コピーします。
import { DefaultAzureCredential } from "@azure/identity";
import { Durations, Metric, MetricsQueryClient } from "@azure/monitor-query";
import * as dotenv from "dotenv";

dotenv.config();

const metricsResourceId = process.env.METRICS_RESOURCE_ID;

export async function main() {
  const tokenCredential = new DefaultAzureCredential();
  const metricsQueryClient = new MetricsQueryClient(tokenCredential);

  if (!metricsResourceId) {
    throw new Error("METRICS_RESOURCE_ID must be set in the environment for this sample");
  }

  const iterator = metricsQueryClient.listMetricDefinitions(metricsResourceId);
  let result = await iterator.next();
  let metricNames: string[] = [];
  for await (const result of iterator) {
    console.log(` metricDefinitions - ${result.id}, ${result.name}`);
    if (result.name) {
      metricNames.push(result.name);
    }
  }
  const firstMetricName = metricNames[0];
  const secondMetricName = metricNames[1];
  if (firstMetricName && secondMetricName) {
    console.log(`Picking an example metric to query: ${firstMetricName} and ${secondMetricName}`);
    const metricsResponse = await metricsQueryClient.queryResource(
      metricsResourceId,
      [firstMetricName, secondMetricName],
      {
        granularity: "PT1M",
        timespan: { duration: Durations.fiveMinutes },
      }
    );

    console.log(
      `Query cost: ${metricsResponse.cost}, interval: ${metricsResponse.granularity}, time span: ${metricsResponse.timespan}`
    );

    const metrics: Metric[] = metricsResponse.metrics;
    console.log(`Metrics:`, JSON.stringify(metrics, undefined, 2));
    const metric = metricsResponse.getMetricByName(firstMetricName);
    console.log(`Selected Metric: ${firstMetricName}`, JSON.stringify(metric, undefined, 2));
  } else {
    console.error(`Metric names are not defined - ${firstMetricName} and ${secondMetricName}`);
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exit(1);
});

前のサンプルでは、 のメトリックの結果 metricsResponse は、ユーザーが関数の配列引数で metricNames メトリック名を指定する順序に従って順序付 queryResource けされています。 ユーザーが を指定した [firstMetricName, secondMetricName]場合、 の結果 firstMetricName は の結果 secondMetricName の前に metricResponse表示されます。

メトリック クエリ応答を処理する

metrics queryResource 関数は オブジェクトを QueryMetricsResult 返します。 QueryMetricsResultオブジェクトには、型指定されたオブジェクト、、namespaceintervalおよび timespanMetric一覧などのプロパティが含まれています。 オブジェクトの一覧には Metric 、 プロパティを metrics 使用してアクセスできます。 このリスト内の各 Metric オブジェクトには、オブジェクトの TimeSeriesElement 一覧が含まれています。 それぞれに TimeSeriesElement と プロパティがmetadataValuesdata含まれています。 ビジュアル形式では、応答のオブジェクト階層は次の構造に似ています。

QueryMetricsResult
|---cost
|---timespan (of type `QueryTimeInterval`)
|---granularity
|---namespace
|---resourceRegion
|---metrics (list of `Metric` objects)
    |---id
    |---type
    |---name
    |---unit
    |---displayDescription
    |---errorCode
    |---timeseries (list of `TimeSeriesElement` objects)
        |---metadataValues
        |---data (list of data points represented by `MetricValue` objects)
            |---timeStamp
            |---average
            |---minimum
            |---maximum
            |---total
            |---count
|---getMetricByName(metricName): Metric | undefined (convenience method)

応答の処理例

import { DefaultAzureCredential } from "@azure/identity";
import { Durations, Metric, MetricsQueryClient } from "@azure/monitor-query";
import * as dotenv from "dotenv";
dotenv.config();

const metricsResourceId = process.env.METRICS_RESOURCE_ID;
export async function main() {
  const tokenCredential = new DefaultAzureCredential();
  const metricsQueryClient = new MetricsQueryClient(tokenCredential);

  if (!metricsResourceId) {
    throw new Error(
      "METRICS_RESOURCE_ID for an Azure Metrics Advisor subscription must be set in the environment for this sample"
    );
  }

  console.log(`Picking an example metric to query: MatchedEventCount`);

  const metricsResponse = await metricsQueryClient.queryResource(
    metricsResourceId,
    ["MatchedEventCount"],
    {
      timespan: {
        duration: Durations.fiveMinutes,
      },
      granularity: "PT1M",
      aggregations: ["Count"],
    }
  );

  console.log(
    `Query cost: ${metricsResponse.cost}, granularity: ${metricsResponse.granularity}, time span: ${metricsResponse.timespan}`
  );

  const metrics: Metric[] = metricsResponse.metrics;
  for (const metric of metrics) {
    console.log(metric.name);
    for (const timeseriesElement of metric.timeseries) {
      for (const metricValue of timeseriesElement.data!) {
        if (metricValue.count !== 0) {
          console.log(`There are ${metricValue.count} matched events at ${metricValue.timeStamp}`);
        }
      }
    }
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exit(1);
});

完全なサンプル については、こちらを参照してください

複数のリソースのメトリックのクエリを実行する

1 つの要求で複数の Azure リソースのメトリックを照会するには、 メソッドを使用します MetricsQueryClient.queryResources 。 このメソッドは以下の操作を行います。

  • メソッドとは異なる API を MetricsQueryClient 呼び出します。
  • クライアントの作成時にリージョン エンドポイントが必要です。 (例: https://westus3.metrics.monitor.azure.com")。

各 Azure リソースは、次の場所に存在する必要があります。

  • クライアントの作成時に指定されたエンドポイントと同じリージョン。
  • 同じ Azure サブスクリプション。

さらに、クエリを実行するメトリックを含むメトリック名前空間を指定する必要があります。 メトリック名前空間の一覧については、「リソースの 種類別にサポートされているメトリックとログ カテゴリ」を参照してください。

let resourceIds: string[] = [
  "/subscriptions/0000000-0000-000-0000-000000/resourceGroups/test/providers/Microsoft.OperationalInsights/workspaces/test-logs",
  "/subscriptions/0000000-0000-000-0000-000000/resourceGroups/test/providers/Microsoft.OperationalInsights/workspaces/test-logs2",
];
let metricsNamespace: string = "<YOUR_METRICS_NAMESPACE>";
let metricNames: string[] = ["requests", "count"];
const batchEndPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/

const credential = new DefaultAzureCredential();
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(
  batchEndPoint,
  credential
);

const result: : MetricsQueryResult[] = await metricsQueryClient.queryResources(
  resourceIds,
  metricsNamespace,
  metricNames
);

各 Azure リソースの種類で使用できるメトリックとディメンションのインベントリについては、「 Azure Monitor でサポートされているメトリック」を参照してください。

トラブルシューティング

さまざまなエラー シナリオを診断するには、 トラブルシューティング ガイドを参照してください。

次の手順

Azure Monitor の詳細については、 Azure Monitor サービスのドキュメントを参照してください

共同作成

このライブラリに投稿する場合、コードをビルドしてテストする方法の詳細については、投稿ガイドを参照してください。

このモジュールのテストは、ライブ テストと単体テストの組み合わせであり、Azure Monitor インスタンスを用意する必要があります。 テストを実行するには、次を実行する必要があります。

  1. rush update
  2. rush build -t @azure/monitor-query
  3. cd into sdk/monitor/monitor-query
  4. ファイルのコピー先sample.env.env
  5. エディターでファイルを .env 開き、値を入力します。
  6. npm run test.

詳細については、 テスト フォルダーを参照してください。

インプレッション数