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

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

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

リソース:

はじめ

サポートされている環境

  • Node.js の LTS バージョンを する
  • Safari、Chrome、Microsoft Edge、Firefox の最新バージョン

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

前提 条件

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

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

npm install --save @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 ソブリン クラウド用にクライアントを構成する

既定では、ライブラリのクライアントは Azure パブリック クラウドを使用するように構成されます。 代わりにソブリン クラウドを使用するには、クライアントをインスタンス化するときに正しいエンドポイントと対象ユーザーの値を指定します。 例えば:

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

const credential = new DefaultAzureCredential();

const logsQueryClient: LogsQueryClient = new LogsQueryClient(credential, {
  endpoint: "https://api.loganalytics.azure.cn/v1",
  audience: "https://api.loganalytics.azure.cn/.default",
});
// or
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential, {
  endpoint: "https://management.chinacloudapi.cn",
  audience: "https://monitor.azure.cn/.default",
});
// or
const endPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/

const metricsClient: MetricsClient = new MetricsClient(endPoint, credential, {
  audience: "https://monitor.azure.cn/.default",
});

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

クエリを実行する

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

主な概念

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

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

メトリック データ構造

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

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

ログ クエリ

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

Log Analytics ワークスペース ID または Azure リソース 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);
});

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

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

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);
    }
  }
}

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

LogsQueryClientqueryBatch 関数は、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 分まで増やすことができます。 次の例では、LogsQueryOptions オブジェクトの serverTimeoutInSeconds プロパティを使用して、サーバーのタイムアウトを 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. LogsQueryResult オブジェクト内の statistics フィールドにアクセスします。

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

const monitorWorkspaceId = "<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. LogsQueryResult オブジェクト内の visualization フィールドにアクセスします。

例えば:

const monitorWorkspaceId = "<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 のメトリック結果は、queryResource 関数の metricNames 配列引数でメトリック名を指定する順序に従って並べ替えます。 ユーザーが [firstMetricName, secondMetricName]を指定した場合、firstMetricName の結果は、metricResponsesecondMetricName の結果の前に表示されます。

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

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

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 リソースのメトリックを照会するには、MetricsClient.queryResources メソッドを使用します。 このメソッドは次のとおりです。

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

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

  • クライアントの作成時に指定されたエンドポイントと同じリージョン。
  • 同じ 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 endpoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/

const credential = new DefaultAzureCredential();
const metricsClient: MetricsClient = new MetricsClient(
  endpoint,
  credential
);

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

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.

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

  • Microsoft Azure SDK for JavaScript の
  • Azure Monitor の

インプレッション