GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

azure-monitor-ingestion-java

Azure Monitor Ingestion SDK for Java. Send custom logs to Azure Monitor via Data Collection Rules (DCR) and Data Collection Endpoints (DCE). Triggers: "LogsIngestionClient java", "azure monitor ingestion java", "custom logs java", "DCR java", "data collection rule java".

Ciza · 0 points · 17 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_azure-sdk-java_skills_azure-monitor-ingestion-java-e58528d.zip · 4 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-monitor-ingestion-java
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Azure Monitor Ingestion SDK for Java

Client library for sending custom logs to Azure Monitor using the Logs Ingestion API via Data Collection Rules.

Installation

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

Or use Azure SDK BOM:

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

Prerequisites

  • Data Collection Endpoint (DCE)
  • Data Collection Rule (DCR)
  • Log Analytics workspace
  • Target table (custom or built-in: CommonSecurityLog, SecurityEvents, Syslog, WindowsEvents)

Environment Variables

DATA_COLLECTION_ENDPOINT=https://<dce-name>.<region>.ingest.monitor.azure.com  # Required for all auth methods
DATA_COLLECTION_RULE_ID=dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # Required for log upload routing
STREAM_NAME=Custom-MyTable_CL  # Required for the target DCR stream
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production

Client Creation

Synchronous Client

import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.monitor.ingestion.LogsIngestionClient;
import com.azure.monitor.ingestion.LogsIngestionClientBuilder;

// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();

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

Asynchronous Client

import com.azure.monitor.ingestion.LogsIngestionAsyncClient;

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

Key Concepts

Concept Description
Data Collection Endpoint (DCE) Ingestion endpoint URL for your region
Data Collection Rule (DCR) Defines data transformation and routing to tables
Stream Name Target stream in the DCR (e.g., Custom-MyTable_CL)
Log Analytics Workspace Destination for ingested logs

Core Operations

Upload Custom Logs

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

Upload with Concurrency

For large log collections, enable concurrent uploads:

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

Upload with Error Handling

Handle partial upload failures gracefully:

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

Async Upload with 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();

Log Entry Model Example

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

Error Handling

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

Best Practices

  1. Batch logs — Upload in batches rather than one at a time
  2. Use concurrency — Set maxConcurrency for large uploads
  3. Handle partial failures — Use error consumer to log failed entries
  4. Match DCR schema — Log entry fields must match DCR transformation expectations
  5. Include TimeGenerated — Most tables require a timestamp field
  6. Reuse client — Create once, reuse throughout application
  7. Use async for high throughput — LogsIngestionAsyncClient for reactive patterns

Querying Uploaded Logs

Use azure-monitor-query to query ingested logs:

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

Reference Links

Resource URL
Maven Package 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
Product Docs https://learn.microsoft.com/azure/azure-monitor/logs/logs-ingestion-api-overview
DCE Overview https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-endpoint-overview
DCR Overview https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview
Troubleshooting https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-ingestion/TROUBLESHOOTING.md
Files (skills)
  • references
    • examples.md 7.9 KB
      # Azure Monitor Ingestion SDK for Java - Examples
      
      Comprehensive code examples for the Azure Monitor Ingestion SDK for Java.
      
      ## Table of Contents
      - [Maven Dependency](#maven-dependency)
      - [Client Creation](#client-creation)
      - [Uploading Logs](#uploading-logs)
      - [Batching with Concurrency](#batching-with-concurrency)
      - [Error Handling](#error-handling)
      - [Async Client Patterns](#async-client-patterns)
      
      ## Maven Dependency
      
      ```xml
      <!-- Using Azure SDK BOM (recommended) -->
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>com.azure</groupId>
                  <artifactId>azure-sdk-bom</artifactId>
                  <version>1.2.29</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
      
      <dependencies>
          <dependency>
              <groupId>com.azure</groupId>
              <artifactId>azure-monitor-ingestion</artifactId>
          </dependency>
          <dependency>
              <groupId>com.azure</groupId>
              <artifactId>azure-identity</artifactId>
          </dependency>
      </dependencies>
      
      <!-- Or direct dependencies -->
      <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-monitor-ingestion</artifactId>
          <version>1.2.14</version>
      </dependency>
      <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-identity</artifactId>
          <version>1.15.3</version>
      </dependency>
      ```
      
      ## Client Creation
      
      ### Synchronous Client
      
      ```java
      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>")  // e.g., "https://my-dce.eastus-1.ingest.monitor.azure.com"
          .credential(credential)
          .buildClient();
      ```
      
      ### Asynchronous Client
      
      ```java
      import com.azure.monitor.ingestion.LogsIngestionAsyncClient;
      
      LogsIngestionAsyncClient asyncClient = new LogsIngestionClientBuilder()
          .endpoint("<data-collection-endpoint>")
          .credential(new DefaultAzureCredentialBuilder().build())
          .buildAsyncClient();
      ```
      
      ## Uploading Logs
      
      ### Basic Upload
      
      ```java
      import com.azure.monitor.ingestion.LogsIngestionClient;
      import com.azure.monitor.ingestion.models.LogsUploadException;
      import java.time.OffsetDateTime;
      import java.util.Arrays;
      import java.util.List;
      
      List<Object> logs = Arrays.asList(
          new Object() {
              OffsetDateTime time = OffsetDateTime.now();
              String computer = "Computer1";
              String message = "Application started";
              int level = 1;
          },
          new Object() {
              OffsetDateTime time = OffsetDateTime.now();
              String computer = "Computer2";
              String message = "Connection established";
              int level = 2;
          }
      );
      
      try {
          client.upload(
              "dcr-00000000000000000000000000000000",  // DCR immutable ID
              "Custom-MyTableRawData",                  // Stream name from DCR
              logs
          );
          System.out.println("Logs uploaded successfully");
      } catch (LogsUploadException e) {
          System.out.println("Failed to upload logs");
          e.getLogsUploadErrors().forEach(error -> 
              System.out.println(error.getMessage()));
      }
      ```
      
      ### Using POJO Classes
      
      ```java
      import java.time.OffsetDateTime;
      import java.util.ArrayList;
      import java.util.List;
      
      // Define log entry class
      class CustomLogEntry {
          private OffsetDateTime timeGenerated;
          private String computer;
          private String message;
          private int severity;
      
          public CustomLogEntry(OffsetDateTime timeGenerated, String computer, 
                                String message, int severity) {
              this.timeGenerated = timeGenerated;
              this.computer = computer;
              this.message = message;
              this.severity = severity;
          }
      
          // Getters required for JSON serialization
          public OffsetDateTime getTimeGenerated() { return timeGenerated; }
          public String getComputer() { return computer; }
          public String getMessage() { return message; }
          public int getSeverity() { return severity; }
      }
      
      // Create and upload logs
      List<Object> logs = new ArrayList<>();
      logs.add(new CustomLogEntry(OffsetDateTime.now(), "Server1", "Started", 1));
      logs.add(new CustomLogEntry(OffsetDateTime.now(), "Server2", "Connected", 2));
      
      client.upload("<dcr-id>", "<stream-name>", logs);
      ```
      
      ## Batching with Concurrency
      
      When uploading large collections, the SDK automatically splits them into batches:
      
      ```java
      import com.azure.core.util.Context;
      import com.azure.monitor.ingestion.models.LogsUploadOptions;
      import java.time.OffsetDateTime;
      import java.util.ArrayList;
      import java.util.List;
      
      // Generate large batch
      List<Object> logs = new ArrayList<>();
      for (int i = 0; i < 100000; i++) {
          final int index = i;
          logs.add(new Object() {
              OffsetDateTime time = OffsetDateTime.now();
              String computer = "Computer" + (index % 10);
              String message = "Log entry " + index;
              int level = index % 5;
          });
      }
      
      // Configure concurrency
      LogsUploadOptions options = new LogsUploadOptions()
          .setMaxConcurrency(3);  // Up to 3 concurrent batch uploads
      
      client.upload("<dcr-id>", "<stream-name>", logs, options, Context.NONE);
      ```
      
      ## Error Handling
      
      ### Error Consumer for Partial Failures
      
      ```java
      import com.azure.core.util.Context;
      import com.azure.monitor.ingestion.models.LogsUploadOptions;
      
      LogsUploadOptions options = new LogsUploadOptions()
          .setLogsUploadErrorConsumer(error -> {
              // Log error details
              System.out.println("Error: " + error.getResponseException().getMessage());
              System.out.println("Failed logs: " + error.getFailedLogs().size());
              
              // Access failed logs for retry
              error.getFailedLogs().forEach(log -> 
                  System.out.println("Failed: " + log));
      
              // Option 1: Continue with remaining logs (default)
              // Just return
      
              // Option 2: Abort remaining uploads
              // throw error.getResponseException();
          });
      
      client.upload("<dcr-id>", "<stream-name>", logs, options, Context.NONE);
      ```
      
      ### Catching LogsUploadException
      
      ```java
      import com.azure.monitor.ingestion.models.LogsUploadException;
      
      try {
          client.upload("<dcr-id>", "<stream-name>", logs);
          System.out.println("All logs uploaded");
      } catch (LogsUploadException e) {
          System.out.println("Some logs failed");
          e.getLogsUploadErrors().forEach(error -> {
              System.out.println("Error: " + error.getMessage());
              System.out.println("Status: " + 
                  error.getResponseException().getResponse().getStatusCode());
          });
      }
      ```
      
      ## Async Client Patterns
      
      ### Basic Async Upload
      
      ```java
      import java.util.concurrent.CountDownLatch;
      
      CountDownLatch latch = new CountDownLatch(1);
      
      asyncClient.upload("<dcr-id>", "<stream-name>", logs)
          .doOnSuccess(unused -> System.out.println("Uploaded successfully"))
          .doOnError(error -> System.err.println("Failed: " + error.getMessage()))
          .doFinally(signal -> latch.countDown())
          .subscribe();
      
      latch.await();
      ```
      
      ### Async with Options
      
      ```java
      import com.azure.monitor.ingestion.models.LogsUploadOptions;
      
      LogsUploadOptions options = new LogsUploadOptions()
          .setMaxConcurrency(3)
          .setLogsUploadErrorConsumer(error -> {
              System.out.println("Partial failure: " + error.getFailedLogs().size());
          });
      
      asyncClient.upload("<dcr-id>", "<stream-name>", logs, options)
          .subscribe(
              unused -> System.out.println("Success"),
              error -> System.err.println("Error: " + error.getMessage()),
              () -> System.out.println("Completed")
          );
      ```
      
      ### Chaining Operations
      
      ```java
      import reactor.core.publisher.Mono;
      
      Mono.just(generateLogs())
          .flatMap(logs -> asyncClient.upload("<dcr-id>", "<stream-name>", logs))
          .doOnSuccess(unused -> System.out.println("Upload complete"))
          .doOnError(error -> System.err.println("Upload failed: " + error))
          .subscribe();
      ```
      
  • SKILL.md 7.8 KB
    ---
    name: azure-monitor-ingestion-java
    description: |
      Azure Monitor Ingestion SDK for Java. Send custom logs to Azure Monitor via Data Collection Rules (DCR) and Data Collection Endpoints (DCE).
      Triggers: "LogsIngestionClient java", "azure monitor ingestion java", "custom logs java", "DCR java", "data collection rule java".
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
      package: com.azure:azure-monitor-ingestion
    ---
    
    # Azure Monitor Ingestion SDK for Java
    
    Client library for sending custom logs to Azure Monitor using the Logs Ingestion API via Data Collection Rules.
    
    ## Installation
    
    ```xml
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-monitor-ingestion</artifactId>
        <version>1.2.11</version>
    </dependency>
    ```
    
    Or use Azure SDK BOM:
    
    ```xml
    <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>
    ```
    
    ## Prerequisites
    
    - Data Collection Endpoint (DCE)
    - Data Collection Rule (DCR)
    - Log Analytics workspace
    - Target table (custom or built-in: CommonSecurityLog, SecurityEvents, Syslog, WindowsEvents)
    
    ## Environment Variables
    
    ```bash
    DATA_COLLECTION_ENDPOINT=https://<dce-name>.<region>.ingest.monitor.azure.com  # Required for all auth methods
    DATA_COLLECTION_RULE_ID=dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # Required for log upload routing
    STREAM_NAME=Custom-MyTable_CL  # Required for the target DCR stream
    AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
    ```
    
    ## Client Creation
    
    ### Synchronous Client
    
    ```java
    import com.azure.core.credential.TokenCredential;
    import com.azure.identity.AzureIdentityEnvVars;
    import com.azure.identity.DefaultAzureCredentialBuilder;
    import com.azure.identity.ManagedIdentityCredentialBuilder;
    import com.azure.monitor.ingestion.LogsIngestionClient;
    import com.azure.monitor.ingestion.LogsIngestionClientBuilder;
    
    // Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
    TokenCredential credential = new DefaultAzureCredentialBuilder()
        .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
        .build();
    // Or use a specific credential directly in production:
    // See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
    // TokenCredential credential = new ManagedIdentityCredentialBuilder().build();
    
    LogsIngestionClient client = new LogsIngestionClientBuilder()
        .endpoint("<data-collection-endpoint>")
        .credential(credential)
        .buildClient();
    ```
    
    ### Asynchronous Client
    
    ```java
    import com.azure.monitor.ingestion.LogsIngestionAsyncClient;
    
    LogsIngestionAsyncClient asyncClient = new LogsIngestionClientBuilder()
        .endpoint("<data-collection-endpoint>")
        .credential(credential)
        .buildAsyncClient();
    ```
    
    ## Key Concepts
    
    | Concept | Description |
    |---------|-------------|
    | Data Collection Endpoint (DCE) | Ingestion endpoint URL for your region |
    | Data Collection Rule (DCR) | Defines data transformation and routing to tables |
    | Stream Name | Target stream in the DCR (e.g., `Custom-MyTable_CL`) |
    | Log Analytics Workspace | Destination for ingested logs |
    
    ## Core Operations
    
    ### Upload Custom Logs
    
    ```java
    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");
    ```
    
    ### Upload with Concurrency
    
    For large log collections, enable concurrent uploads:
    
    ```java
    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);
    ```
    
    ### Upload with Error Handling
    
    Handle partial upload failures gracefully:
    
    ```java
    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);
    ```
    
    ### Async Upload with Reactor
    
    ```java
    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();
    ```
    
    ## Log Entry Model Example
    
    ```java
    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; }
    }
    ```
    
    ## Error Handling
    
    ```java
    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");
        }
    }
    ```
    
    ## Best Practices
    
    1. **Batch logs** — Upload in batches rather than one at a time
    2. **Use concurrency** — Set `maxConcurrency` for large uploads
    3. **Handle partial failures** — Use error consumer to log failed entries
    4. **Match DCR schema** — Log entry fields must match DCR transformation expectations
    5. **Include TimeGenerated** — Most tables require a timestamp field
    6. **Reuse client** — Create once, reuse throughout application
    7. **Use async for high throughput** — `LogsIngestionAsyncClient` for reactive patterns
    
    ## Querying Uploaded Logs
    
    Use [azure-monitor-query](../query/SKILL.md) to query ingested logs:
    
    ```java
    // See azure-monitor-query skill for LogsQueryClient usage
    String query = "MyTable_CL | where TimeGenerated > ago(1h) | limit 10";
    ```
    
    ## Reference Links
    
    | Resource | URL |
    |----------|-----|
    | Maven Package | 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 |
    | Product Docs | https://learn.microsoft.com/azure/azure-monitor/logs/logs-ingestion-api-overview |
    | DCE Overview | https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-endpoint-overview |
    | DCR Overview | https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview |
    | Troubleshooting | https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-ingestion/TROUBLESHOOTING.md |
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related