Export your cloud monitoring metrics in real time through the Cursor and BatchExport API operations.
Prerequisites
Hybrid Cloud Monitoring is activated. Activate Hybrid Cloud Monitoring.
Background information
Activating Hybrid Cloud Monitoring is free. You are billed based on usage. Real-time data export.
Procedure
-
Call the DescribeMetricMetaList operation to retrieve the metric list for each Alibaba Cloud service.
For parameter details, see DescribeMetricMetaList.
NoteThe
Namespace,MetricName,Dimensions,Period, andStatisticsvalues for each service are listed in Alibaba Cloud service metrics.-
Add the Cloud Monitor SDK dependency by using Maven.
<dependency> <groupId>com.aliyun</groupId> <artifactId>cms20190101</artifactId> <version><LATEST_SDK_VERSION></version> </dependency> -
Call the DescribeMetricMetaList operation to retrieve the metric list for each Alibaba Cloud service.
Sample SDK request:
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); }
-
-
Retrieve metrics.
-
Add the SDK dependency to your pom.xml file.
<dependency> <groupId>com.aliyun</groupId> <artifactId>cms20190101</artifactId> <version><LATEST_SDK_VERSION></version> </dependency> -
Call the Cursor operation to define the data export scope. This operation returns a cursor required for the initial BatchExport call.
For parameter details, see Cursor.
The Cursor and BatchExport operations are available in all regions. Endpoints.
Sample SDK request:
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(); }Sample SDK response:
eyJidWNrZXRzIjo0LCJlbmRUaW1lIjo5MjIzMzcyMDM2ODU0Nzc1ODA3LCJleHBvcnRFbmRUaW1lIjo5MjIzMzcyMDM2ODU0Nzc1ODA3LCJleHByZXNzUmFuZ2UiOmZhbHNlLCJoYXNOZXh0Ijp0cnVlLCJsaW1pdCI6NTAwMCwibG9nVGltZU1vZGUiOnRydWUsIm1hdGNoZXJzIjp7ImNoYWluIjpbeyJsYWJlbCI6InVzZXJJZCIsIm9wZXJhdG9yIjoiRVFVQUxTIiwidmFsdWUiOiIxNzM2NTExMTM0Mzg5MTEwIn0seyJsYWJlbCI6InRhc2tJZCIsIm9wZXJhdG9yIjoiRVFVQUxTIiwidmFsdWUiOiIqIn1dfSwibWV0cmljIjoiQXZhaWxhYmlsaXR5X29yaWdpbmFsIiwibWV0cmljVHlwZSI6Ik1FVFJJQyIsIm5hbWVzcGFjZSI6ImFjc19uZXR3b3JrbW9uaXRvciIsIm5leHRQa0FkYXB0ZXIiOnt9LCJvZmZzZXQiOjAsInN0YXJ0VGltZSI6MTYzODQwNTA1MDcxNywic3RlcCI6LTEsInRpbWVvdXQiOjEyMCwid2luZG93Ijo2**** -
Call the BatchExport operation to export the monitoring data defined by the Cursor operation.
For parameter details, see BatchExport.
Sample SDK request:
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; } }Sample SDK response:
{ "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 }
-
Examples
-
Example 1: Continuously export monitoring data for the
Availabilitymetric in theacs_networkmonitornamespace of site monitoring.-
Retrieve a 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(String namespace, String metric, int period, long startTime, long endTime, List<Matcher> matchers) throws Exception { Client client = new Client(getConfig(config)); CursorRequest cursorRequest = new CursorRequest(); cursorRequest.setNamespace(namespace); cursorRequest.setMetric(metric); cursorRequest.setPeriod(period); cursorRequest.setStartTime(startTime); cursorRequest.setEndTime(endTime); cursorRequest.setMatchers(matchers); CursorResponse cursorResponse = client.cursor(cursorRequest); if (cursorResponse == null || cursorResponse.getBody() == null || cursorResponse.getBody().getCursor() == null) { return null; } return cursorResponse.getBody().getCursor(); } // ... } -
Export the monitoring data.
public class GetDataUtil { // ... private static String BatchExport(String cursor, String namespace, String metric, int length) throws Exception { Client client = new Client(getConfig(config)); BatchExportRequest request = new BatchExportRequest(); request.setNamespace(namespace); request.setMetric(metric); request.setCursor(cursor); request.setLength(length); BatchExportResponse response = client.batchExport(request); if (response == null || response.getBody() == null) { return null; }else { String json = JSON.toJSONString(response.getBody()); return json; } } } -
Continuously export monitoring data for the
Availabilitymetric.The following example uses a 3-second timer:
public class Demo1 { private String cursor; @Scheduled(cron = "*/3 * * * * ?") public void getCpuData() throws Exception { System.out.println("Start retrieving data."); 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("Finished retrieving data."); } }
-
-
Example 2: Continuously export monitoring data for the
AvailabilityandAvailability_newmetrics in theacs_networkmonitornamespace of site monitoring.-
Retrieve a 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(String namespace, String metric, int period, long startTime, long endTime, List<Matcher> matchers) throws Exception { Client client = new Client(getConfig(config)); CursorRequest cursorRequest = new CursorRequest(); cursorRequest.setNamespace(namespace); cursorRequest.setMetric(metric); cursorRequest.setPeriod(period); cursorRequest.setStartTime(startTime); cursorRequest.setEndTime(endTime); cursorRequest.setMatchers(matchers); CursorResponse cursorResponse = client.cursor(cursorRequest); if (cursorResponse == null || cursorResponse.getBody() == null || cursorResponse.getBody().getCursor() == null) { return null; } return cursorResponse.getBody().getCursor(); } // ... } -
Export the monitoring data.
public class GetDataUtil { // ... private static String BatchExport(String cursor, String namespace, String metric, int length) throws Exception { Client client = new Client(getConfig(config)); BatchExportRequest request = new BatchExportRequest(); request.setNamespace(namespace); request.setMetric(metric); request.setCursor(cursor); request.setLength(length); BatchExportResponse response = client.batchExport(request); if (response == null || response.getBody() == null) { return null; }else { String json = JSON.toJSONString(response.getBody()); return json; } } } -
Continuously export monitoring data for the
AvailabilityandAvailability_newmetrics.The following example uses a 3-second timer:
public class Demo2 { private String availabilityCursor; private String availability_newCursor; @Scheduled(cron = "*/3 * * * * ?") public void getCpuData() throws Exception { System.out.println("Start retrieving data."); 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("Finished retrieving data."); } }
-