AWS Cloudwatch Metric API 사용하기
AWS Cloudwatch Metric API 사용하기
이 글은 Javascript 버전입니다. 믿을건 AWS Javascipt API Docs 밖에 없군여.ㅠㅠ
EC2 Metric
EC2 에서 MetricName은 아래와 같이 필드를 가진다. listMetric API를 통해 얻어올 수 있다.
– NetworkOut
– CPUUtilization
– DiskReadOps
– DiskWriteOps
– DiskWriteBytes
– DiskReadBytes
– NetworkIn
Dimensions 는 InstanceId 나 VolumeId 같은 것들이다. 이 값들을 이용해서 getMetricStatisticsAPI 를 사용할 수 있다. 파라미터 세팅이 많은데 별거 없다. 복잡한다 EC2 인스턴스의 CPU Utilization 값을 요청한다고 가정하자.
여기서 주의할게 Dimensions 필드에는 해당 Service Object 의 Region 에 속한 InstanceId 값을 넣어야 제대로 데이터가 뽑혀 나온다. new CloudWatch 할때 사용한 Region의 인스턴스를 값으로 넣으란 소리다.
그리고 Dimensions 에 인스턴스 ID 여러개 넣어봐야 안뽑힌다. 머리 싸매지 마시라고 미리미리 알려드림. params.period는 메트릭에서 데이터를 요청할 시간의 단위인데, 여기 에 따르면 다음과 같이 1분이라고 나와있는데, 아무리 60초(1분) 줘봐야 5분 나온다. 아마 리턴값으로 나오는 Average 를 산정하는데 5분이냐, 1분이냐의 차이인듯.
Q : Amazon CloudWatch가 수신하고 집계하는 데이터의 최소 시간 단위는 얼마입니까?
A : 메트릭은 1분 간격으로 수신 및 집계됩니다.
자 이제 코드를 보자.
AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');
var cw = new AWS.CloudWatch();
cw.listMetrics({}, function(err, data) {
if (err) {
console.log(err);
} else {
var docs = data.Metrics;
var params = {};
params.Namespace = 'AWS/EC2';
params.MetricName = 'CPUUtilization';
params.Dimensions = [{
Name : 'InstanceId',
Value : 'i-sample2121'
}];
var end = new Date();
var start = new Date(end);
start.setMinutes(end.getMinutes() - 60);
params.StartTime = start.toISOString();
params.EndTime = end.toISOString();
params.Period = 60;
params.Statistics = ['Average', 'Minimum', 'Maximum', 'Sum'];
params.Unit = 'Percent';
cw.getMetricStatistics(params, function(err, docs) {
if (err) {
return res.send({
status : 'error',
message : err
});
}
data = docs.Datapoints;
var sortedSample = _.sortBy(data, function(item) {
var compared = new Date(item.Timestamp);
return compared;
});
sortedSample = _.map(sortedSample, function(item) {
var time = new Date(item.Timestamp).toLocaleString();
item.Timestamp = time;
return item;
});
return res.send(sortedSample);
});
}
});
결과 값은 아래와 같고, 원래는 시간순으로 정렬 이 안되어있다. -_-; Underscore.js 를 써서 강제로 정렬한거다. AWS 나쁜놈들 ㅠㅠ 그리고 여러 인스턴스의 Metric Statistics 를 보면 알겠지만, 31분이니, 46분이니 이런건 지 맘대로다. 딱히 인스턴스간 정해진 표준 메트릭 전송 시간이 있는게 아니라 생성된 뒤로 결정되는 것 같다. (랜덤이란 소리다.)
[
{
"Timestamp": "Wed Jan 15 2014 13:41:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.33,
"Average": 0.066
},
{
"Timestamp": "Wed Jan 15 2014 13:46:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.33,
"Average": 0.066
},
{
"Timestamp": "Wed Jan 15 2014 13:51:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.33,
"Average": 0.066
},
{
"Timestamp": "Wed Jan 15 2014 13:56:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.34,
"Sum": 0.34,
"Average": 0.068
},
{
"Timestamp": "Wed Jan 15 2014 14:01:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.34,
"Sum": 0.67,
"Average": 0.134
},
{
"Timestamp": "Wed Jan 15 2014 14:06:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.33,
"Average": 0.066
},
{
"Timestamp": "Wed Jan 15 2014 14:11:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.34,
"Sum": 0.34,
"Average": 0.068
},
{
"Timestamp": "Wed Jan 15 2014 14:16:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.33,
"Average": 0.066
},
{
"Timestamp": "Wed Jan 15 2014 14:21:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0,
"Sum": 0,
"Average": 0
},
{
"Timestamp": "Wed Jan 15 2014 14:26:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.33,
"Average": 0.066
},
{
"Timestamp": "Wed Jan 15 2014 14:31:00 GMT+0900 (대한민국 표준시)",
"Unit": "Percent",
"Minimum": 0,
"Maximum": 0.33,
"Sum": 0.67,
"Average": 0.134
}
]