@azure/monitor-query

中文文档
1.3.3发布于 2025/08/13MITTypeScriptESM + CJS近 30 天下载 34.9万

折旧:使用@azure/monitor-query-logs、@azure/monitor-query-medicers和@azure/arm-monitor.

此软件包已被标记为弃用

Deprecated ⚠️: use @azure/monitor-query-logs, @azure/monitor-query-metrics and @azure/arm-monitor.

中文使用文档
文档目录19 节
  1. 已贬值 QQ:本套件已经贬值,不再积极开发. 请迁移到以下软件包:
  2. 开始
  3. 支持的环境
  4. 先决条件
  5. 安装软件包
  6. 创建客户端
  7. 执行查询
  8. 关键概念
  9. 日志查询率限制和节奏
  10. 计量数据结构
  11. 实例
  12. 日志查询
  13. 批量日志查询
  14. 高级日志查询方案
  15. 度量衡查询
  16. 解决问题
  17. 今后的步骤
  18. 捐款
  19. 相关项目

已贬值 QQ:本套件已经贬值,不再积极开发. 请迁移到以下软件包:

上面列出的替换库会添加新的特性和不安全的错误修正.

Azure 监视器查询客户端库用于执行只读查询 Azure 监视器其两个数据平台:

  • 日志 - 收集和组织来自监测资源的记录和业绩数据。 来自不同来源的数据,如来自Azure服务的平台日志,来自虚拟机代理机的日志和性能数据,以及来自app的用法和性能数据可以被整合为单一数据 Azure 日志分析工作空间。可以使用 Kusto 查询语言。 。 。 .
  • 计量 - 从监测资源中收集数字数据,输入时间序列数据库。 量子是定期收集的数值并描述一个系统在特定时间的某些方面. 量子是轻而易举的,能够支持近实时的情景,使其对提醒和快速发现问题有用.

资源:

开始

支持的环境

详情请见我们 支助政策。 。 。 .

先决条件

安装软件包

为 npm 安装 Azure 监视器查询客户端库 :

npm install --save @azure/monitor-query

创建客户端

需要经认证的客户端查询日志或计量。 要认证,以下示例使用 默认标记 从 @azure/身份 软件包.

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

const credential = new DefaultAzureCredential();

// Create a LogsQueryClient
const logsQueryClient = new LogsQueryClient(credential);

// Create a MetricsQueryClient
const metricsQueryClient = new MetricsQueryClient(credential);

// Create a MetricsClient
const endpoint = " https://<endpoint>.monitor.azure.com/";
const metricsClient = new MetricsClient(endpoint, credential);

Azure 主权云配置客户端

默认情况下,图书馆的客户端被配置为使用Azure公共云. 取而代之的是使用主权云,在即时处理客户端时提供正确的端点和受众值. 例如:

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

const credential = new DefaultAzureCredential();

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

// Create a MetricsQueryClient
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential, {
  endpoint: "https://management.chinacloudapi.cn",
  audience: "https://monitor.azure.cn/.default",
});

// Create a MetricsClient
const endpoint = " https://<endpoint>.monitor.azure.cn/";
const metricsClient = new MetricsClient(endpoint, credential, {
  audience: "https://monitor.azure.cn/.default",
});

说明:目前, MetricsQueryClient 使用 Azure 资源管理器(ARM) 的端点进行查询。 您使用此客户端时需要相应的管理端点 。 这一细节将来会有所改变.

执行查询

关于日志和计量查询的例子,请参见 实例 节.

关键概念

日志查询率限制和节奏

逻辑分析服务在请求率过高时采用节流. 限制,如返回行数的上限,也适用于库斯多查询. 更多信息见 查询 API。 。 。 .

计量数据结构

每组度量值是一个时间序列,具有以下特征: 1

  • 值被收集的时间
  • 与数值相关的资源
  • 名称空格, 类似于测量的分类
  • 一个参数名称
  • 值本身
  • 一些度量衡具有多维度,如多维度量法所描述. 定制度量衡可达10维.

实例

日志查询

这个 LogsQueryClient 用于查询日志分析工作空间 Kusto 查询语言编辑 timespan.duration 可以用ISO 8601持续时间格式指定字符串。 你可以用这个 Durations 为一些常用的ISO 8601持续时间提供的常数.

您可以通过 Log Analytics 工作空间ID 或 Azure 资源ID 查询日志 。 结果以一表还原并有行集.

以工作空间为中心的日志查询

要通过工作区ID查询,请使用 LogsQueryClient.queryWorkspace 方法 :

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

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

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

if (result.status === LogsQueryResultStatus.Success) {
  const tablesFromResult = 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);
  }
}

function processTables(tablesFromResult) {
  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);
    }
  }
}

以资源为中心的日志查询

以下例子说明如何直接从Azure资源查询日志。 在这里 queryResource 使用Azure资源ID。 譬如说, /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}。 。 。 .

要找到资源标识 :

  1. 在 Azure 门户网站中导航您的资源页面 .
  2. 从 概览 刀片,选择 JSON 视图 链接.
  3. 在生成的 JSON 中,复制 id 属性.
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, Durations, LogsQueryResultStatus } from "@azure/monitor-query";

const logsResourceId = "<the Resource Id for your logs resource>";

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

const kustoQuery = `MyTable_CL | summarize count()`;

console.log(`Running '${kustoQuery}' over the last One Hour`);
const queryLogsOptions = {
  // 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 as any)?.statistics?.query?.executionTime;

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

if (result.status === LogsQueryResultStatus.Success) {
  const tablesFromResult = 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);
  }
}

function processTables(tablesFromResult) {
  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);
    }
  }
}

处理日志查询回复

这个 queryWorkspace 函数 LogsQueryClient 返回 a 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

例如,用表格处理回复:

function processTables(tablesFromResult) {
  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 对象.

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

const monitorWorkspaceId = "<workspace_id>";

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

function processTables(tablesFromResult) {
  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);
    }
  }
}

处理日志批次查询回复

这个 queryBatch 函数 LogsQueryClient 返回 a 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")

例如,以下代码处理批次日志查询响应:

import { LogsQueryResultStatus } from "@azure/monitor-query";

async function processBatchResult(result, queriesBatch) {
  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++;
  }
}

function processTables(tablesFromResult) {
  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 分钟 :

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

const azureLogAnalyticsWorkspaceId = "<workspace_id>";

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

const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";

// setting optional parameters
const queryLogsOptions = {
  // 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,
  kqlQuery,
  { duration: Durations.twentyFourHours },
  queryLogsOptions,
);

const status = result.status;

查询多个工作空间

同样的日志查询可以在多个日志分析工作空间中执行. 除了库斯多查询外,还需要以下参数: 1

  • workspaceId - 第一个(初级)工作空间身份证.
  • additionalWorkspaces - 工作空间清单,不包括: workspaceId 参数。 参数的列表项目可以由以下标识格式组成:
    • 合格的工作空间名称
    • 工作空间标识
    • Azure 资源标识

例如,以下查询在三个工作空间执行:

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

const azureLogAnalyticsWorkspaceId = "<workspace_id>";

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

const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";

// setting optional parameters
const queryLogsOptions = {
  additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};

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

const status = result.status;

要查看每个工作空间的结果,请使用 TenantId 列中,可命令结果或在 Kusto 查询中过滤结果.

租户的订单结果

AppEvents | order by TenantId

由租户过滤结果

AppEvents | filter TenantId == "<workspace2>"

可以找到完整的样本 这里。 。 。 .

包含统计数据

要获取日志查询执行统计, 如 CPU 和内存消耗 :

  1. 设定 LogsQueryOptions.includeQueryStatistics 属性改为 true。 。 。 .
  2. 进入 statistics 字段内 LogsQueryResult 对象.

以下示例打印了查询执行时间 :

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

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 as any)?.statistics?.query?.executionTime;

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

因为结构 statistics 有效载荷因查询而异, a Record<string, unknown> 返回类型被使用。 它包含原始JSON反应. 这些统计数字见于本报告 query jSON的财产。 例如:

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

包含可视化

使用 渲染运算符数字 :

  1. 设定 LogsQueryOptions.includeVisualization 属性改为 true。 。 。 .
  2. 进入 visualization 字段内 LogsQueryResult 对象.

例如:

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

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 有效载荷因查询而异, a 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计量学顾问 订阅. 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 { MetricsQueryClient, Durations } from "@azure/monitor-query";

const metricsResourceId = "<the Resource Id for your metrics resource>";

const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);

const metricNames = [];
const metricDefinitions = metricsQueryClient.listMetricDefinitions(metricsResourceId);
for await (const { id, name } of metricDefinitions) {
  console.log(` metricDefinitions - ${id}, ${name}`);
  if (name) {
    metricNames.push(name);
  }
}

const [firstMetricName, secondMetricName] = metricNames;
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 = 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}`);
}

在上述抽样中,衡量结果如下: metricsResponse 按照用户在定义中指定公尺名称的顺序排序 metricNames 矩阵参数 queryResource 函数。 如果用户指定 [firstMetricName, secondMetricName],结果 firstMetricName 将在结果前显示 secondMetricName 输入 metricResponse。 。 。 .

处理参数查询答复

衡量标准 queryResource 函数返回 a QueryMetricsResult 对象。 这个 QueryMetricsResult 对象包含诸如列表等属性 Metric- 型号物体, interval, (中文(简体) ), namespace,以及 timespan编辑 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 { MetricsQueryClient, Durations } from "@azure/monitor-query";

const metricsResourceId = "<the Resource Id for your metrics resource>";

const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);

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

可以找到完整的样本 这里。 。 。 .

查询多种资源的指标

要查询单个请求中多个Azure资源的计量标准,请使用 MetricsClient.queryResources 方法。 这种方法 :

  • 调用一个不同的 API 而非 MetricsClient 方法。 。 .
  • 创建客户端时需要区域终点 。 例如"https://westus3.meterics.monitor.azure.com".

每种阿苏雷资源必须居住在:

  • 创建客户端时指定的与终点相同的区域.
  • 同样的Azure订阅.

此外:

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

const resourceIds = [
  "/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",
];
const metricsNamespace = "<YOUR_METRICS_NAMESPACE>";
const metricNames = ["requests", "count"];
const endpoint = " https://<endpoint>.monitor.azure.com/";

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

const result = await metricsClient.queryResources(resourceIds, metricNames, metricsNamespace);

关于每个Azure资源类型可用的计量和维度清单,见 使用 Azure 监视器支持的度量衡。 。 。 .

解决问题

为了分析各种失败情况,请参看 解决问题指南。 。 。 .

今后的步骤

为了了解更多关于Azure监视器的信息,请参看 Azure 监视器服务文档。 。 。 .

捐款

如果您想为图书馆捐钱 请读一下 贡献指南 学习如何构建和测试密码.

这个模块的测试是现场测试和单位测试的混合,这需要你有一个AzureMonitor实例. 为了执行测试,你需要运行:

  1. pnpm install
  2. pnpm build --filter @azure/monitor-query...
  3. cd into sdk/monitor/monitor-query
  4. 复制 sample.env 文件为 .env
  5. 打开 .env 在编辑器中存档并填写值.
  6. npm run test。 。 。 .

详情请查看我们 测试 文件夹.

版本与发布记录

@azure/monitor-query 共发布 288 个版本,首次发布于 2021/05/29;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.3.3latest2025/08/131.2 年前
1.3.2-alpha.20250811.1dev2025/08/111.2 年前
1.3.2-alpha.20250805.12025/08/051.3 年前
1.3.2-alpha.20250730.12025/07/301.3 年前
1.3.2-alpha.20250721.12025/07/211.3 年前
1.3.2-alpha.20250620.12025/06/201.4 年前

关于 @azure/monitor-query 的常见问题

@azure/monitor-query 是什么?

折旧:使用@azure/monitor-query-logs、@azure/monitor-query-medicers和@azure/arm-monitor.注意:该包已被作者标记为弃用——Deprecated ⚠️: use @azure/monitor-query-logs, @azure/monitor-query-metrics and @azure/arm-monitor.

如何安装 @azure/monitor-query?

在项目目录运行 npm install @azure/monitor-query,或使用 pnpm add / yarn add / bun add。

@azure/monitor-query 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@azure/monitor-query 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@azure/monitor-query 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@azure/monitor-query 可以商用吗?

@azure/monitor-query 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@azure/monitor-query 的下载量有多少?

根据 npm 官方下载统计,@azure/monitor-query 在 2026/10/08 – 2026/11/06 这 30 天内被下载 349,049 次,日均约 11,635 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@azure/monitor-query 还在维护吗?

最新版本 1.3.3 发布于 2025/08/13(1.2 年前);至今共发布 288 个版本,其中过去 12 个月发布了 0 个;首次发布于 2021/05/29。作者已将其标记为弃用,新项目建议寻找替代方案。