Blog

AWS Cloudwatch Metric API 사용하기

January 15, 2014

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

DimensionsInstanceIdVolumeId 같은 것들이다. 이 값들을 이용해서 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
  }
]
Array