如何从 AWS lambda 发布到 Node.js 中的云观察指标

Posted

技术标签:

【中文标题】如何从 AWS lambda 发布到 Node.js 中的云观察指标【英文标题】:How to publish FROM an AWS lambda to a cloud watch metric in Node.js 【发布时间】:2017-04-04 09:31:10 【问题描述】:

在我用来定期检查服务的 lambda 中,我检查来自服务器的结果值,我希望将该值作为指标发布到 AWS cloudwatch 以形成折线图。

我一辈子都想不通我们是如何做到的。 2 小时梳理 AWS 文档毫无结果。这可能吗?

要明确这不是关于 lambda 的指标,它是从 lamdba 发布的指标。

代码:

'use strict';

const https = require('http');


exports.handler = (event, context, callback) => 
  const now = new Date()
  const yesterday = new Date(now.toISOString())
  yesterday.setTime(now.getTime()  - (1000 * 60 * 60 * 24)); // 1 day ago)

  const params = [
    ['limit',0],
    ['pageStart',0],
    ['startsOnOrAfter',encodeURIComponent(yesterday.toISOString())],
    ['startsOnOrBefore',encodeURIComponent(now.toISOString())]
  ].map(kv => `$kv[0]=$kv[1]&`).reduce((s1,s2) => s1.concat(s2))

  var uri = `http://service/query?$params`
  const req = https.request(uri, (res) => 
    let body = '';
    res.setEncoding('utf8');
    res.on('data', (chunk) => body += chunk);
    res.on('end', () => 
      if (!res.headers[ 'content-type' ].match('application/.*?json')) 
        return callback(`unknown content type $res.headers[ 'content-type' ]`,body)
      
      body = JSON.parse(body);
      if(body.total && body.total > 0) 
        callback(null, body.total); // body.total to form a line chart
      
      else 
        callback(
          message: 'No plans found for time period',
          uri: uri
        )
      
    );
  );
  req.on('error', callback);
  req.end();
;

【问题讨论】:

【参考方案1】:

是的,这是可能的:

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

const metric = 
  MetricData: [ /* required */
    
      MetricName: 'YOUR_METRIC_NAME', /* required */
      Dimensions: [
        
          Name: 'URL', /* required */
          Value: url /* required */
        ,
      /* more items */
      ],
      Timestamp: new Date(),
      Unit: 'Count',
      Value: SOME_VALUE
    ,
    /* more items */
  ],
  Namespace: 'YOUR_METRIC_NAMESPACE' /* required */
;

const cloudwatch = new AWS.CloudWatch(region: 'eu-west-1');
cloudwatch.putMetricData(metric, (err, data) => 


if (err) 
    console.log(err, err.stack); // an error occurred
   else 
    console.log(data);           // successful response

);

首先,您创建要存储为指标的数据,然后使用 CloudWatch API 将其发送到 CloudWatch。 (当然该函数必须有写入 CloudWatch 的权限。)

更多文档在这里:https://docs.aws.amazon.com/AWSjavascriptSDK/latest/AWS/CloudWatch.html

【讨论】:

【参考方案2】:

如果您想避免引入同步 cloudwatch 调用所带来的延迟影响,您可以对正在发布的异步日志使用指标过滤器。

参考:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html

【讨论】:

以上是关于如何从 AWS lambda 发布到 Node.js 中的云观察指标的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从 POST 从 Amazon API Gateway 传递到 AWS Lambda

如何从 AWS Lambda Python 连接到 Informix DB

如何使用 lambda 函数从 AWS s3 获取文本文件的内容?

如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

AWS - 从公共 API 网关到 VPC 内 lambda 的路由