Compartir a través de


Biblioteca cliente de consultas de Azure Monitor para JavaScript: versión 1.3.1

La biblioteca cliente de consultas de Azure Monitor se usa para ejecutar consultas de solo lectura en Azure Monitordos plataformas de datos:

  • registros: recopila y organiza los datos de registro y rendimiento de los recursos supervisados. Los datos de diferentes orígenes, como los registros de plataforma de los servicios de Azure, los datos de registro y rendimiento de los agentes de máquinas virtuales, y los datos de uso y rendimiento de las aplicaciones se pueden consolidar en un único área de trabajo de Azure Log Analytics. Los distintos tipos de datos se pueden analizar conjuntamente mediante el lenguaje de consulta kustode .
  • métricas: recopila datos numéricos de recursos supervisados en una base de datos de serie temporal. Las métricas son valores numéricos que se recopilan a intervalos regulares y describen algún aspecto de un sistema en un momento determinado. Las métricas son ligeras y capaces de admitir escenarios casi en tiempo real, por lo que son útiles para alertas y detección rápida de problemas.

recursos de :

Empezar

Entornos admitidos

Para obtener más información, consulte nuestra directiva de soporte técnico de .

Prerrequisitos

  • Un de suscripción de Azure de
  • Una implementación de TokenCredential, como un tipo de credencial de biblioteca de identidad de Azure .
  • Para consultar registros, necesita una de las siguientes cosas:
    • Un de área de trabajo de Azure Log Analytics
    • Un recurso de Azure de cualquier tipo (cuenta de almacenamiento, Key Vault, Cosmos DB, etcetera).
  • Para consultar las métricas, necesita un recurso de Azure de cualquier tipo (cuenta de almacenamiento, Key Vault, Cosmos DB, etcetera).).

Instalación del paquete

Instale la biblioteca cliente de consultas de Azure Monitor para JavaScript con npm:

npm install --save @azure/monitor-query

Creación del cliente

Se requiere un cliente autenticado para consultar registros o métricas. Para autenticarse, en el ejemplo siguiente se usa DefaultAzureCredential desde el paquete de @azure/identity.

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

Configuración del cliente para la nube soberana de Azure

De forma predeterminada, los clientes de la biblioteca están configurados para usar la nube pública de Azure. Para usar una nube soberana en su lugar, proporcione el punto de conexión y el valor de audiencia correctos al crear una instancia de un cliente. Por ejemplo:

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

Nota: actualmente, MetricsQueryClient usa el punto de conexión de Azure Resource Manager (ARM) para consultar métricas. Necesita el punto de conexión de administración correspondiente para la nube al usar este cliente. Este detalle está sujeto a cambios en el futuro.

Ejecución de la consulta

Para obtener ejemplos de consultas de registros y métricas, consulte la sección Ejemplos de .

Conceptos clave

Registra los límites y los límites de frecuencia de consulta

El servicio Log Analytics aplica la limitación cuando la tasa de solicitudes es demasiado alta. Los límites, como el número máximo de filas devueltas, también se aplican en las consultas de Kusto. Para obtener más información, consulte Query API.

Estructura de datos de métricas

Cada conjunto de valores de métricas es una serie temporal con las siguientes características:

  • Hora en que se recopiló el valor
  • Recurso asociado al valor
  • Un espacio de nombres que actúa como una categoría para la métrica
  • Un nombre de métrica
  • El propio valor
  • Algunas métricas tienen varias dimensiones, como se describe en métricas multidimensionales. Las métricas personalizadas pueden tener hasta 10 dimensiones.

Ejemplos

Consulta de registros

El LogsQueryClient se puede usar para consultar un área de trabajo de Log Analytics mediante el lenguaje de consulta kusto de . El timespan.duration se puede especificar como una cadena en un formato de duración ISO 8601. Puede usar las constantes de Durations proporcionadas para algunas duraciones ISO 8601 usadas habitualmente.

Puede consultar los registros mediante el identificador del área de trabajo de Log Analytics o el identificador de recurso de Azure. El resultado se devuelve como una tabla con una colección de filas.

Consulta de registros centrados en el área de trabajo

Para consultar por identificador de área de trabajo, use el 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 registros centrados en recursos

En el ejemplo siguiente se muestra cómo consultar registros directamente desde un recurso de Azure. Aquí se usa el método queryResource y se pasa un identificador de recurso de Azure. Por ejemplo, /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}.

Para buscar el identificador de recurso:

  1. Vaya a la página del recurso en Azure Portal.
  2. En la hoja información general de , seleccione el vínculo vista JSON de .
  3. En el JSON resultante, copie el valor de la propiedad 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);
});

Control de la respuesta de consulta de registros

La función queryWorkspace de LogsQueryClient devuelve un objeto LogsQueryResult. El tipo de objeto puede ser LogsQuerySuccessfulResult o LogsQueryPartialResult. Esta es una jerarquía de la respuesta:

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 ejemplo, para controlar una respuesta con tablas:

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

Puede encontrar un ejemplo completo aquí.

Consulta de registros de Batch

En el ejemplo siguiente se muestra cómo enviar varias consultas al mismo tiempo mediante la API de consulta por lotes. Las consultas se pueden representar como una 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);
    }
  }
}

Control de la respuesta de consulta por lotes de registros

La función queryBatch de LogsQueryClient devuelve un objeto LogsQueryBatchResult. LogsQueryBatchResult contiene una lista de objetos con los siguientes tipos posibles:

  • LogsQueryPartialResult
  • LogsQuerySuccessfulResult
  • LogsQueryError

Esta es una jerarquía de la respuesta:

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 ejemplo, el código siguiente controla una respuesta de consulta de registros por lotes:

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

Puede encontrar un ejemplo completo aquí.

Escenarios de consulta de registros avanzados

Establecimiento del tiempo de espera de consulta de registros

Algunas consultas de registros tardan más de 3 minutos en ejecutarse. El tiempo de espera predeterminado del servidor es de 3 minutos. Puede aumentar el tiempo de espera del servidor a un máximo de 10 minutos. En el ejemplo siguiente, la propiedad serverTimeoutInSeconds del objeto LogsQueryOptions se usa para aumentar el tiempo de espera del servidor a 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;

Consulta de varias áreas de trabajo

La misma consulta de registros se puede ejecutar en varias áreas de trabajo de Log Analytics. Además de la consulta de Kusto, se requieren los parámetros siguientes:

  • workspaceId: el primer identificador de área de trabajo (principal).
  • additionalWorkspaces: lista de áreas de trabajo, excepto el área de trabajo proporcionada en el parámetro workspaceId. Los elementos de lista del parámetro pueden constar de los siguientes formatos de identificador:
    • Nombres de área de trabajo calificados
    • Identificadores del área de trabajo
    • Identificadores de recursos de Azure

Por ejemplo, la consulta siguiente se ejecuta en tres áreas de trabajo:

const queryLogsOptions: LogsQueryOptions = {
  additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};

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

Para ver los resultados de cada área de trabajo, use la columna TenantId para ordenar los resultados o filtrarlos en la consulta kusto.

Order results by TenantId

AppEvents | order by TenantId

Filtrar resultados por tenantId

AppEvents | filter TenantId == "<workspace2>"

Puede encontrar un ejemplo completo aquí.

Incluir estadísticas

Para obtener las estadísticas de ejecución de consultas de registros, como el consumo de CPU y memoria:

  1. Establezca la propiedad LogsQueryOptions.includeQueryStatistics en true.
  2. Acceda al campo statistics dentro del objeto LogsQueryResult.

En el ejemplo siguiente se imprime el tiempo de ejecución de la 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
  }`,
);

Dado que la estructura de la carga statistics varía según la consulta, se usa un tipo de valor devuelto Record<string, unknown>. Contiene la respuesta JSON sin procesar. Las estadísticas se encuentran dentro de la propiedad query del JSON. Por ejemplo:

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

Incluir visualización

Para obtener datos de visualización de consultas de registros mediante el operador de representación de :

  1. Establezca la propiedad LogsQueryOptions.includeVisualization en true.
  2. Acceda al campo visualization dentro del objeto LogsQueryResult.

Por ejemplo:

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

Dado que la estructura de la carga visualization varía según la consulta, se usa un tipo de valor devuelto Record<string, unknown>. Contiene la respuesta JSON sin procesar. Por ejemplo:

{
  "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

En el ejemplo siguiente se obtienen métricas de una suscripción de Azure Metrics Advisor. El URI del recurso debe ser el del recurso para el que se consultan las métricas. Normalmente es del formato /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>.

Para buscar el URI del recurso:

  1. Vaya a la página del recurso en Azure Portal.
  2. En la hoja información general de , seleccione el vínculo vista JSON de .
  3. En el JSON resultante, copie el valor de la propiedad 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);
});

En el ejemplo anterior, la métrica da como resultado metricsResponse se ordenan según el orden en que el usuario especifica los nombres de métrica en el argumento de matriz metricNames para la función queryResource. Si el usuario especifica [firstMetricName, secondMetricName], el resultado de firstMetricName aparecerá antes del resultado de secondMetricName en el metricResponse.

Control de la respuesta de consulta de métricas

La función de métricas queryResource devuelve un objeto QueryMetricsResult. El objeto QueryMetricsResult contiene propiedades como una lista de objetos con tipo Metric, interval, namespacey timespan. Se puede acceder a la lista de objetos Metric mediante la propiedad metrics. Cada objeto Metric de esta lista contiene una lista de objetos TimeSeriesElement. Cada TimeSeriesElement contiene propiedades data y metadataValues. En forma visual, la jerarquía de objetos de la respuesta es similar a la siguiente estructura:

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)

Ejemplo de control de la respuesta

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

Puede encontrar un ejemplo completo aquí.

Consulta de métricas para varios recursos

Para consultar las métricas de varios recursos de Azure en una sola solicitud, use el método MetricsClient.queryResources. Este método:

  • Llama a una API diferente de los métodos MetricsClient.
  • Requiere un punto de conexión regional al crear el cliente. Por ejemplo, "https://westus3.metrics.monitor.azure.com".

Cada recurso de Azure debe residir en:

  • La misma región que el punto de conexión especificado al crear el cliente.
  • La misma suscripción de Azure.

Además:

  • El usuario debe estar autorizado para leer los datos de supervisión en el nivel de suscripción de Azure. Por ejemplo, el rol lector de supervisión de en la suscripción que se va a consultar.
  • Se debe proporcionar el espacio de nombres de métrica que contiene las métricas que se van a consultar. Para obtener una lista de los espacios de nombres de métricas, consulte métricas admitidas y categorías de registro 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 obtener un inventario de métricas y dimensiones disponibles para cada tipo de recurso de Azure, consulte Métricas admitidas con Azure Monitor.

Solución de problemas

Para diagnosticar varios escenarios de error, consulte la guía de solución de problemas de .

Pasos siguientes

Para más información sobre Azure Monitor, consulte la documentación del servicio Azure Monitor.

Contribuyendo

Si desea contribuir a esta biblioteca, lea la guía de contribución de para obtener más información sobre cómo compilar y probar el código.

Las pruebas de este módulo son una combinación de pruebas dinámicas y unitarias, que requieren que tenga una instancia de Azure Monitor. Para ejecutar las pruebas, deberá ejecutar:

  1. rush update
  2. rush build -t @azure/monitor-query
  3. cd into sdk/monitor/monitor-query
  4. Copie el archivo de sample.env en .env
  5. Abra el archivo .env en un editor y rellene los valores.
  6. npm run test.

Para obtener más información, vea nuestra carpeta pruebas.

impresiones