All skills
microsoft avatar

/azure-monitor-query-java

@e7ee58f
by microsoftmicrosoft/skills3.1k stars
351

Azure Monitor Query SDK for Java. Execute Kusto queries against Log Analytics workspaces and query metrics from Azure resources. Triggers: "LogsQueryClient java", "MetricsQueryClient java", "kusto query java", "log analytics java", "azure monitor query java". Note: This package is deprecated. Migrate to azure-monitor-query-logs and azure-monitor-query-metrics.

Use this Skill: https://skilld.dev/gh/microsoft/skills/azure-monitor-query-java

This session only. Nothing lands on disk.

referencesexamples.md

≈2.9k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Azure Monitor Query SDK for Java - Examples

Comprehensive code examples for the Azure Monitor Query SDK for Java.

Table of Contents

Maven Dependency

<!-- Using Azure SDK BOM (recommended) -->
<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-query</artifactId>
    </dependency>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
    </dependency>
</dependencies>

<!-- Or direct dependencies -->
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-monitor-query</artifactId>
    <version>1.5.9</version>
</dependency>

Client Creation

LogsQueryClient

import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.monitor.query.LogsQueryClient;
import com.azure.monitor.query.LogsQueryClientBuilder;

LogsQueryClient logsQueryClient = new LogsQueryClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

MetricsQueryClient

import com.azure.monitor.query.MetricsQueryClient;
import com.azure.monitor.query.MetricsQueryClientBuilder;

MetricsQueryClient metricsQueryClient = new MetricsQueryClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

For Sovereign Clouds

LogsQueryClient logsQueryClient = new LogsQueryClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint("https://api.loganalytics.azure.cn/v1")
    .buildClient();

Querying Log Analytics

Query Workspace

import com.azure.monitor.query.models.LogsQueryResult;
import com.azure.monitor.query.models.LogsTableRow;
import com.azure.monitor.query.models.QueryTimeInterval;
import java.time.Duration;

LogsQueryResult result = logsQueryClient.queryWorkspace(
    "{workspace-id}",
    "AzureActivity | top 10 by TimeGenerated",
    new QueryTimeInterval(Duration.ofDays(2))
);

for (LogsTableRow row : result.getTable().getRows()) {
    System.out.println(
        row.getColumnValue("OperationName") + " " + 
        row.getColumnValue("ResourceGroup")
    );
}

Query by Resource ID

LogsQueryResult result = logsQueryClient.queryResource(
    "{resource-id}",  // Full Azure resource ID
    "AzureActivity | top 10 by TimeGenerated",
    new QueryTimeInterval(Duration.ofDays(2))
);

Query with Options

import com.azure.monitor.query.models.LogsQueryOptions;

LogsQueryResult result = logsQueryClient.queryWorkspace(
    "{workspace-id}",
    "AzureActivity | top 10 by TimeGenerated",
    new QueryTimeInterval(Duration.ofDays(2)),
    new LogsQueryOptions()
        .setServerTimeout(Duration.ofMinutes(2))
        .setIncludeStatistics(true)
        .setIncludeVisualization(true)
);

Querying Metrics

Basic Metrics Query

import com.azure.monitor.query.models.MetricResult;
import com.azure.monitor.query.models.MetricValue;
import com.azure.monitor.query.models.MetricsQueryResult;
import com.azure.monitor.query.models.TimeSeriesElement;
import java.util.Arrays;

MetricsQueryResult result = metricsQueryClient.queryResource(
    "{resource-uri}",
    Arrays.asList("SuccessfulCalls", "TotalCalls")
);

for (MetricResult metric : result.getMetrics()) {
    System.out.println("Metric: " + metric.getMetricName());
    for (TimeSeriesElement ts : metric.getTimeSeries()) {
        System.out.println("Dimensions: " + ts.getMetadata());
        for (MetricValue value : ts.getValues()) {
            System.out.println(value.getTimeStamp() + ": " + value.getTotal());
        }
    }
}

With Aggregations and Granularity

import com.azure.core.http.rest.Response;
import com.azure.core.util.Context;
import com.azure.monitor.query.models.AggregationType;
import com.azure.monitor.query.models.MetricsQueryOptions;

Response<MetricsQueryResult> response = metricsQueryClient.queryResourceWithResponse(
    "{resource-id}",
    Arrays.asList("SuccessfulCalls", "TotalCalls"),
    new MetricsQueryOptions()
        .setGranularity(Duration.ofHours(1))
        .setAggregations(Arrays.asList(
            AggregationType.AVERAGE, 
            AggregationType.COUNT
        )),
    Context.NONE
);

MetricsQueryResult result = response.getValue();

Batch Queries

import com.azure.monitor.query.models.LogsBatchQuery;
import com.azure.monitor.query.models.LogsBatchQueryResult;
import com.azure.monitor.query.models.LogsBatchQueryResultCollection;
import com.azure.monitor.query.models.LogsQueryResultStatus;

LogsBatchQuery batchQuery = new LogsBatchQuery();
String q1 = batchQuery.addWorkspaceQuery("{workspace-id}", "{query-1}", 
    new QueryTimeInterval(Duration.ofDays(2)));
String q2 = batchQuery.addWorkspaceQuery("{workspace-id}", "{query-2}", 
    new QueryTimeInterval(Duration.ofDays(30)));
String q3 = batchQuery.addWorkspaceQuery("{workspace-id}", "{query-3}", 
    new QueryTimeInterval(Duration.ofDays(10)));

LogsBatchQueryResultCollection results = logsQueryClient
    .queryBatchWithResponse(batchQuery, Context.NONE).getValue();

// Process query 1 - iterate rows
LogsBatchQueryResult result1 = results.getResult(q1);
for (LogsTableRow row : result1.getTable().getRows()) {
    System.out.println(row.getColumnValue("OperationName"));
}

// Process query 2 - map to model
List<CustomModel> models = results.getResult(q2, CustomModel.class);

// Check query 3 for failures
LogsBatchQueryResult result3 = results.getResult(q3);
if (result3.getQueryResultStatus() == LogsQueryResultStatus.FAILURE) {
    System.out.println("Error: " + result3.getError().getMessage());
}

Handling Query Results

Response Structure

LogsQueryResult
├── statistics
├── visualization
├── error
└── tables (List<LogsTable>)
    └── LogsTable
        ├── name
        ├── columns (List<LogsTableColumn>)
        │   ├── name
        │   └── type
        └── rows (List<LogsTableRow>)
            └── LogsTableRow
                └── getColumnValue(name)

Iterate Tables and Rows

import com.azure.monitor.query.models.LogsTable;
import com.azure.monitor.query.models.LogsTableColumn;
import com.azure.monitor.query.models.LogsTableRow;

LogsQueryResult result = logsQueryClient.queryWorkspace(...);
LogsTable table = result.getTable();

// Print columns
System.out.println("Columns:");
for (LogsTableColumn col : table.getColumns()) {
    System.out.println("  " + col.getName() + " (" + col.getType() + ")");
}

// Print rows
System.out.println("Rows:");
for (LogsTableRow row : table.getRows()) {
    Object operationName = row.getColumnValue("OperationName");
    Object resourceGroup = row.getColumnValue("ResourceGroup");
    System.out.println(operationName + " - " + resourceGroup);
}

Map to Custom Model

// Define model
public class CustomLogModel {
    private String resourceGroup;
    private String operationName;

    public String getResourceGroup() { return resourceGroup; }
    public String getOperationName() { return operationName; }
}

// Query and map
List<CustomLogModel> models = logsQueryClient.queryWorkspace(
    "{workspace-id}",
    "{kusto-query}",
    new QueryTimeInterval(Duration.ofDays(2)),
    CustomLogModel.class
);

for (CustomLogModel model : models) {
    System.out.println(model.getOperationName());
}

Time Ranges

Using Duration

QueryTimeInterval last2Days = new QueryTimeInterval(Duration.ofDays(2));
QueryTimeInterval last1Hour = new QueryTimeInterval(Duration.ofHours(1));
QueryTimeInterval last30Min = new QueryTimeInterval(Duration.ofMinutes(30));

Predefined Constants

QueryTimeInterval lastHour = QueryTimeInterval.LAST_1_HOUR;
QueryTimeInterval last7Days = QueryTimeInterval.LAST_7_DAYS;

Absolute Time Range

import java.time.OffsetDateTime;

OffsetDateTime start = OffsetDateTime.now().minusDays(7);
OffsetDateTime end = OffsetDateTime.now();
QueryTimeInterval absolute = new QueryTimeInterval(start, end);

Async Client Patterns

Create Async Clients

import com.azure.monitor.query.LogsQueryAsyncClient;
import com.azure.monitor.query.MetricsQueryAsyncClient;

LogsQueryAsyncClient asyncLogsClient = new LogsQueryClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

MetricsQueryAsyncClient asyncMetricsClient = new MetricsQueryClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildAsyncClient();

Async Logs Query

asyncLogsClient.queryWorkspace(
    "{workspace-id}",
    "AzureActivity | top 10 by TimeGenerated",
    new QueryTimeInterval(Duration.ofDays(2))
)
.subscribe(
    result -> {
        for (LogsTableRow row : result.getTable().getRows()) {
            System.out.println(row.getColumnValue("OperationName"));
        }
    },
    error -> System.err.println("Error: " + error.getMessage())
);

Async Metrics Query

asyncMetricsClient.queryResource(
    "{resource-id}",
    Arrays.asList("SuccessfulCalls")
)
.subscribe(
    result -> {
        for (MetricResult metric : result.getMetrics()) {
            System.out.println("Metric: " + metric.getMetricName());
        }
    },
    error -> System.err.println("Error: " + error.getMessage())
);

Error Handling

Sync Error Handling

import com.azure.core.exception.HttpResponseException;
import com.azure.monitor.query.models.LogsQueryResultStatus;

try {
    LogsQueryResult result = logsQueryClient.queryWorkspace(...);
    
    // Check for partial errors
    if (result.getQueryResultStatus() == LogsQueryResultStatus.PARTIAL_FAILURE) {
        System.out.println("Warning: " + result.getError().getMessage());
    }
} catch (HttpResponseException e) {
    System.err.println("HTTP error: " + e.getResponse().getStatusCode());
    System.err.println("Message: " + e.getMessage());
} catch (Exception e) {
    System.err.println("Error: " + e.getMessage());
}

Async Error Handling

asyncLogsClient.queryWorkspace(...)
    .subscribe(
        result -> {
            if (result.getQueryResultStatus() == LogsQueryResultStatus.FAILURE) {
                System.err.println("Query failed: " + result.getError().getMessage());
            } else {
                // Process results
            }
        },
        error -> {
            if (error instanceof HttpResponseException) {
                HttpResponseException httpError = (HttpResponseException) error;
                System.err.println("HTTP: " + httpError.getResponse().getStatusCode());
            } else {
                System.err.println("Error: " + error.getMessage());
            }
        }
    );

Source: SKILL.md on GitHub

1 warning15d4 checks · Risk SAFE
  • Gen Agent Trust Hub15d

    This skill is a standard implementation of the Azure Monitor Query SDK for Java. It provides comprehensive documentation and code examples for querying logs and metrics from Azure. While it processes external data which presents an inherent surface for indirect prompt injection, it follows established best practices for authentication and secure library usage.

  • Socket15d

    No alerts

  • Snyk15d

    Risk: LOW · No issues

  • Runlayer7mo

    2/3 files flagged

Signed by skilld at e7ee58f. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 5 months ago
Other metadata
metadata
{
  "author": "Microsoft",
  "version": "1.0.0",
  "package": "com.azure:azure-monitor-query"
}

README badge

README badge for microsoft/skills/azure-monitor-query-java