• 【Azure Developer】通过Azure提供的Azue Java JDK 查询虚拟机的CPU使用率和内存使用率


    问题描述

    在Azure上创建虚拟机(VM)后,在门户上可以查看监控指标(Metrics),如CPU Usage,Memory,Disk I/O等。那如何通过Java 代码获取到这些指标呢?

    关于VM 的内存使用率,虚拟机本身并没有提供这个指标,需要开启诊断后去Azure Storage表中获取,字段为Memory\% Committed Bytes In Use是开启了诊断日志存储到WADMetrics

    解决办法

    方式一:使用REST API

    Azure中门户上看见的内容都是通过REST API来获取值,基于此原理,可以通过在门户中Metrics页面中,点看CPU的指标数据后,通过F12(开发者工具),查看具体使用的是什么API, 并参考同样的方式在Java 代码中调用该类接口来完成。

    通常情况,是可以在Azure Monitor官网中(https://docs.microsoft.com/zh-cn/rest/api/monitor/)找到需要的REST API接口。如:

    Metrics - List

    列出资源的指标值。

    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
    "

    参数的详细说明:

    NameInRequiredTypeDescription
    resourceUri
    path True
    • string

    资源的标识符。

    api-version
    query True
    • string

    客户端 Api 版本。

    $filter
    query  
    • string

    $filter用于减少返回的指标数据集。

    aggregation
    query  
    • string

    要检索的聚合类型(逗号分隔)的列表。

    interval
    query  
    • string
    duration

    查询的间隔(即时粒)。

    metricnames
    query  
    • string

    要检索的指标(逗号分隔)的名称。

    metricnamespace
    query  
    • string

    用于查询指标定义的指标命名空间。

    orderby
    query  
    • string

    用于对结果进行排序的聚合和排序方向。 只能指定一个订单。 示例:总和 asc。

    resultType
    query  

    减少收集的数据集。 允许的语法取决于操作。 有关详细信息,请参阅操作说明。

    timespan
    query  
    • string

    查询的时间跨度。 它是具有以下格式"startDateTime_ISO/endDateTime_ISO"的字符串。

    top
    query  
    • integer
    int32

    要检索的最大记录数。 仅在指定$filter时有效。 默认值为 10。


    全文内容:https://docs.microsoft.com/zh-cn/rest/api/monitor/metrics/list

    方式二:使用Azure VM诊断日志 ——> Storage Table——> Java Code (Storage SDK)

    开启虚拟机的诊断日志,让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() +
                "	" + entity.getEmail() +
                "	" + 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());
  • 相关阅读:
    POJ 1905 Expanding Rods 木棍膨胀
    [JSOI2007] 文本生成器
    18.09.22模拟赛T2 历史
    [USACO18OPEN] Talent Show
    [国家集训队] 整数的lqp拆分
    [HNOI2008] GT考试
    读入优化效果测试
    Trie图 模板
    manacher算法 详解+模板
    [洛谷P4299] 首都
  • 原文地址:https://www.cnblogs.com/lulight/p/14125211.html
Copyright © 2020-2023  润新知