Biblioteca de cliente do Azure Monitor Query para JavaScript - versão 1.3.1
A biblioteca de cliente do Azure Monitor Query é usada para executar consultas somente leitura nas duas plataformas de dados do Azure Monitor:
- Logs - Coleta e organiza dados de log e desempenho de recursos monitorados. Dados de diferentes fontes, como logs de plataforma de serviços do Azure, dados de log e desempenho de agentes de máquinas virtuais e dados de uso e desempenho de aplicativos, podem ser consolidados em um único espaço de trabalho Azure Log Analytics. Os vários tipos de dados podem ser analisados em conjunto usando o Kusto Query Language.
- Metrics - Coleta dados numéricos de recursos monitorados em um banco de dados de séries temporais. As métricas são valores numéricos que são coletados em intervalos regulares e descrevem algum aspeto de um sistema em um determinado momento. As métricas são leves e capazes de suportar cenários quase em tempo real, tornando-as úteis para alertas e deteção rápida de problemas.
Recursos:
- Código fonte
- Pacote (npm)
- documentação de referência da API
- Documentação de serviço
- Amostras
- Alterar log
Primeiros passos
Ambientes suportados
- versões LTS do Node.js
- Versões mais recentes do Safari, Chrome, Microsoft Edge e Firefox
Para obter mais informações, consulte nossa política de suporte .
Pré-requisitos
- Uma assinatura do Azure
- Uma implementação TokenCredential, como um tipo de credencial de biblioteca de Identidade do Azure.
- Para consultar Logs, você precisa de uma das seguintes coisas:
- Um espaço de trabalho do Azure Log Analytics
- Um recurso do Azure de qualquer tipo (Conta de Armazenamento, Cofre de Chaves, Cosmos DB, etc.)
- Para consultar Métricas, você precisa de um recurso do Azure de qualquer tipo (Conta de Armazenamento, Cofre de Chaves, Cosmos DB, etc.).
Instalar o pacote
Instale a biblioteca de cliente do Azure Monitor Query para JavaScript com npm:
npm install --save @azure/monitor-query
Criar o cliente
Um cliente autenticado é necessário para consultar logs ou métricas. Para autenticar, o exemplo a seguir usa
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);
Configurar o cliente para a nuvem soberana do Azure
Por padrão, os clientes da biblioteca são configurados para usar a Nuvem Pública do Azure. Para usar uma nuvem soberana em vez disso, forneça o valor correto de ponto de extremidade e audiência ao instanciar um cliente. Por exemplo:
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",
});
Observação: Atualmente, MetricsQueryClient
usa o ponto de extremidade do Azure Resource Manager (ARM) para consultar métricas. Você precisa do ponto de extremidade de gerenciamento correspondente para sua nuvem ao usar este cliente. Este detalhe está sujeito a alterações no futuro.
Executar a consulta
Para obter exemplos de consultas de logs e métricas, consulte a seção
Conceitos-chave
Registra limites de taxa de consulta e limitação
O serviço Log Analytics aplica limitação quando a taxa de solicitação é muito alta. Limites, como o número máximo de linhas retornadas, também são aplicados nas consultas Kusto. Para obter mais informações, consulte Query API.
Estrutura de dados de métricas
Cada conjunto de valores métricos é uma série temporal com as seguintes características:
- O momento em que o valor foi recolhido
- O recurso associado ao valor
- Um namespace que atua como uma categoria para a métrica
- Um nome de métrica
- O valor em si
- Algumas métricas têm várias dimensões, conforme descrito em métricas multidimensionais. As métricas personalizadas podem ter até 10 dimensões.
Exemplos
-
consulta Logs
- de consulta de logs centrados no espaço de trabalho
- Consulta de logs centrados em recursos
- Manipular logs de resposta de consulta
-
Consulta de logs em lote
- Manipular logs de resposta de consulta em lote
- Cenários de consulta de logs avançados
- consulta Métricas
Consulta de logs
O LogsQueryClient
pode ser usado para consultar um espaço de trabalho do Log Analytics usando o Kusto Query Language. O timespan.duration
pode ser especificado como uma cadeia de caracteres em um formato de duração ISO 8601. Você pode usar as constantes de Durations
fornecidas para algumas durações ISO 8601 comumente usadas.
Você pode consultar logs pela ID do espaço de trabalho do Log Analytics ou pela ID do recurso do Azure. O resultado é retornado como uma tabela com uma coleção de linhas.
Consulta de logs centrada no espaço de trabalho
Para consultar por ID do espaço de trabalho, use o método 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));
Consulta de logs centrada em recursos
O exemplo a seguir demonstra como consultar logs diretamente de um recurso do Azure. Aqui, o método queryResource
é usado e uma ID de recurso do Azure é passada. Por exemplo, /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
.
Para encontrar o ID do recurso:
- Navegue até a página do seu recurso no portal do Azure.
- Na folha Visão Geral do
, selecione o link Exibição JSON. - No JSON resultante, copie o valor da propriedade
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);
});
Manipular a resposta da consulta de logs
A função queryWorkspace
de LogsQueryClient
retorna um objeto LogsQueryResult
. O tipo de objeto pode ser LogsQuerySuccessfulResult
ou LogsQueryPartialResult
. Aqui está uma hierarquia da resposta:
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
Por exemplo, para manipular uma resposta com tabelas:
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);
}
}
}
Uma amostra completa pode ser encontrada aqui.
Consulta de logs em lote
O exemplo a seguir demonstra o envio de várias consultas ao mesmo tempo usando a API de consulta em lote. As consultas podem ser representadas como uma lista de objetos 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);
}
}
}
Manipular logs de resposta de consulta em lote
A função queryBatch
de LogsQueryClient
retorna um objeto LogsQueryBatchResult
.
LogsQueryBatchResult
contém uma lista de objetos com os seguintes tipos possíveis:
LogsQueryPartialResult
LogsQuerySuccessfulResult
LogsQueryError
Aqui está uma hierarquia da resposta:
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")
Por exemplo, o código a seguir manipula uma resposta de consulta de logs em lote:
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);
}
}
}
Uma amostra completa pode ser encontrada aqui.
Cenários avançados de consulta de logs
Definir tempo limite de consulta de logs
Algumas consultas de logs levam mais de 3 minutos para serem executadas. O tempo limite padrão do servidor é de 3 minutos. Você pode aumentar o tempo limite do servidor para um máximo de 10 minutos. No exemplo a seguir, a propriedade serverTimeoutInSeconds
do objeto LogsQueryOptions
é usada para aumentar o tempo limite do servidor para 10 minutos:
// 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;
Consultar vários espaços de trabalho
A mesma consulta de logs pode ser executada em vários espaços de trabalho do Log Analytics. Além da consulta Kusto, os seguintes parâmetros são necessários:
-
workspaceId
- O primeiro ID de espaço de trabalho (principal). -
additionalWorkspaces
- Uma lista de espaços de trabalho, excluindo o espaço de trabalho fornecido no parâmetroworkspaceId
. Os itens da lista do parâmetro podem consistir nos seguintes formatos de identificador:- Nomes de espaços de trabalho qualificados
- IDs do espaço de trabalho
- IDs de recursos do Azure
Por exemplo, a consulta a seguir é executada em três espaços de trabalho:
const queryLogsOptions: LogsQueryOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
Para exibir os resultados de cada espaço de trabalho, use a coluna TenantId
para ordenar os resultados ou filtrá-los na consulta Kusto.
Resultados da encomenda por TenantId
AppEvents | order by TenantId
Filtrar resultados por TenantId
AppEvents | filter TenantId == "<workspace2>"
Uma amostra completa pode ser encontrada aqui.
Incluir estatísticas
Para obter estatísticas de execução de consulta de logs, como consumo de CPU e memória:
- Defina a propriedade
LogsQueryOptions.includeQueryStatistics
comotrue
. - Acesse o campo
statistics
dentro do objetoLogsQueryResult
.
O exemplo a seguir imprime o tempo de execução da consulta:
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
}`,
);
Como a estrutura da carga útil do statistics
varia de acordo com a consulta, um tipo de retorno Record<string, unknown>
é usado. Ele contém a resposta JSON bruta. As estatísticas são encontradas dentro da propriedade query
do JSON. Por exemplo:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Incluir visualização
Para obter dados de visualização para consultas de logs usando o operador de renderização :
- Defina a propriedade
LogsQueryOptions.includeVisualization
comotrue
. - Acesse o campo
visualization
dentro do objetoLogsQueryResult
.
Por exemplo:
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);
Como a estrutura da carga útil do visualization
varia de acordo com a consulta, um tipo de retorno Record<string, unknown>
é usado. Ele contém a resposta JSON bruta. Por exemplo:
{
"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
}
Consulta de métricas
O exemplo a seguir obtém métricas para uma assinatura do /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
Para localizar o URI do recurso:
- Navegue até a página do seu recurso no portal do Azure.
- Na folha Visão Geral do
, selecione o link Exibição JSON. - No JSON resultante, copie o valor da propriedade
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);
});
No exemplo anterior, os resultados da métrica em metricsResponse
são ordenados de acordo com a ordem em que o usuário especifica os nomes das métricas no argumento matriz metricNames
para a função queryResource
. Se o usuário especificar [firstMetricName, secondMetricName]
, o resultado para firstMetricName
aparecerá antes do resultado para secondMetricName
no metricResponse
.
Manipular a resposta da consulta de métricas
As métricas queryResource
função retorna um objeto QueryMetricsResult
. O objeto QueryMetricsResult
contém propriedades como uma lista de objetos Metric
-typed, interval
, namespace
e timespan
. A lista de objetos Metric
pode ser acessada usando a propriedade metrics
. Cada objeto Metric
nesta lista contém uma lista de objetos TimeSeriesElement
. Cada TimeSeriesElement
contém propriedades data
e metadataValues
. Na forma visual, a hierarquia de objetos da resposta é semelhante à seguinte estrutura:
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)
Exemplo de manipulação de resposta
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);
});
Uma amostra completa pode ser encontrada aqui.
Métricas de consulta para vários recursos
Para consultar métricas para vários recursos do Azure em uma única solicitação, use o método MetricsClient.queryResources
. Este método:
- Chama uma API diferente dos métodos
MetricsClient
. - Requer um ponto de extremidade regional ao criar o cliente. Por exemplo, "https://westus3.metrics.monitor.azure.com".
Cada recurso do Azure deve residir em:
- A mesma região que o ponto de extremidade especificado ao criar o cliente.
- A mesma assinatura do Azure.
Além disso:
- O usuário deve estar autorizado a ler dados de monitoramento no nível de assinatura do Azure. Por exemplo, a função Leitor de Monitoramento de na assinatura a ser consultada.
- O namespace de métrica que contém as métricas a serem consultadas deve ser fornecido. Para obter uma lista de namespaces de métrica, consulte Métricas suportadas e categorias de log por tipo de recurso.
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
);
Para obter um inventário de métricas e dimensões disponíveis para cada tipo de recurso do Azure, consulte Métricas suportadas com o Azure Monitor.
Solução de problemas
Para diagnosticar vários cenários de falha, consulte o guia de solução de problemas .
Próximos passos
Para saber mais sobre o Azure Monitor, consulte a documentação do serviço Azure Monitor.
Contribuição
Se você quiser contribuir para esta biblioteca, leia o guia de contribuição para saber mais sobre como criar e testar o código.
Os testes deste módulo são uma mistura de testes ao vivo e de unidade, que exigem que você tenha uma instância do Azure Monitor. Para executar os testes, você precisará executar:
rush update
rush build -t @azure/monitor-query
cd into sdk/monitor/monitor-query
- Copie o arquivo
sample.env
para.env
- Abra o arquivo
.env
em um editor e preencha os valores. -
npm run test
.
Para obter mais detalhes, consulte nossa pasta testes de
Projetos relacionados
- SDK do Microsoft Azure para JavaScript
- Azure Monitor
Azure SDK for JavaScript