Below are few code snippets for gathering Auto Scaling metrics from CloudWatch using the AWS Java Async Client (AmazonCloudWatchAsyncClient). Its very similar to the other code snippets I have shared. The only thing that took me almost a day to discover was the namespace which according to the documentation should be "AWS/AutoScaling" but what actually worked for me was "AWS/EC2"
:(
As always first create the client:
:(
As always first create the client:
AWSCredentials credentials = new BasicAWSCredentials(obj.getString("AWS_ACCESS_KEY"),obj.getString("AWS_SECRET_KEY")); ClientConfiguration config = new ClientConfiguration(); config.setMaxConnections(1); // This is done to create fixed number of connections per client AmazonCloudWatchAsyncClient client = new AmazonCloudWatchAsyncClient(credentials); client.setConfiguration(config);
Now a utility method to initialize the request object:
private static GetMetricStatisticsRequest initializeRequestObject(AmazonCloudWatchAsyncClient client,JSONObject groupDetails){ GetMetricStatisticsRequest request = new GetMetricStatisticsRequest(); request.setPeriod(60*5); // 5 minutes request.setNamespace("AWS/EC2"); List<Dimension> dims = new ArrayList<Dimension>(); Dimension dim = new Dimension(); dim.setName("AutoScalingGroupName"); dim.setValue(groupDetails.getString("NAME")); dims.add(dim); Date end = new Date(); request.setEndTime(end); // Back up 5 minutes Date beg = new Date(end.getTime() - 10*60*1000); request.setStartTime(beg); request.setDimensions(dims); return request; }
Lets gather some metrics now:
public static void get5MinCPUUtilization(AmazonCloudWatchAsyncClient client, final JSONObject groupDetails, final String clientName){ client.setEndpoint(groupDetails.getString("END_POINT")); GetMetricStatisticsRequest request = initializeRequestObject(client, groupDetails); request.setMetricName("CPUUtilization"); request.setUnit(StandardUnit.Percent); List<String> stats = new ArrayList<String>(); stats.add("Average"); stats.add("Maximum"); stats.add("Minimum"); request.setStatistics(stats); client.getMetricStatisticsAsync(request, new AsyncHandler<GetMetricStatisticsRequest, GetMetricStatisticsResult>() { @Override public void onSuccess(GetMetricStatisticsRequest arg0, GetMetricStatisticsResult arg1) { List<Datapoint> data = arg1.getDatapoints(); Double avg = data.size() > 0 ? data.get(0).getAverage() : 0.0; Double min = data.size() > 0 ? data.get(0).getMinimum() : 0.0; Double max = data.size() > 0 ? data.get(0).getMaximum() : 0.0; } @Override public void onError(Exception arg0) { } }); return; } public static void get5MinDiskReadOps(AmazonCloudWatchAsyncClient client, final JSONObject groupDetails, final String clientName){ client.setEndpoint(groupDetails.getString("END_POINT")); GetMetricStatisticsRequest request = initializeRequestObject(client, groupDetails); request.setMetricName("DiskReadOps"); request.setUnit(StandardUnit.Count); List<String> stats = new ArrayList<String>(); stats.add("Average"); stats.add("Maximum"); stats.add("Minimum"); request.setStatistics(stats); client.getMetricStatisticsAsync(request, new AsyncHandler<GetMetricStatisticsRequest, GetMetricStatisticsResult>() { @Override public void onSuccess(GetMetricStatisticsRequest arg0, GetMetricStatisticsResult arg1) { List<Datapoint> data = arg1.getDatapoints(); Double avg = data.size() > 0 ? data.get(0).getAverage() : 0.0; Double min = data.size() > 0 ? data.get(0).getMinimum() : 0.0; Double max = data.size() > 0 ? data.get(0).getMaximum() : 0.0; } @Override public void onError(Exception arg0) { } }); return; } public static void get5MinStatusCheckFailed(AmazonCloudWatchAsyncClient client, final JSONObject groupDetails, final String clientName){ client.setEndpoint(groupDetails.getString("END_POINT")); GetMetricStatisticsRequest request = initializeRequestObject(client, groupDetails); request.setMetricName("StatusCheckFailed"); request.setUnit(StandardUnit.Count); List<String> stats = new ArrayList<String>(); stats.add("Average"); stats.add("Maximum"); stats.add("Minimum"); request.setStatistics(stats); client.getMetricStatisticsAsync(request, new AsyncHandler<GetMetricStatisticsRequest, GetMetricStatisticsResult>() { @Override public void onSuccess(GetMetricStatisticsRequest arg0, GetMetricStatisticsResult arg1) { List<Datapoint> data = arg1.getDatapoints(); Double avg = data.size() > 0 ? data.get(0).getAverage() : 0.0; Double min = data.size() > 0 ? data.get(0).getMinimum() : 0.0; Double max = data.size() > 0 ? data.get(0).getMaximum() : 0.0; } @Override public void onError(Exception arg0) { } }); return; } public static void get5MinDiskWriteOps(AmazonCloudWatchAsyncClient client, final JSONObject groupDetails, final String clientName){ client.setEndpoint(groupDetails.getString("END_POINT")); GetMetricStatisticsRequest request = initializeRequestObject(client, groupDetails); request.setMetricName("DiskWriteOps"); request.setUnit(StandardUnit.Count); List<String> stats = new ArrayList<String>(); stats.add("Average"); stats.add("Maximum"); stats.add("Minimum"); request.setStatistics(stats); client.getMetricStatisticsAsync(request, new AsyncHandler<GetMetricStatisticsRequest, GetMetricStatisticsResult>() { @Override public void onSuccess(GetMetricStatisticsRequest arg0, GetMetricStatisticsResult arg1) { List<Datapoint> data = arg1.getDatapoints(); Double avg = data.size() > 0 ? data.get(0).getAverage() : 0.0; Double min = data.size() > 0 ? data.get(0).getMinimum() : 0.0; Double max = data.size() > 0 ? data.get(0).getMaximum() : 0.0; } @Override public void onError(Exception arg0) { } }); return; } public static void get5MinNetworkOutBytes(AmazonCloudWatchAsyncClient client, final JSONObject groupDetails, final String clientName){ client.setEndpoint(groupDetails.getString("END_POINT")); GetMetricStatisticsRequest request = initializeRequestObject(client, groupDetails); request.setMetricName("NetworkOut"); request.setUnit(StandardUnit.Bytes); List<String> stats = new ArrayList<String>(); stats.add("Average"); stats.add("Maximum"); stats.add("Minimum"); request.setStatistics(stats); client.getMetricStatisticsAsync(request, new AsyncHandler<GetMetricStatisticsRequest, GetMetricStatisticsResult>() { @Override public void onSuccess(GetMetricStatisticsRequest arg0, GetMetricStatisticsResult arg1) { List<Datapoint> data = arg1.getDatapoints(); Double avg = data.size() > 0 ? data.get(0).getAverage() : 0.0; Double min = data.size() > 0 ? data.get(0).getMinimum() : 0.0; Double max = data.size() > 0 ? data.get(0).getMaximum() : 0.0; } @Override public void onError(Exception arg0) { } }); return; } public static void get5MinNetworkInBytes(AmazonCloudWatchAsyncClient client, final JSONObject groupDetails, final String clientName){ client.setEndpoint(groupDetails.getString("END_POINT")); GetMetricStatisticsRequest request = initializeRequestObject(client, groupDetails); request.setMetricName("NetworkIn"); request.setUnit(StandardUnit.Bytes); List<String> stats = new ArrayList<String>(); stats.add("Average"); stats.add("Maximum"); stats.add("Minimum"); request.setStatistics(stats); client.getMetricStatisticsAsync(request, new AsyncHandler<GetMetricStatisticsRequest, GetMetricStatisticsResult>() { @Override public void onSuccess(GetMetricStatisticsRequest arg0, GetMetricStatisticsResult arg1) { List<Datapoint> data = arg1.getDatapoints(); Double avg = data.size() > 0 ? data.get(0).getAverage() : 0.0; Double min = data.size() > 0 ? data.get(0).getMinimum() : 0.0; Double max = data.size() > 0 ? data.get(0).getMaximum() : 0.0; } @Override public void onError(Exception arg0) { log.error("Could not get Autoscaling data for " + groupDetails.getString("NAME") + " for client "+ clientName,arg0); NotificationMail.sendMail("Could not get Autoscaling data for " + groupDetails.getString("NAME") + " for client "+ clientName, "AutoScaling data could not be read"); } }); return; }
For some more examples (ELB and RDS metrics) go here