Compartir a través de


Biblioteca cliente de ingesta de Azure Monitor para JS

La biblioteca cliente de ingesta de Azure Monitor se usa para enviar registros personalizados a Azure Monitor mediante la API de ingesta de registros.

Esta biblioteca le permite enviar datos desde prácticamente cualquier origen a tablas integradas admitidas o a tablas personalizadas que cree en el área de trabajo de Log Analytics. Incluso puede extender el esquema de las tablas integradas con columnas personalizadas.

Recursos:

Introducción

Requisitos previos

Instalar el paquete

Instale la biblioteca cliente de ingesta de Azure Monitor para JS con npm:

npm install @azure/monitor-ingestion

Autenticar el cliente

Se requiere un cliente autenticado para ingerir datos. Para autenticarse, cree una instancia de una clase TokenCredential (consulte @azure/identity para DefaultAzureCredential y otras TokenCredential implementaciones). Páselo al constructor de la clase de cliente.

Para autenticarse, en el ejemplo siguiente se usa DefaultAzureCredential desde el paquete de @azure/identity :

import { DefaultAzureCredential } from "@azure/identity";
import { LogsIngestionClient } from "@azure/monitor-ingestion";

import * as dotenv from "dotenv";
dotenv.config();

const logsIngestionEndpoint = process.env.LOGS_INGESTION_ENDPOINT || "logs_ingestion_endpoint";

const credential = new DefaultAzureCredential();
const logsIngestionClient = new LogsIngestionClient(logsIngestionEndpoint, credential);

Configuración del cliente para la nube soberana de Azure

De forma predeterminada, el cliente está configurado 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 del cliente. Por ejemplo:

import { DefaultAzureCredential } from "@azure/identity";
import { LogsIngestionClient } from "@azure/monitor-ingestion";

import * as dotenv from "dotenv";
dotenv.config();

const logsIngestionEndpoint = process.env.LOGS_INGESTION_ENDPOINT || "logs_ingestion_endpoint";

const credential = new DefaultAzureCredential();
const logsIngestionClient = new LogsIngestionClient(logsIngestionEndpoint, credential, {
  audience: "https://api.loganalytics.azure.cn/.default",
});

Conceptos clave

Punto de conexión de recopilación de datos

Los puntos de conexión de recopilación de datos (DCE) permiten configurar de forma única los valores de ingesta de Azure Monitor. En este artículo se proporciona información general sobre los puntos de conexión de recopilación de datos, incluidos su contenido y estructura, y cómo puede crearlos y trabajar con ellos.

Regla de recopilación de datos

Las reglas de recopilación de datos (DCR) definen los datos recopilados por Azure Monitor y especifican cómo y dónde se deben enviar o almacenar esos datos. La llamada API de REST debe especificar una DCR que se usará. Un único DCE puede admitir varias DCR, por lo que puede especificar una DCR diferente para orígenes y tablas de destino distintos.

La DCR debe comprender la estructura de los datos de entrada y la estructura de la tabla de destino. Si las dos no coinciden, puede usar una transformación para convertir los datos de origen para que coincidan con la tabla de destino. También puede usar la transformación para filtrar los datos de origen y realizar cualquier otro cálculo o conversión.

Para más información, consulte Reglas de recopilación de datos en Azure Monitor. Para obtener información sobre cómo recuperar un identificador de DCR, consulte este tutorial.

Tablas del área de trabajo de Log Analytics

Los registros personalizados pueden enviar datos a cualquier tabla personalizada que cree y a determinadas tablas integradas en el área de trabajo de Log Analytics. La tabla de destino debe existir antes de poder enviarle datos. Actualmente se admiten las tablas integradas siguientes:

Ejemplos

Puede familiarizarse con diferentes API mediante ejemplos.

Carga de registros personalizados

Puede crear un cliente y llamar al método del Upload cliente. Tome nota de los límites de ingesta de datos.

const { isAggregateLogsUploadError, DefaultAzureCredential } = require("@azure/identity");
const { LogsIngestionClient } = require("@azure/monitor-ingestion");

require("dotenv").config();

async function main() {
  const logsIngestionEndpoint = process.env.LOGS_INGESTION_ENDPOINT || "logs_ingestion_endpoint";
  const ruleId = process.env.DATA_COLLECTION_RULE_ID || "data_collection_rule_id";
  const streamName = process.env.STREAM_NAME || "data_stream_name";
  const credential = new DefaultAzureCredential();
  const client = new LogsIngestionClient(logsIngestionEndpoint, credential);
  const logs = [
    {
      Time: "2021-12-08T23:51:14.1104269Z",
      Computer: "Computer1",
      AdditionalContext: "context-2",
    },
    {
      Time: "2021-12-08T23:51:14.1104269Z",
      Computer: "Computer2",
      AdditionalContext: "context",
    },
  ];
  try{
    await client.upload(ruleId, streamName, logs);
  }
  catch(e){
    let aggregateErrors = isAggregateLogsUploadError(e) ? e.errors : [];
    if (aggregateErrors.length > 0) {
      console.log("Some logs have failed to complete ingestion");
      for (const error of aggregateErrors) {
        console.log(`Error - ${JSON.stringify(error.cause)}`);
        console.log(`Log - ${JSON.stringify(error.failedLogs)}`);
      }
    } else {
      console.log(e);
    }
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exit(1);
});

module.exports = { main };

Comprobación de registros

Puede comprobar que los datos se han cargado correctamente mediante la biblioteca de @azure/monitor-query . Ejecute primero el ejemplo Cargar registros personalizados antes de comprobar los registros.

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

/**
 * @summary Demonstrates how to run query against a Log Analytics workspace to verify if the logs were uploaded
 */

const { DefaultAzureCredential } = require("@azure/identity");
const { LogsQueryClient } = require("@azure/monitor-query");

const monitorWorkspaceId = process.env.MONITOR_WORKSPACE_ID || "workspace_id";
const tableName = process.env.TABLE_NAME || "table_name";
require("dotenv").config();

async function main() {
  const credential = new DefaultAzureCredential();
  const logsQueryClient = new LogsQueryClient(credential);
  const queriesBatch = [
    {
      workspaceId: monitorWorkspaceId,
      query: tableName + " | count;",
      timespan: { duration: "P1D" },
    },
  ];

  const result = await logsQueryClient.queryBatch(queriesBatch);
  if (result[0].status === "Success") {
    console.log("Table entry count: ", JSON.stringify(result[0].tables));
  } else {
    console.log(
      `Some error encountered while retrieving the count. Status = ${result[0].status}`,
      JSON.stringify(result[0])
    );
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exit(1);
});

module.exports = { main };

Carga de grandes lotes de registros

Al cargar más de 1 MB de registros en una sola llamada al upload método en LogsIngestionClient, la carga se dividirá en varios lotes más pequeños, cada uno de ellos no mayor que 1 MB. De forma predeterminada, estos lotes se cargarán en paralelo, con un máximo de 5 lotes que se cargan simultáneamente. Puede ser conveniente reducir la simultaneidad máxima si el uso de memoria es un problema. El número máximo de cargas simultáneas se puede controlar mediante la maxConcurrency opción , como se muestra en este ejemplo:

const { DefaultAzureCredential } = require("@azure/identity");
const { isAggregateLogsUploadError, LogsIngestionClient } = require("@azure/monitor-ingestion");

require("dotenv").config();

async function main() {
  const logsIngestionEndpoint = process.env.LOGS_INGESTION_ENDPOINT || "logs_ingestion_endpoint";
  const ruleId = process.env.DATA_COLLECTION_RULE_ID || "data_collection_rule_id";
  const streamName = process.env.STREAM_NAME || "data_stream_name";
  const credential = new DefaultAzureCredential();
  const client = new LogsIngestionClient(logsIngestionEndpoint, credential);

  // Constructing a large number of logs to ensure batching takes place
  const logs = [];
  for (let i = 0; i < 100000; ++i) {
    logs.push({
      Time: "2021-12-08T23:51:14.1104269Z",
      Computer: "Computer1",
      AdditionalContext: `context-${i}`,
    });
  }

  try{
    // Set the maximum concurrency to 1 to prevent concurrent requests entirely
    await client.upload(ruleId, streamName, logs, { maxConcurrency: 1 });
  }
  catch(e){
    let aggregateErrors = isAggregateLogsUploadError(e) ? e.errors : [];
    if (aggregateErrors.length > 0) {
      console.log("Some logs have failed to complete ingestion");
      for (const error of aggregateErrors) {
        console.log(`Error - ${JSON.stringify(error.cause)}`);
        console.log(`Log - ${JSON.stringify(error.failedLogs)}`);
      }
    } else {
      console.log(e);
    }
  }
}
main().catch((err) => {
  console.error("The sample encountered an error:", err);
  process.exit(1);
});

module.exports = { main };

Recuperación de registros

Los registros cargados mediante la biblioteca cliente de ingesta de monitores se pueden recuperar mediante la biblioteca cliente de consulta de supervisión.

Solución de problemas

Para más información sobre cómo diagnosticar varios escenarios de error, consulte nuestra guía de solución de problemas.

Pasos siguientes

Para más información sobre Azure Monitor, consulte la documentación del servicio Azure Monitor. Eche un vistazo al directorio de ejemplos para obtener ejemplos detallados sobre cómo usar esta biblioteca.

Contribuciones

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

Impresiones