【问题标题】:Node.JS in AWS Lambda does not put custom metric data in CloudwatchAWS Lambda 中的 Node.JS 不会将自定义指标数据放入 Cloudwatch
【发布时间】:2019-02-26 10:29:28
【问题描述】:

我有以下代码sn-p

const AWS = require('aws-sdk');
exports.handler = async (event, context) => {
  // Set the region 
  console.log('line1');
  AWS.config.update({region: 'cn-north-1'});
  console.log('line2');

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

  //Create parameters JSON for putMetricData
  var params = {
    MetricData: [
      {
        MetricName: 'PAGES_VISITED',
        Dimensions: [
          {
            Name: 'UNIQUE_PAGES',
            Value: 'URLS'
          },
        ],
        Unit: 'None',
        Value: 1.0
      },
    ],
    Namespace: 'SITE/TRAFFIC'
  };
  console.log('line4');

  if (cw){
    console.log('cw is not null');
  }else{
    console.log('cw is null');
  }

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

  return "the result";
};

在我在 Lambda 控制台中对其进行测试之后。我可以看到正在创建的那些 Cloudwatch 日志。但是我看不到正在创建 Cloudwatch 指标。

我已将 Lambda 的角色设置为具有 Cloudwatch:PutMetricData 策略

【问题讨论】:

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


    【解决方案1】:

    它不起作用的原因是因为您没有回调但已将函数声明为异步。

    选项 1:删除第 2 行的“异步”,它会起作用。

    exports.handler = (event,context) => {...
    

    选项 2:保持异步,添加回调作为参数,并在 lambda 函数的末尾调用回调。 第 2 行需要一个回调作为参数:

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

    然后在底部添加:

    callback(null, true);
    

    【讨论】:

    • 谢谢!这确实奏效了!但我不明白为什么它不适用于 async 这个词。放置度量数据的那段代码仍然应该执行,不是吗?
    • 就 JavaScript / Node.js 而言应该如此,这就是为什么当它发生在我身上时我很困惑,我只假设它是 AWS/Lambda 特定的东西。
    • 您好 Jan,我发现了另一个可能阻止发送指标的原因。在我们的产品代码中,另一个开发人员设置 context.callbackWaitsForEmptyEventLoop = false;他这样做是为了优化数据库连接性能。但是我发现只有当我将它设置为 true 时,指标才能开始工作......
    • 我相信这是因为当程序完成时,那些线程(你不等待/不回调)将被丢弃。它的不可预知的行为取决于机器,所以我假设当程序完成时,它只是丢弃它生成的线程,没有回调它就会被丢弃,否则 lambda 会因错误代码而泄漏。
    猜你喜欢
    • 2020-10-21
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多