在Azure上建立虛擬機(VM)後,在門戶上能夠查看監控指標(Metrics),如CPU Usage,Memory,Disk I/O等。那如何經過Java 代碼獲取到這些指標呢?java
關於VM 的內存使用率,虛擬機自己並無提供這個指標,須要開啓診斷後去Azure Storage表中獲取,字段爲\Memory\% Committed Bytes In Use,是開啓了診斷日誌存儲到WADMetrics 表中git
Azure中門戶上看見的內容都是經過REST API來獲取值,基於此原理,能夠經過在門戶中Metrics頁面中,點看CPU的指標數據後,經過F12(開發者工具),查看具體使用的是什麼API, 並參考一樣的方式在Java 代碼中調用該類接口來完成。github
一般狀況,是能夠在Azure Monitor官網中(https://docs.microsoft.com/zh-cn/rest/api/monitor/)找到須要的REST API接口。如:json
Metrics - List
列出資源的指標值。api
GET https://management.azure.com/{resourceUri}/providers/microsoft.insights/metrics?api-version=2018-01-01
GET https://management.azure.com/{resourceUri}/providers/microsoft.insights/metrics?timespan={timespan}&interval={interval}&metricnames={metricnames}&aggregation={aggregation}&top={top}&orderby={orderby}&$filter={$filter}&resultType={resultType}&api-version=2018-01-01&metricnamespace={metricnamespace}
上文截圖中調用經過API獲取到的Metrics的URL參數值爲:"/subscriptions/<subscriptionid>/resourceGroups/<resource group>/providers/Microsoft.Compute/virtualMachines/<vm name>/providers/microsoft.Insights/metrics?
timespan=2020-11-24T22:03:01.141Z/2020-11-27T04:55:40.325Z
&interval=PT30M
&metricnames=Percentage CPU
&aggregation=average
&metricNamespace=microsoft.compute%2Fvirtualmachines
&autoadjusttimegrain=true
&validatedimensions=false
&api-version=2019-07-01"參數的詳細說明:ide
Name In Required Type Description resourceUripath True
- string
資源的標識符。工具
api-versionquery True
- string
客戶端 Api 版本。oop
$filterquery
- string
$filter用於減小返回的指標數據集。
示例:
指標包含元數據 A、B 和 C。
- 返回全部時間序列 C,其中 A = a1 和 B = b1 或 b2
$filter_eq 'a1' 和 B eq 'b1' 或 B eq 'b2' 和 C eq '#'
- 無效變體:
$filter=eq 'a1'和 B eq 'b1' 和 C eq '*' 或 B = 'b2'
這是無效的,由於邏輯或運算符不能分隔兩個不一樣的元數據名稱。
- 返回全部時間序列,其中 A = a1,B = b1 和 C = c1:
$filter=eq 'a1'和 B eq 'b1' 和 C eq 'c1'
- 返回全部時間序列,其中 A = a1
$filter_aq 'a1' 和 B eq '和 C eq''.ui aggregationquery
- string
要檢索的聚合類型(逗號分隔)的列表。spa
intervalquery duration
- string
查詢的間隔(即時粒)。
metricnamesquery
- string
要檢索的指標(逗號分隔)的名稱。
metricnamespacequery
- string
用於查詢指標定義的指標命名空間。
orderbyquery
- string
用於對結果進行排序的聚合和排序方向。 只能指定一個訂單。 示例:總和 asc。
resultTypequery 減小收集的數據集。 容許的語法取決於操做。 有關詳細信息,請參閱操做說明。
timespanquery
- string
查詢的時間跨度。 它是具備如下格式"startDateTime_ISO/endDateTime_ISO"的字符串。
topquery int32
- integer
要檢索的最大記錄數。 僅在指定$filter時有效。 默認值爲 10。
全文內容:https://docs.microsoft.com/zh-cn/rest/api/monitor/metrics/list
開啓虛擬機的診斷日誌,讓Azure VM把監控數據發送到Storage Table中,經過Storage SDK直接獲取Table中的數據。
開啓診斷日誌
獲取Storage Table中數據的Java代碼
若要對錶查詢分區中的實體,可使用
TableQuery
。 調用TableQuery.from
可建立針對特定表的查詢,該查詢將返回指定的結果類型。 如下代碼指定了一個篩選器,用於篩選其中的分區鍵是「Smith」的實體。TableQuery.generateFilterCondition
是用於建立查詢篩選器的幫助程序方法。 對TableQuery.from
方法返回的引用調用where
,以對查詢應用篩選器。 當經過調用CloudTable
對象上的execute
來執行查詢時,該查詢將返回指定了CustomerEntity
結果類型的Iterator
。 而後,能夠利用在「ForEach」循環中返回的Iterator
來使用結果。 此代碼會將查詢結果中每一個實體的字段打印到控制檯。try { // Define constants for filters. final String PARTITION_KEY = "PartitionKey"; final String ROW_KEY = "RowKey"; final String TIMESTAMP = "Timestamp"; // Retrieve storage account from connection-string. CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString); // Create the table client. CloudTableClient tableClient = storageAccount.createCloudTableClient(); // Create a cloud table object for the table. CloudTable cloudTable = tableClient.getTableReference("people"); // Create a filter condition where the partition key is "Smith". String partitionFilter = TableQuery.generateFilterCondition( PARTITION_KEY, QueryComparisons.EQUAL, "Smith"); // Specify a partition query, using "Smith" as the partition key filter. TableQuery<CustomerEntity> partitionQuery = TableQuery.from(CustomerEntity.class) .where(partitionFilter); // Loop through the results, displaying information about the entity. for (CustomerEntity entity : cloudTable.execute(partitionQuery)) { System.out.println(entity.getPartitionKey() + " " + entity.getRowKey() + "\t" + entity.getEmail() + "\t" + entity.getPhoneNumber()); } } catch (Exception e) { // Output the stack trace. e.printStackTrace(); }
REST API 引用 Azure Monitor: https://docs.microsoft.com/zh-cn/rest/api/monitor/
如何經過 Java 使用 Azure 表存儲或 Azure Cosmos DB 表 API: https://docs.azure.cn/zh-cn/cosmos-db/table-storage-how-to-use-java?toc=https%3A%2F%2Fdocs.azure.cn%2Fzh-cn%2Fstorage%2Ftables%2Ftoc.json&bc=https%3A%2F%2Fdocs.azure.cn%2Fzh-cn%2Fbread%2Ftoc.json
附錄一:查看Azure REST API的方法:
附錄二:使用Java SDK直接獲取VM對象和VM對象中Mertics的代碼:https://github.com/Azure/azure-libraries-for-java/blob/master/azure-mgmt-monitor/src/test/java/com/microsoft/azure/management/monitor/MonitorActivityAndMetricsTests.java
/** * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for * license information. */ package com.microsoft.azure.management.monitor; import com.microsoft.azure.PagedList; import com.microsoft.azure.management.compute.VirtualMachine; import com.microsoft.azure.management.resources.fluentcore.utils.SdkContext; import org.joda.time.DateTime; import org.junit.Assert; import org.junit.Test; import java.util.List; public class MonitorActivityAndMetricsTests extends MonitorManagementTest { @Test public void canListEventsAndMetrics() throws Exception { DateTime recordDateTime = SdkContext.dateTimeNow().minusDays(40); VirtualMachine vm = computeManager.virtualMachines().list().get(0); // Metric Definition List<MetricDefinition> mt = monitorManager.metricDefinitions().listByResource(vm.id()); Assert.assertNotNull(mt); MetricDefinition mDef = mt.get(0); Assert.assertNotNull(mDef.metricAvailabilities()); Assert.assertNotNull(mDef.namespace()); Assert.assertNotNull(mDef.supportedAggregationTypes()); // Metric MetricCollection metrics = mDef.defineQuery() .startingFrom(recordDateTime.minusDays(30)) .endsBefore(recordDateTime) .withResultType(ResultType.DATA) .execute(); Assert.assertNotNull(metrics); Assert.assertNotNull(metrics.namespace()); Assert.assertNotNull(metrics.resourceRegion()); Assert.assertEquals("Microsoft.Compute/virtualMachines", metrics.namespace());