共用方式為


適用於 JavaScript 的 Azure 監視器查詢用戶端連結庫 - 1.3.1 版

Azure 監視器查詢用戶端連結庫可用來對 Azure 監視器的兩個數據平台執行只讀查詢:

  • 記錄 - 從受監視的資源收集及組織記錄和效能數據。 來自不同來源的數據,例如來自 Azure 服務的平台記錄、虛擬機代理程式的記錄和效能數據,以及來自應用程式的使用量和效能數據,可以合併成單一 Azure Log Analytics 工作區。 您可以使用 Kusto 查詢語言來一起分析各種資料類型。
  • 計量 - 將受監視資源的數值數據收集到時間序列資料庫。 計量是定期收集的數值,並在特定時間描述系統的某些層面。 計量是輕量型且能夠支援近乎即時的案例,因此有助於警示和快速偵測問題。

資源:

開始

支援的環境

如需詳細資訊,請參閱我們的 支持原則

先決條件

安裝套件

使用 npm 安裝適用於 JavaScript 的 Azure 監視器查詢客戶端連結庫:

npm install --save @azure/monitor-query

建立用戶端

需要已驗證的用戶端才能查詢記錄或計量。 若要進行驗證,下列範例會從 @azure/身分識別 套件使用 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工作區識別碼或 Azure 資源識別碼來查詢記錄。 結果會以具有數據列集合的數據表的形式傳回。

以工作區為中心的記錄查詢

若要依工作區標識碼查詢,請使用 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 資源識別碼。 例如,/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}

若要尋找資源識別碼:

  1. 流覽至 Azure 入口網站中的資源頁面。
  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 物件。 物件類型可以是 LogsQuerySuccessfulResultLogsQueryPartialResult。 以下是回應的階層:

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 - 第一個 (主要) 工作區識別碼。
  • additionalWorkspaces - 工作區清單,不包括在 workspaceId 參數中提供的工作區。 參數的清單專案可以包含下列識別碼格式:
    • 限定的工作區名稱
    • 工作區標識碼
    • Azure 資源標識碼

例如,下列查詢會在三個工作區中執行:

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 Order 結果

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": [{...}]
  }
}

包含視覺效果

若要使用 轉譯運算子取得記錄查詢的視覺效果數據:

  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 入口網站中的資源頁面。
  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。 您可以使用 metrics 屬性來存取 Metric 物件清單。 此清單中每個 Metric 物件都包含一份 TimeSeriesElement 物件清單。 每個 TimeSeriesElement 都包含 datametadataValues 屬性。 在視覺化形式中,回應的物件階層類似下列結構:

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

您可以在這裏找到完整的範例

查詢多個資源的計量

若要在單一要求中查詢多個 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 監視器支援的計量。

故障排除

若要診斷各種失敗案例,請參閱 疑難解答指南

後續步驟

若要深入瞭解 Azure 監視器,請參閱 Azure 監視器服務檔

貢獻

如果您想要參與此連結庫,請閱讀 參與指南,以深入瞭解如何建置和測試程序代碼。

本課程模組的測試是即時和單元測試的混合,需要您擁有 Azure 監視器實例。 若要執行測試,您必須執行:

  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

如需詳細資訊,請檢視 測試 資料夾。

印象