AWS Cloudwatch Metric和callbackWaitsForEmptyEventLoop不能一起使用吗?

时间:2019-03-01 03:36:50

标签: node.js amazon-web-services aws-lambda metrics

下面是我的代码的简化。

const AWS = require('aws-sdk');


exports.handler = async (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = true;

  AWS.config.update({region: 'cn-north-1'});

  // Create CloudWatch service object
  var cw = new AWS.CloudWatch({apiVersion: '2010-08-01'});

  var params = {
    MetricData: [
      {
        MetricName: 'PAGES_VISITED',
        Dimensions: [
          {
            Name: 'UNIQUE_PAGES',
            Value: 'URLS'
          },
        ],
        Unit: 'None',
        Value: 1.0
      },
    ],
    Namespace: 'MyNewNameSpace'
  };

  cw.putMetricData(params, function(err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("Success", JSON.stringify(data));
    }
  });

  callback(null, "the result");
};

似乎一旦我设置了 callbackWaitsForEmptyEventLoop = false ,就无法在此处设置指标。我不明白这种冲突。

1 个答案:

答案 0 :(得分:0)

如果设置callbackWaitsForEmptyEventLoop = false,则函数执行将在完成所有回调之前终止。在这种情况下,该函数会在调用cw.putMetricData的回调之前终止,因此不会执行您的代码。在CloudWatch上的操作可能实际上发生了,但是您没有看到回调,因为它没有发生。

这是您使用async/await模型,没有回调且没有callbackWaitsForEmptyEventLoop的函数:

const AWS = require('aws-sdk');

exports.handler = async event => {
  AWS.config.update({region: 'cn-north-1'});

  // Create CloudWatch service object
  var cw = new AWS.CloudWatch({apiVersion: '2010-08-01'});

  var params = {...};

  await cw.putMetricData(params)
    .promise()
    .then(data => {console.log("Success", JSON.stringify(data));})
    .catch(err => {console.log("Error", err);})

  return "the result";
};