Beispiel #1
0
function getHTTPCode_Backend_2XX(cb, az, elb) {
  var startTime = new Date(new Date().getTime() - (24*1000*60*60));
  var endTime = new Date(new Date().getTime() - (1000*60));
  var az = az || 'us-west-2b';
  var elb = elb || 'w-anosrep-org-0514';
  
  cw.GetMetricStatistics({
    MetricName: 'HTTPCode_Backend_2XX',
    Namespace: 'AWS/ELB',
    Unit: ['Count'],
    Period: 60,
    Statistics: ['Sum'],
    Dimensions: [
      { Name: 'AvailabilityZone', Value: az },
      { Name: 'LoadBalancerName', Value: elb }
    ],
    StartTime: startTime.toISOString('8601'),
    EndTime: endTime.toISOString('8601')
  }, function(err, data) {
    // if (err) console.log(JSON.stringify(err, null, "  "));
    console.log(err, JSON.stringify(data, null, "  "));
    cb(err, data);
  });
}
CloudWatchBackend.prototype.flush = function(creds, namespace, timestamp, metrics, enableDebug) {

    var cloudwatch = new CloudWatch(creds);

    // reference below for what `metrics` looks like
    var counters = metrics.counters;
    var gauges   = metrics.gauges;
    var timers   = metrics.timers;
    var sets     = metrics.sets;
    
    // gather together all the metrics into a single request
    var cwPackets = {};

    /**
     * Group together multiple, related metrics into a single CloudWatch PUT request. 
     */
    function queueData(data) {

        if (!!data === false) return;

        if (!(data.Namespace in cwPackets)) {
            cwPackets[data.Namespace] = [{ "Namespace": data.Namespace, "MetricData": [] }];
        }

        last_packet = cwPackets[data.Namespace].slice(-1)[0];
        for (var i = 0; i < data.MetricData.length; i++) {
            // too big? start a new one
            if (last_packet.MetricData.length >= MAX_METRICS_PER_REQUEST) {
                last_packet = { "Namespace": data.Namespace, "MetricData": [] };
                cwPackets[data.Namespace].push(last_packet);
            }
            last_packet.MetricData.push(data.MetricData[i]);
        }
    }

    /*
     * a bit of indirection to handle automatic namespacing/metric naming from 
     * the StatsD bucket name
     */
    function prepareMetric(key, namespace, data) {
        if (namespace == AUTO) {
            var parts = key.split('.');
            if (parts.length < 2) {
                console.error("ERROR: auto namespace and invalid key: " + key);
                return null;
            }

            namespace = parts.shift();
            key = parts.join('.');
        }

        data.Namespace = namespace;
        data.MetricData.forEach(function(md) {
            md.MetricName = key;
        });
        
        return data;
    }

    var key;

    for (key in counters) {
        if (key.indexOf('statsd.') === 0)
            continue;

        md = prepareMetric(key, namespace, {
            MetricData : [{
                Unit : 'Count',
                Timestamp: new Date(timestamp*1000).toISOString(),
                Value : counters[key]
            }]
        });

        queueData(md);
    }

    // timers
    function sorter(a,b) { return a-b; }

    for (key in timers) {
        if (timers[key].length > 0) {
            var values = timers[key].sort(sorter);
            var count = values.length;
            var min = values[0];
            var max = values[count - 1];

            var cumulativeValues = [min];
            for (var i = 1; i < count; i++) {
                cumulativeValues.push(values[i] + cumulativeValues[i-1]);
            }

            var sum = min;
            var mean = min;
            var maxAtThreshold = max;

            var message = "";

            var key2;

            sum = cumulativeValues[count-1];
            mean = sum / count;
            
            md = prepareMetric(key, namespace, {
                MetricData : [{
                    Unit : 'Milliseconds',
                    Timestamp: new Date(timestamp*1000).toISOString(),
                    StatisticValues: {
                        Minimum: min,
                        Maximum: max,
                        Sum: sum,
                        SampleCount: count
                    }
                }]
            });

            queueData(md);
        }
    }

    // gauges
    for (key in gauges) {
        md = prepareMetric(key, namespace, {
            MetricData : [{
                Unit : 'None',
                Timestamp: new Date(timestamp*1000).toISOString(),
                Value : gauges[key]
            }]
        });
        queueData(md);
    }

    // sets
    for (key in sets) {
        md = prepareMetric(key, namespace, {
            MetricData : [{
                Unit : 'None',
                Timestamp: new Date(timestamp*1000).toISOString(),
                Value : sets[key].values().length
            }]
        });
        queueData(md);
    }

    if (enableDebug === true) {
        console.log("********************************");
        console.log("CLOUDWATCH BACKEND DEBUG ENABLED");
        console.log("********************************");
        console.log(JSON.stringify(cwPackets, null, '    '));
    }

    function callback(err, data) {
        if (err) {
            if(err.Body) {
                console.error("CloudWatch ERROR", err.Body.ErrorResponse.Error);
            } else {
                console.error("ERROR", err);
            }
            return;
        } else {
            console.log("CloudWatch OK", JSON.stringify(data));
        }
    }

    for (var ns in cwPackets) {
        for (var j = 0; j < cwPackets[ns].length; j++) {
            // ref: http://awssum.io/amazon/cloudwatch/put-metric-data.html
            cloudwatch.PutMetricData( cwPackets[ns][j], callback);
        }
    }
};