|
Add this skill
npx mdskills install sickn33/azure-monitor-query-javaComprehensive Java SDK reference with detailed examples for querying logs and metrics
1---2name: azure-monitor-query-java3description: |4 Azure Monitor Query SDK for Java. Execute Kusto queries against Log Analytics workspaces and query metrics from Azure resources.5 Triggers: "LogsQueryClient java", "MetricsQueryClient java", "kusto query java", "log analytics java", "azure monitor query java".6 Note: This package is deprecated. Migrate to azure-monitor-query-logs and azure-monitor-query-metrics.7package: com.azure:azure-monitor-query8---910# Azure Monitor Query SDK for Java1112> **DEPRECATION NOTICE**: This package is deprecated in favor of:13> - `azure-monitor-query-logs` — For Log Analytics queries14> - `azure-monitor-query-metrics` — For metrics queries15>16> See migration guides: [Logs Migration](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-query-logs/migration-guide.md) | [Metrics Migration](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-query-metrics/migration-guide.md)1718Client library for querying Azure Monitor Logs and Metrics.1920## Installation2122```xml23<dependency>24 <groupId>com.azure</groupId>25 <artifactId>azure-monitor-query</artifactId>26 <version>1.5.9</version>27</dependency>28```2930Or use Azure SDK BOM:3132```xml33<dependencyManagement>34 <dependencies>35 <dependency>36 <groupId>com.azure</groupId>37 <artifactId>azure-sdk-bom</artifactId>38 <version>{bom_version}</version>39 <type>pom</type>40 <scope>import</scope>41 </dependency>42 </dependencies>43</dependencyManagement>4445<dependencies>46 <dependency>47 <groupId>com.azure</groupId>48 <artifactId>azure-monitor-query</artifactId>49 </dependency>50</dependencies>51```5253## Prerequisites5455- Log Analytics workspace (for logs queries)56- Azure resource (for metrics queries)57- TokenCredential with appropriate permissions5859## Environment Variables6061```bash62LOG_ANALYTICS_WORKSPACE_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx63AZURE_RESOURCE_ID=/subscriptions/{sub}/resourceGroups/{rg}/providers/{provider}/{resource}64```6566## Client Creation6768### LogsQueryClient (Sync)6970```java71import com.azure.identity.DefaultAzureCredentialBuilder;72import com.azure.monitor.query.LogsQueryClient;73import com.azure.monitor.query.LogsQueryClientBuilder;7475LogsQueryClient logsClient = new LogsQueryClientBuilder()76 .credential(new DefaultAzureCredentialBuilder().build())77 .buildClient();78```7980### LogsQueryAsyncClient8182```java83import com.azure.monitor.query.LogsQueryAsyncClient;8485LogsQueryAsyncClient logsAsyncClient = new LogsQueryClientBuilder()86 .credential(new DefaultAzureCredentialBuilder().build())87 .buildAsyncClient();88```8990### MetricsQueryClient (Sync)9192```java93import com.azure.monitor.query.MetricsQueryClient;94import com.azure.monitor.query.MetricsQueryClientBuilder;9596MetricsQueryClient metricsClient = new MetricsQueryClientBuilder()97 .credential(new DefaultAzureCredentialBuilder().build())98 .buildClient();99```100101### MetricsQueryAsyncClient102103```java104import com.azure.monitor.query.MetricsQueryAsyncClient;105106MetricsQueryAsyncClient metricsAsyncClient = new MetricsQueryClientBuilder()107 .credential(new DefaultAzureCredentialBuilder().build())108 .buildAsyncClient();109```110111### Sovereign Cloud Configuration112113```java114// Azure China Cloud - Logs115LogsQueryClient logsClient = new LogsQueryClientBuilder()116 .credential(new DefaultAzureCredentialBuilder().build())117 .endpoint("https://api.loganalytics.azure.cn/v1")118 .buildClient();119120// Azure China Cloud - Metrics121MetricsQueryClient metricsClient = new MetricsQueryClientBuilder()122 .credential(new DefaultAzureCredentialBuilder().build())123 .endpoint("https://management.chinacloudapi.cn")124 .buildClient();125```126127## Key Concepts128129| Concept | Description |130|---------|-------------|131| Logs | Log and performance data from Azure resources via Kusto Query Language |132| Metrics | Numeric time-series data collected at regular intervals |133| Workspace ID | Log Analytics workspace identifier |134| Resource ID | Azure resource URI for metrics queries |135| QueryTimeInterval | Time range for the query |136137## Logs Query Operations138139### Basic Query140141```java142import com.azure.monitor.query.models.LogsQueryResult;143import com.azure.monitor.query.models.LogsTableRow;144import com.azure.monitor.query.models.QueryTimeInterval;145import java.time.Duration;146147LogsQueryResult result = logsClient.queryWorkspace(148 "{workspace-id}",149 "AzureActivity | summarize count() by ResourceGroup | top 10 by count_",150 new QueryTimeInterval(Duration.ofDays(7))151);152153for (LogsTableRow row : result.getTable().getRows()) {154 System.out.println(row.getColumnValue("ResourceGroup") + ": " + row.getColumnValue("count_"));155}156```157158### Query by Resource ID159160```java161LogsQueryResult result = logsClient.queryResource(162 "{resource-id}",163 "AzureMetrics | where TimeGenerated > ago(1h)",164 new QueryTimeInterval(Duration.ofDays(1))165);166167for (LogsTableRow row : result.getTable().getRows()) {168 System.out.println(row.getColumnValue("MetricName") + " " + row.getColumnValue("Average"));169}170```171172### Map Results to Custom Model173174```java175// Define model class176public class ActivityLog {177 private String resourceGroup;178 private String operationName;179180 public String getResourceGroup() { return resourceGroup; }181 public String getOperationName() { return operationName; }182}183184// Query with model mapping185List<ActivityLog> logs = logsClient.queryWorkspace(186 "{workspace-id}",187 "AzureActivity | project ResourceGroup, OperationName | take 100",188 new QueryTimeInterval(Duration.ofDays(2)),189 ActivityLog.class190);191192for (ActivityLog log : logs) {193 System.out.println(log.getOperationName() + " - " + log.getResourceGroup());194}195```196197### Batch Query198199```java200import com.azure.monitor.query.models.LogsBatchQuery;201import com.azure.monitor.query.models.LogsBatchQueryResult;202import com.azure.monitor.query.models.LogsBatchQueryResultCollection;203import com.azure.core.util.Context;204205LogsBatchQuery batchQuery = new LogsBatchQuery();206String q1 = batchQuery.addWorkspaceQuery("{workspace-id}", "AzureActivity | count", new QueryTimeInterval(Duration.ofDays(1)));207String q2 = batchQuery.addWorkspaceQuery("{workspace-id}", "Heartbeat | count", new QueryTimeInterval(Duration.ofDays(1)));208String q3 = batchQuery.addWorkspaceQuery("{workspace-id}", "Perf | count", new QueryTimeInterval(Duration.ofDays(1)));209210LogsBatchQueryResultCollection results = logsClient211 .queryBatchWithResponse(batchQuery, Context.NONE)212 .getValue();213214LogsBatchQueryResult result1 = results.getResult(q1);215LogsBatchQueryResult result2 = results.getResult(q2);216LogsBatchQueryResult result3 = results.getResult(q3);217218// Check for failures219if (result3.getQueryResultStatus() == LogsQueryResultStatus.FAILURE) {220 System.err.println("Query failed: " + result3.getError().getMessage());221}222```223224### Query with Options225226```java227import com.azure.monitor.query.models.LogsQueryOptions;228import com.azure.core.http.rest.Response;229230LogsQueryOptions options = new LogsQueryOptions()231 .setServerTimeout(Duration.ofMinutes(10))232 .setIncludeStatistics(true)233 .setIncludeVisualization(true);234235Response<LogsQueryResult> response = logsClient.queryWorkspaceWithResponse(236 "{workspace-id}",237 "AzureActivity | summarize count() by bin(TimeGenerated, 1h)",238 new QueryTimeInterval(Duration.ofDays(7)),239 options,240 Context.NONE241);242243LogsQueryResult result = response.getValue();244245// Access statistics246BinaryData statistics = result.getStatistics();247// Access visualization data248BinaryData visualization = result.getVisualization();249```250251### Query Multiple Workspaces252253```java254import java.util.Arrays;255256LogsQueryOptions options = new LogsQueryOptions()257 .setAdditionalWorkspaces(Arrays.asList("{workspace-id-2}", "{workspace-id-3}"));258259Response<LogsQueryResult> response = logsClient.queryWorkspaceWithResponse(260 "{workspace-id-1}",261 "AzureActivity | summarize count() by TenantId",262 new QueryTimeInterval(Duration.ofDays(1)),263 options,264 Context.NONE265);266```267268## Metrics Query Operations269270### Basic Metrics Query271272```java273import com.azure.monitor.query.models.MetricsQueryResult;274import com.azure.monitor.query.models.MetricResult;275import com.azure.monitor.query.models.TimeSeriesElement;276import com.azure.monitor.query.models.MetricValue;277import java.util.Arrays;278279MetricsQueryResult result = metricsClient.queryResource(280 "{resource-uri}",281 Arrays.asList("SuccessfulCalls", "TotalCalls")282);283284for (MetricResult metric : result.getMetrics()) {285 System.out.println("Metric: " + metric.getMetricName());286 for (TimeSeriesElement ts : metric.getTimeSeries()) {287 System.out.println(" Dimensions: " + ts.getMetadata());288 for (MetricValue value : ts.getValues()) {289 System.out.println(" " + value.getTimeStamp() + ": " + value.getTotal());290 }291 }292}293```294295### Metrics with Aggregations296297```java298import com.azure.monitor.query.models.MetricsQueryOptions;299import com.azure.monitor.query.models.AggregationType;300301Response<MetricsQueryResult> response = metricsClient.queryResourceWithResponse(302 "{resource-id}",303 Arrays.asList("SuccessfulCalls", "TotalCalls"),304 new MetricsQueryOptions()305 .setGranularity(Duration.ofHours(1))306 .setAggregations(Arrays.asList(AggregationType.AVERAGE, AggregationType.COUNT)),307 Context.NONE308);309310MetricsQueryResult result = response.getValue();311```312313### Query Multiple Resources (MetricsClient)314315```java316import com.azure.monitor.query.MetricsClient;317import com.azure.monitor.query.MetricsClientBuilder;318import com.azure.monitor.query.models.MetricsQueryResourcesResult;319320MetricsClient metricsClient = new MetricsClientBuilder()321 .credential(new DefaultAzureCredentialBuilder().build())322 .endpoint("{endpoint}")323 .buildClient();324325MetricsQueryResourcesResult result = metricsClient.queryResources(326 Arrays.asList("{resourceId1}", "{resourceId2}"),327 Arrays.asList("{metric1}", "{metric2}"),328 "{metricNamespace}"329);330331for (MetricsQueryResult queryResult : result.getMetricsQueryResults()) {332 for (MetricResult metric : queryResult.getMetrics()) {333 System.out.println(metric.getMetricName());334 metric.getTimeSeries().stream()335 .flatMap(ts -> ts.getValues().stream())336 .forEach(mv -> System.out.println(337 mv.getTimeStamp() + " Count=" + mv.getCount() + " Avg=" + mv.getAverage()));338 }339}340```341342## Response Structure343344### Logs Response Hierarchy345346```347LogsQueryResult348├── statistics (BinaryData)349├── visualization (BinaryData)350├── error351└── tables (List<LogsTable>)352 ├── name353 ├── columns (List<LogsTableColumn>)354 │ ├── name355 │ └── type356 └── rows (List<LogsTableRow>)357 ├── rowIndex358 └── rowCells (List<LogsTableCell>)359```360361### Metrics Response Hierarchy362363```364MetricsQueryResult365├── granularity366├── timeInterval367├── namespace368├── resourceRegion369└── metrics (List<MetricResult>)370 ├── id, name, type, unit371 └── timeSeries (List<TimeSeriesElement>)372 ├── metadata (dimensions)373 └── values (List<MetricValue>)374 ├── timeStamp375 ├── count, average, total376 ├── maximum, minimum377```378379## Error Handling380381```java382import com.azure.core.exception.HttpResponseException;383import com.azure.monitor.query.models.LogsQueryResultStatus;384385try {386 LogsQueryResult result = logsClient.queryWorkspace(workspaceId, query, timeInterval);387388 // Check partial failure389 if (result.getStatus() == LogsQueryResultStatus.PARTIAL_FAILURE) {390 System.err.println("Partial failure: " + result.getError().getMessage());391 }392} catch (HttpResponseException e) {393 System.err.println("Query failed: " + e.getMessage());394 System.err.println("Status: " + e.getResponse().getStatusCode());395}396```397398## Best Practices3994001. **Use batch queries** — Combine multiple queries into a single request4012. **Set appropriate timeouts** — Long queries may need extended server timeout4023. **Limit result size** — Use `top` or `take` in Kusto queries4034. **Use projections** — Select only needed columns with `project`4045. **Check query status** — Handle PARTIAL_FAILURE results gracefully4056. **Cache results** — Metrics don't change frequently; cache when appropriate4067. **Migrate to new packages** — Plan migration to `azure-monitor-query-logs` and `azure-monitor-query-metrics`407408## Reference Links409410| Resource | URL |411|----------|-----|412| Maven Package | https://central.sonatype.com/artifact/com.azure/azure-monitor-query |413| GitHub | https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/monitor/azure-monitor-query |414| API Reference | https://learn.microsoft.com/java/api/com.azure.monitor.query |415| Kusto Query Language | https://learn.microsoft.com/azure/data-explorer/kusto/query/ |416| Log Analytics Limits | https://learn.microsoft.com/azure/azure-monitor/service-limits#la-query-api |417| Troubleshooting | https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/monitor/azure-monitor-query/TROUBLESHOOTING.md |418
Full transparency — inspect the skill content before installing.