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
- Regrouper les journaux — Téléchargez par lots plutôt qu'un à la fois
- Utiliser la concurrence — Définissez
maxConcurrencypour les gros téléchargements - Gérer les défaillances partielles — Utilisez le consommateur d'erreurs pour journaliser les entrées échouées
- Correspondre au schéma DCR — Les champs d'entrée de journal doivent correspondre aux attentes de transformation du DCR
- Inclure TimeGenerated — La plupart des tables nécessitent un champ timestamp
- Réutiliser le client — Créez une fois, réutilisez dans toute l'application
- Utiliser async pour un haut débit —
LogsIngestionAsyncClientpour 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";