azure-monitor-ingestion-java

npx skills add https://github.com/microsoft/skills --skill azure-monitor-ingestion-java

Kit de développement Azure Monitor Ingestion pour Java

Bibliothèque cliente pour envoyer des journaux personnalisés à Azure Monitor via l'API Logs Ingestion et les Data Collection Rules.

Installation

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-monitor-ingestion</artifactId>
    <version>1.2.11</version>
</dependency>

Ou utiliser le BOM Azure SDK :

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-sdk-bom</artifactId>
            <version>{bom_version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-monitor-ingestion</artifactId>
    </dependency>
</dependencies>

Prérequis

  • Data Collection Endpoint (DCE)
  • Data Collection Rule (DCR)
  • Espace de travail Log Analytics
  • Table cible (personnalisée ou intégrée : CommonSecurityLog, SecurityEvents, Syslog, WindowsEvents)

Variables d'environnement

DATA_COLLECTION_ENDPOINT=https://<dce-name>.<region>.ingest.monitor.azure.com
DATA_COLLECTION_RULE_ID=dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
STREAM_NAME=Custom-MyTable_CL

Création du client

Client synchrone

import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.monitor.ingestion.LogsIngestionClient;
import com.azure.monitor.ingestion.LogsIngestionClientBuilder;

DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();

LogsIngestionClient client = new LogsIngestionClientBuilder()
    .endpoint("<data-collection-endpoint>")
    .credential(credential)
    .buildClient();

Client asynchrone

import com.azure.monitor.ingestion.LogsIngestionAsyncClient;

LogsIngestionAsyncClient asyncClient = new LogsIngestionClientBuilder()
    .endpoint("<data-collection-endpoint>")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

Concepts clés

Concept Description
Data Collection Endpoint (DCE) URL du point de terminaison d'ingestion pour votre région
Data Collection Rule (DCR) Définit la transformation et l'acheminement des données vers les tables
Stream Name Flux cible dans le DCR (p. ex., Custom-MyTable_CL)
Espace de travail Log Analytics Destination des journaux ingérés

Opérations principales

Charger des journaux personnalisés

import java.util.List;
import java.util.ArrayList;

List<Object> logs = new ArrayList<>();
logs.add(new MyLogEntry("2024-01-15T10:30:00Z", "INFO", "Application started"));
logs.add(new MyLogEntry("2024-01-15T10:30:05Z", "DEBUG", "Processing request"));

client.upload("<data-collection-rule-id>", "<stream-name>", logs);
System.out.println("Logs uploaded successfully");

Charger avec concurrence

Pour les grandes collections de journaux, activez les téléchargements concurrents :

import com.azure.monitor.ingestion.models.LogsUploadOptions;
import com.azure.core.util.Context;

List<Object> logs = getLargeLogs(); // Large collection

LogsUploadOptions options = new LogsUploadOptions()
    .setMaxConcurrency(3);

client.upload("<data-collection-rule-id>", "<stream-name>", logs, options, Context.NONE);

Charger avec gestion des erreurs

Gérez élégamment les défaillances de téléchargement partiel :

LogsUploadOptions options = new LogsUploadOptions()
    .setLogsUploadErrorConsumer(uploadError -> {
        System.err.println("Upload error: " + uploadError.getResponseException().getMessage());
        System.err.println("Failed logs count: " + uploadError.getFailedLogs().size());

        // Option 1: Log and continue
        // Option 2: Throw to abort remaining uploads
        // throw uploadError.getResponseException();
    });

client.upload("<data-collection-rule-id>", "<stream-name>", logs, options, Context.NONE);

Téléchargement asynchrone avec Reactor

import reactor.core.publisher.Mono;

List<Object> logs = getLogs();

asyncClient.upload("<data-collection-rule-id>", "<stream-name>", logs)
    .doOnSuccess(v -> System.out.println("Upload completed"))
    .doOnError(e -> System.err.println("Upload failed: " + e.getMessage()))
    .subscribe();

Exemple de modèle d'entrée de journal

public class MyLogEntry {
    private String timeGenerated;
    private String level;
    private String message;

    public MyLogEntry(String timeGenerated, String level, String message) {
        this.timeGenerated = timeGenerated;
        this.level = level;
        this.message = message;
    }

    // Getters required for JSON serialization
    public String getTimeGenerated() { return timeGenerated; }
    public String getLevel() { return level; }
    public String getMessage() { return message; }
}

Gestion des erreurs

import com.azure.core.exception.HttpResponseException;

try {
    client.upload(ruleId, streamName, logs);
} catch (HttpResponseException e) {
    System.err.println("HTTP Status: " + e.getResponse().getStatusCode());
    System.err.println("Error: " + e.getMessage());

    if (e.getResponse().getStatusCode() == 403) {
        System.err.println("Check DCR permissions and managed identity");
    } else if (e.getResponse().getStatusCode() == 404) {
        System.err.println("Verify DCE endpoint and DCR ID");
    }
}

Bonnes pratiques

  1. Regrouper les journaux — Téléchargez par lots plutôt qu'un à la fois
  2. Utiliser la concurrence — Définissez maxConcurrency pour les gros téléchargements
  3. Gérer les défaillances partielles — Utilisez le consommateur d'erreurs pour journaliser les entrées échouées
  4. Correspondre au schéma DCR — Les champs d'entrée de journal doivent correspondre aux attentes de transformation du DCR
  5. Inclure TimeGenerated — La plupart des tables nécessitent un champ timestamp
  6. Réutiliser le client — Créez une fois, réutilisez dans toute l'application
  7. Utiliser async pour un haut débitLogsIngestionAsyncClient pour les modèles réactifs

Interrogation des journaux téléchargés

Utilisez azure-monitor-query pour interroger les journaux ingérés :

// See azure-monitor-query skill for LogsQueryClient usage
String query = "MyTable_CL | where TimeGenerated > ago(1h) | limit 10";

Liens de référence

Ressource URL
Package Maven https://central.sonatype.com/artifact/com.azure/azure-monitor-ingestion
GitHub https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/monitor/azure-monitor-ingestion
Documentation du produit https://learn.microsoft.com/azure/azure-monitor/logs/logs-ingestion-api-overview
Aperçu DCE https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-endpoint-overview
Aperçu DCR https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview
Dépannage https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-ingestion/TROUBLESHOOTING.md

Skills similaires