AWS CloudWatchのJava APIのメモ。
CloudWatchをJava APIで操作するには、AmazonCloudWatchClientクラスを使う。
import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
String accessKey = "アクセスキー"; String secretKey = "プライベートキー"; AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey); AmazonCloudWatchClient client = new AmazonCloudWatchClient(awsCredentials); client.setEndpoint("monitoring.ap-northeast-1.amazonaws.com"); // client.setEndpoint("https://monitoring.ap-northeast-1.amazonaws.com");
endpointを指定しないと変な場所のメトリクスにアクセスしにいくので要注意。
endpointには「https://
」を付けても付けなくても良い。
メトリクスの一覧を取得する例。(CLIのmon-list-metricsに相当)
import com.amazonaws.services.cloudwatch.model.ListMetricsRequest; import com.amazonaws.services.cloudwatch.model.ListMetricsResult; import com.amazonaws.services.cloudwatch.model.Metric;
ListMetricsResult list = client.listMetrics(); for (Metric m : list.getMetrics()) { System.out.printf("metricsName=%s, namespace=%s, dimension=%s%n", m.getMetricName(), m.getNamespace(), m.getDimensions()); }
特定のメトリクス一覧を取得する例。
ListMetricsRequest request = new ListMetricsRequest(); request.setNamespace("AWS/EC2"); request.setMetricName("CPUUtilization"); ListMetricsResult list = client.listMetrics(request); for (Metric m : list.getMetrics()) { System.out.printf("metricsName=%s, namespace=%s, dimension=%s%n", m.getMetricName(), m.getNamespace(), m.getDimensions()); }
メトリクスを取得する例。(CLIのmon-get-statsに相当)
import java.util.Arrays; import java.util.Calendar; import java.util.Date; import com.amazonaws.services.cloudwatch.model.Datapoint; import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsRequest; import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsResult;
GetMetricStatisticsRequest request = new GetMetricStatisticsRequest(); request.setNamespace("AWS/EC2"); request.setMetricName("CPUUtilization"); request.setStatistics(Arrays.asList("Maximum", "Average")); Date now = new Date(); request.setStartTime(date(now, -5)); request.setEndTime(now); request.setPeriod(300); // Dimension dm = new Dimension().withName("ServiceName").withValue("AmazonEC2"); // request.setDimensions(Arrays.asList(dm)); GetMetricStatisticsResult metrics = client.getMetricStatistics(request); System.out.println(metrics.getLabel()); List<Datapoint> data = metrics.getDatapoints(); for (Datapoint d : data) { System.out.printf("%s\tmax=%f ave=%f[%s]%n", d.getTimestamp(), d.getMaximum(), d.getAverage(), d.getUnit()); }
static Date date(Date d, int minute) { Calendar cal = Calendar.getInstance(); cal.setTime(d); cal.add(Calendar.MINUTE, minute); return cal.getTime(); }
Datapointに取得された値が入っている。
getMaximum()やgetAverage()は、request.setStatistics()で指定したものだけ、ちゃんとした値が返ってくる。
(メトリクスを登録した際に一緒に単位を登録していれば)getUnit()でメトリクスの単位が取れる。Byteとかパーセントとか。
アラームの一覧を取得する例。(CLIのmon-describe-alarmsに相当)
import com.amazonaws.services.cloudwatch.model.DescribeAlarmsRequest; import com.amazonaws.services.cloudwatch.model.DescribeAlarmsResult; import com.amazonaws.services.cloudwatch.model.MetricAlarm;
DescribeAlarmsRequest request = new DescribeAlarmsRequest(); // request.setAlarmNames(Arrays.asList("アラーム名")); DescribeAlarmsResult alarms = client.describeAlarms(request); List<MetricAlarm> list = alarms.getMetricAlarms(); for (MetricAlarm a : list) { System.out.printf("%s\tstate=%s action=%s%n", a.getAlarmName(), a.getStateValue(), a.getAlarmActions()); }