已贬值 QQ:本套件已经贬值,不再积极开发. 请迁移到以下软件包:
LogsQueryClient数字 :@azure/monitor-query-logs- 移徙指南: 监视查询日志迁移 • 无: @azure/monitor-query-logs (韩语)MetricsClient数字 :@azure/monitor-query-metrics- 移徙指南: 监视查询量表迁移 • 无: @azure/monitor-query-度量衡MetricsQueryClient: 迁移到管理库@azure/arm-monitor- 向导: @azure/arm-监视器上面列出的替换库会添加新的特性和不安全的错误修正.
Azure 监视器查询客户端库用于执行只读查询 Azure 监视器其两个数据平台:
- 日志 - 收集和组织来自监测资源的记录和业绩数据。 来自不同来源的数据,如来自Azure服务的平台日志,来自虚拟机代理机的日志和性能数据,以及来自app的用法和性能数据可以被整合为单一数据 Azure 日志分析工作空间。可以使用 Kusto 查询语言。 。 。 .
- 计量 - 从监测资源中收集数字数据,输入时间序列数据库。 量子是定期收集的数值并描述一个系统在特定时间的某些方面. 量子是轻而易举的,能够支持近实时的情景,使其对提醒和快速发现问题有用.
资源:
开始
支持的环境
- 节点.js的LTS版本
- Safari、Chrome、Microsoft Edge和Firefox的最新版本
详情请见我们 支助政策。 。 。 .
先决条件
- 一个 Azure 订阅
- A 类 证书 执行,例如 Azure 身份库证书类型。 。 。 .
- 要查询日志, 您需要下列操作之一 :
- 一个 Azure 日志分析工作空间
- 任何类型的 Azure 资源( 套接字账户、 密钥断层、 Cosmos DB等)
- 要查询 Metrics,您需要任何类型的 Azure 资源(Storage Counter, Key Vault, Cosmos DB等) .
安装软件包
为 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}。 。 。 .
要找到资源标识 :
- 在 Azure 门户网站中导航您的资源页面 .
- 从 概览 刀片,选择 JSON 视图 链接.
- 在生成的 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 包含可能类型如下的对象列表:
LogsQueryPartialResultLogsQuerySuccessfulResultLogsQueryError
以下是反应的分级:
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 和内存消耗 :
- 设定
LogsQueryOptions.includeQueryStatistics属性改为true。 。 。 . - 进入
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": [{...}]
}
}
包含可视化
使用 渲染运算符数字 :
- 设定
LogsQueryOptions.includeVisualization属性改为true。 。 。 . - 进入
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 :
- 在 Azure 门户网站中导航您的资源页面 .
- 从 概览 刀片,选择 JSON 视图 链接.
- 在生成的 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订阅.
此外:
- 必须授权用户读取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实例. 为了执行测试,你需要运行:
pnpm installpnpm build --filter @azure/monitor-query...cd into sdk/monitor/monitor-query- 复制
sample.env文件为.env - 打开
.env在编辑器中存档并填写值. npm run test。 。 。 .
详情请查看我们 测试 文件夹.