实时导出监控数据

当您需要导出云上监控数据时,可以使用云监控提供的实时数据导出功能。

前提条件

请确保您已开通企业云监控。具体操作,请参见开通企业云监控

背景信息

开通企业云监控不会产生任何费用,后续将按照实际使用量进行计费。关于实时数据导出的计费标准,请参见实时数据导出

操作步骤

  1. 调用DescribeMetricMetaList接口获取各云产品的监控指标列表。

    关于DescribeMetricMetaList接口中各参数的设置方法,请参见DescribeMetricMetaList

    说明

    您可以从云产品监控项中获取各云产品监控指标的NamespaceMetricNameDimensionsPeriodStatistics

    1. 通过Maven引入云监控的SDK。

      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>cms20190101</artifactId>
        <version><SDK包的最新版本></version>
      </dependency>

      请您获取云监控SDK包的最新版本,具体操作如下:

      1. 单击DescribeMetricMetaList接口。

      2. OpenAPI页面的SDK示例页签,将鼠标移至SDK信息

        SDK信息对话框,您可以查看SDK包名称和SDK最新版本。SDK_2019

    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引入云监控获取监控数据的SDK。

      <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>cms20190101</artifactId>
          <version><SDK包的最新版本></version>
      </dependency>

      请您获取云监控SDK包的最新版本,具体操作如下:

      1. 单击Cursor接口。

      2. OpenAPI页面的SDK示例页签,将鼠标移至SDK信息

        SDK信息对话框,您可以查看SDK包名称和SDK最新版本。SDK包

    2. 调用Cursor接口定义导出监控数据的范围,并返回用于初始调用BatchExport接口的Cursor值。

      关于Cursor接口中各参数的设置方法,请参见Cursor

      Cursor和BatchExport支持所有地域,请参见服务接入点

      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:连续导出云监控中站点监控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:连续导出云监控中站点监控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("结束获取数据。");
          }
      }