全部產品
Search
文件中心

CloudMonitor:即時匯出監控資料

更新時間:Jun 19, 2024

當您需要匯出雲上監控資料時,可以使用CloudMonitor提供的即時資料匯出功能。

前提條件

請確保您已開通企業CloudMonitor。具體操作,請參見開通企業CloudMonitor

背景資訊

開通企業CloudMonitor不會產生任何費用,後續將按照實際使用量進行計費。關於即時資料匯出的計費標準,請參見即時資料匯出

操作步驟

  1. 調用DescribeMetricMetaList介面擷取各雲產品的監控指標列表。

    關於DescribeMetricMetaList介面中各參數的設定方法,請參見DescribeMetricMetaList

    說明

    您可以從雲產品監控項中擷取各雲產品監控指標的NamespaceMetricNameDimensionsPeriodStatistics

    1. 通過Maven引入CloudMonitor的SDK。

      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>cms20190101</artifactId>
        <version><SDK包的最新版本></version>
      </dependency>
    2. 調用DescribeMetricMetaList介面擷取各雲產品的監控指標列表。

      SDK請求樣本如下:

      private static Client getClient() throws Exception {
          Config config = new Config()
          config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        	config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
          config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
          return new Client(config);
      }
      public static void main(String[] args) throws Exception {
          Client client = getClient();
          DescribeMetricMetaListRequest describeMetricMetaListRequest = new DescribeMetricMetaListRequest();
          describeMetricMetaListRequest.setNamespace("acs_ecs_dashboard");
          DescribeMetricMetaListResponse describeMetricMetaListResponse = client.describeMetricMetaList(describeMetricMetaListRequest);
          String json = JSON.toJSONString(describeMetricMetaListResponse.getBody());
          System.out.println(json);
      }
  2. 擷取監控指標。

    1. 通過Pom引入CloudMonitor擷取監控資料的SDK。

      <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>cms20190101</artifactId>
          <version><SDK包的最新版本></version>
      </dependency>
    2. 調用Cursor介面定義匯出監控資料的範圍,並返回用於初始調用BatchExport介面的Cursor值。

      關於Cursor介面中各參數的設定方法,請參見Cursor

      Cursor和BatchExpor支援所有地區,請參見服務存取點

      SDK請求樣本如下:

      private static Config config = null;
      private static Config getConfig(Config config){
        config = new Config();
        config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.setEndpoint("metrics.cn-hangzhou.aliyuncs.com");
        return config;
      }
      private static String getCursor() throws Exception {
          Client client = new Client(getConfig(config));
          CursorRequest cursorRequest = new CursorRequest();
          cursorRequest.setNamespace("acs_ecs_dashboard");
          cursorRequest.setMetric("CPUUtilization");
          cursorRequest.setPeriod(60);
          cursorRequest.setStartTime(System.currentTimeMillis() - 60 * 60 * 1000);
          cursorRequest.setEndTime(Long.MAX_VALUE);
        	List<Matcher> matchers = new ArrayList<>();
        	Matcher matcher = new Matcher();
        	matcher.setLabel("userId");
          matcher.setValue("173651113438****");
        	matcher.setOperator("EQUALS");
        	matchers.add(matcher);
          cursorRequest.setMatchers(matchers);
          CursorResponse cursorResponse = client.cursor(cursorRequest);
          if (cursorResponse == null || cursorResponse.getBody() == null || cursorResponse.getBody().getCursor() == null) {
            return null;
          }
          return cursorResponse.getBody().getCursor();
      }

      SDK返回結果如下:

      eyJidWNrZXRzIjo0LCJlbmRUaW1lIjo5MjIzMzcyMDM2ODU0Nzc1ODA3LCJleHBvcnRFbmRUaW1lIjo5MjIzMzcyMDM2ODU0Nzc1ODA3LCJleHByZXNzUmFuZ2UiOmZhbHNlLCJoYXNOZXh0Ijp0cnVlLCJsaW1pdCI6NTAwMCwibG9nVGltZU1vZGUiOnRydWUsIm1hdGNoZXJzIjp7ImNoYWluIjpbeyJsYWJlbCI6InVzZXJJZCIsIm9wZXJhdG9yIjoiRVFVQUxTIiwidmFsdWUiOiIxNzM2NTExMTM0Mzg5MTEwIn0seyJsYWJlbCI6InRhc2tJZCIsIm9wZXJhdG9yIjoiRVFVQUxTIiwidmFsdWUiOiIqIn1dfSwibWV0cmljIjoiQXZhaWxhYmlsaXR5X29yaWdpbmFsIiwibWV0cmljVHlwZSI6Ik1FVFJJQyIsIm5hbWVzcGFjZSI6ImFjc19uZXR3b3JrbW9uaXRvciIsIm5leHRQa0FkYXB0ZXIiOnt9LCJvZmZzZXQiOjAsInN0YXJ0VGltZSI6MTYzODQwNTA1MDcxNywic3RlcCI6LTEsInRpbWVvdXQiOjEyMCwid2luZG93Ijo2****
    3. 調用BatchExport介面匯出在Cursor介面中定義的監控資料。

      關於BatchExport介面中各參數的設定方法,請參見BatchExport

      SDK請求樣本如下:

      private static String BatchExport(String cursor) throws Exception {
          Client client = new Client(getConfig(config));
          BatchExportRequest request = new BatchExportRequest();
          request.setNamespace("acs_ecs_dashboard");
          request.setMetric("CPUUtilization");
          request.setCursor(cursor);
          request.setLength(1000);
          BatchExportResponse response = client.batchExport(request);
          if (response == null || response.getBody() == null) {
            return null;
          }else {
            String json = JSON.toJSONString(response.getBody());
            return json;
          }
      }

      SDK返回結果如下:

      {
          "anchor":"168801465****",
          "code":200,
          "cursor":"eyJidWNrZXdWNrZXRCeXRlcyI6IndBPT0iLCJidWNrZXRzIjo0LCJjdXJyZW50QnVja2V0IjotNjQsImN1cnJlbnRUYXJnZXRUaW1lU2xvdCI6MTY4Nzk5NjgwMCwiZW5kVGltZSI6MTY4ODAxNDgwMDAwMCwiZXhwb3J0RW5kVGltZSI6MTY4ODAxODMxNTU0NywiZXhwb3J0U3RhcnRUaW1lIjoxNjg4MDE0NjU1NTQ3LCJleHByZXNzUmFuZ2UiOmZhbHNlLCJoYXNOZXh0Ijp0cnVlLCJpbmRleCI6MCwibGF0ZXN0TG9nVGltZSI6MCwibWF0Y2hlcnMiOnsiY2hhaW4iOlt7ImxhYmVsIjoidXNlcklkIiwib3BlcmF0b3IiOiJFUVVBTFMiLCJ2YWx1ZSI6IjE3MzY1MTExMzQzODkxMTAifV0sImxvY2tlZCI6dHJ1ZX0sIm1ldHJpYyI6IlNwbGl0cndQcm94eU1heFJlc3BvbnNlU2l6ZSIsIm1ldHJpY1R5cGUiOiJNRVRSSUMiLCJuYW1lc3BhY2UiOiJhY3Nfa3ZzdG9yZV9leCIsIm5leHRQa0FkYXB0ZXIiOnt9LCJvY2MiOlstNjU2MDE3MDUyMjc3MzE4NjY0LDE2ODgwMTgyNTk4MTNdLCJvZmZzZXQiOjEsIm9mZnNldERpZ2l0Ijo1NjgyMjY5NDU3MTc0NTM5ODk1LCJzdGFydFRpbWUiOjE2ODgwMTQ2NTU1NDcsInN0ZXAiOi0xLCJ0YWdNYXRjaGVycyI6eyJjaGFpbiI6W10sImxvY2tlZCI6dHJ1ZX0sInRhcmdldFRpbWVTbG90cyI6WzE2ODc5MTA0MDAsMTY4Nzk5NjgwMF0sInV1aWQiOiJjYjQzNjBjNS00NjY4LTQxZDQtYmRjYi0zMGNhY2M2NDBhNmQiLCJ2Y2MiOlsxMDc3NTkwNTEzMzk4NzczMzk3LDE2ODgwMTgyNTMz****",
          "dataResults":[ 
              {
                  "associated":{
      
                  },
                  "dimensions":[
                      {
                          "label":"userId",
                          "value":"173651113438****"
                      },
                      {
                          "label":"instanceId",
                          "value":"r-bp12meeb25mb7d****"
                      },
                      {
                          "label":"nodeId",
                          "value":"r-bp12meeb25mb7d****-proxy-3"
                      }
                  ],
                  "measurements":{
                      "Maximum":565.916,
                      "Average":565.916
                  },
                  "metric":"SplitrwProxyMaxResponseSize",
                  "namespace":"acs_kvstore",
                  "period":60,
                  "timestamp":1688014560000
              }
          ],
          "hasNext":true,
          "length":1, 
          "message":"success",  
          "requestId":"8D26C6ED-991C-533E-B601-B020EDF7****",
          "success":true
      }

即時匯出監控資料樣本

  • 樣本1:連續匯出CloudMonitor中網站監控acs_networkmonitor的監控指標Availability的監控資料。

    1. 擷取Cursor。

      public class GetDataUtil {
          private static Config config = null;
      		private static Config getConfig(Config config){
        	config = new Config();
        	config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        	config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        	config.setEndpoint("metrics.cn-hangzhou.aliyuncs.com");
        	return config;
      	}
      	private static String getCursor() throws Exception {
      		Client client = new Client(getConfig(config));
       	  CursorRequest cursorRequest = new CursorRequest();
       	  cursorRequest.setNamespace("acs_ecs_dashboard");
          cursorRequest.setMetric("CPUUtilization");
          cursorRequest.setPeriod(60);
          cursorRequest.setStartTime(System.currentTimeMillis() - 60 * 60 * 1000);
          cursorRequest.setEndTime(Long.MAX_VALUE);
        	List<Matcher> matchers = new ArrayList<>();
        	Matcher matcher = new Matcher();
        	matcher.setLabel("userId");
          matcher.setValue("173651113438****");
        	matcher.setOperator("EQUALS");
        	matchers.add(matcher);
          cursorRequest.setMatchers(matchers);
          CursorResponse cursorResponse = client.cursor(cursorRequest);
          if (cursorResponse == null || cursorResponse.getBody() == null || cursorResponse.getBody().getCursor() == null) {
            return null;
          }
          return cursorResponse.getBody().getCursor();
      	}
      
          // ...
      }
    2. 匯出監控資料。

      public class GetDataUtil {
          // ...
      
          private static String BatchExport(String cursor) throws Exception {
          	Client client = new Client(getConfig(config));
          	BatchExportRequest request = new BatchExportRequest();
          	request.setNamespace("acs_ecs_dashboard");
          	request.setMetric("CPUUtilization");
          	request.setCursor(cursor);
          	request.setLength(1000);
          	BatchExportResponse response = client.batchExport(request);
          	if (response == null || response.getBody() == null) {
            	return null;
          	}else {
            	String json = JSON.toJSONString(response.getBody());
            	return json;
          	}
      	}
      }
    3. 連續匯出監控指標Availability的監控資料。

      例如:設定定時器為3秒,即每3秒匯出一次監控資料。

      public class Demo1 {
          private String cursor;
          @Scheduled(cron = "*/3 * * * * ?")
          public void getCpuData() throws Exception {
              System.out.println("開始擷取資料。");
              if(cursor == null){
                  Matcher matcher = new Matcher();
                  matcher.setLabel("userId").setOperator("EQUALS").setValue("173651113438****");
                  List<Matcher> chain  = new ArrayList<>();
                  chain.add(matcher);
                  cursor = GetDataUtil.getCursor("acs_networkmonitor","Availability",60,System.currentTimeMillis() - 60 * 60 * 1000,Long.MAX_VALUE,chain);
              }
              String sth = GetDataUtil.BatchExport(cursor,"acs_networkmonitor","Availability",10);
              JSONObject jsonObject = JSONObject.parseObject(sth);
              if(!StringUtils.isEmpty(jsonObject.getString("cursor"))){
                  cursor = jsonObject.getString("cursor");
              }
              System.out.println("結束擷取資料。");
          }
      }
  • 樣本2:連續匯出CloudMonitor中網站監控acs_networkmonitor的監控指標AvailabilityAvailability_new的監控資料。

    1. 擷取Cursor。

      public class GetDataUtil {
          private static Config config = null;
      		private static Config getConfig(Config config){
        	config = new Config();
        	config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        	config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        	config.setEndpoint("metrics.cn-hangzhou.aliyuncs.com");
        	return config;
      	}
      	private static String getCursor() throws Exception {
      		Client client = new Client(getConfig(config));
       	  CursorRequest cursorRequest = new CursorRequest();
       	  cursorRequest.setNamespace("acs_ecs_dashboard");
          cursorRequest.setMetric("CPUUtilization");
          cursorRequest.setPeriod(60);
          cursorRequest.setStartTime(System.currentTimeMillis() - 60 * 60 * 1000);
          cursorRequest.setEndTime(Long.MAX_VALUE);
        	List<Matcher> matchers = new ArrayList<>();
        	Matcher matcher = new Matcher();
        	matcher.setLabel("userId");
          matcher.setValue("173651113438****");
        	matcher.setOperator("EQUALS");
        	matchers.add(matcher);
          cursorRequest.setMatchers(matchers);
          CursorResponse cursorResponse = client.cursor(cursorRequest);
          if (cursorResponse == null || cursorResponse.getBody() == null || cursorResponse.getBody().getCursor() == null) {
            return null;
          }
          return cursorResponse.getBody().getCursor();
      	}
      
          // ...
      }
    2. 匯出監控資料。

      public class GetDataUtil {
          // ...
      
          private static String BatchExport(String cursor) throws Exception {
          	Client client = new Client(getConfig(config));
          	BatchExportRequest request = new BatchExportRequest();
          	request.setNamespace("acs_ecs_dashboard");
          	request.setMetric("CPUUtilization");
          	request.setCursor(cursor);
          	request.setLength(1000);
          	BatchExportResponse response = client.batchExport(request);
          	if (response == null || response.getBody() == null) {
            	return null;
          	}else {
            	String json = JSON.toJSONString(response.getBody());
            	return json;
          	}
      	}
      }

    3. 連續匯出監控指標AvailabilityAvailability_new的監控資料。

      例如:設定定時器為3秒,即每3秒匯出一次監控資料。

      public class Demo2 {
          private String availabilityCursor;
          private String availability_newCursor;
          @Scheduled(cron = "*/3 * * * * ?")
          public void getCpuData() throws Exception {
              System.out.println("開始擷取資料。");
              if(availabilityCursor == null){
                  Matcher matcher = new Matcher();
                  matcher.setLabel("userId").setOperator("EQUALS").setValue("173651113438****");
                  List<Matcher> chain  = new ArrayList<>();
                  chain.add(matcher);
                  availabilityCursor = GetDataUtil.getCursor("acs_networkmonitor","Availability",60,System.currentTimeMillis() - 60 * 60 * 1000,Long.MAX_VALUE,chain);
              }
              if(availability_newCursor == null){
                  Matcher matcher = new Matcher();
      						matcher.setLabel("userId").setOperator("EQUALS").setValue("173651113438****");
                  List<Matcher> chain  = new ArrayList<>();
                  chain.add(matcher);
                  availability_newCursor = GetDataUtil.getCursor("acs_networkmonitor","Availability_new",60,System.currentTimeMillis() - 60 * 60 * 1000,Long.MAX_VALUE,chain);
              }
              String sth1 = GetDataUtil.BatchExport(availabilityCursor,"acs_networkmonitor","Availability",10);
              String sth2 = GetDataUtil.BatchExport(availability_newCursor,"acs_networkmonitor","Availability_new",10);
              JSONObject jsonObject1 = JSONObject.parseObject(sth1);
              if(!StringUtils.isEmpty(jsonObject1.getString("cursor"))){
                  availabilityCursor = jsonObject1.getString("cursor");
              }
              System.out.println("availability");
              System.out.println(sth1);
              JSONObject jsonObject2 = JSONObject.parseObject(sth2);
              if(!StringUtils.isEmpty(jsonObject2.getString("cursor"))){
                  availability_newCursor = jsonObject2.getString("cursor");
              }
              System.out.println("availability_new");
              System.out.println(sth2);
              System.out.println("結束擷取資料。");
          }
      }