【问题标题】:AWS Lambda executes for 15-20 seconds for sending telemetry events to Azure Application InsightsAWS Lambda 执行 15-20 秒以将遥测事件发送到 Azure Application Insights
【发布时间】:2018-09-14 04:25:19
【问题描述】:

我需要在 Application Insights 实例被记录到日志组时将日志从云监视日志组发送到该实例。我试图通过添加一个云监视日志组作为我的 Lambda 的触发器来做到这一点,在我的 Lambda 中,我正在使用应用程序洞察库将事件发送到 AI 实例。

当我的 lambda 的默认执行超时为 3 秒时,我无法在我的 AI 实例中看到任何日志我的 lambda 成功执行并在 2-3 秒后终止。当我将超时时间增加到 20 秒时,我可以看到 AI 中填充了日志,并且我的 lambda 执行了 15-17 秒。

我的理解是,AI遥测客户端将数据批量发送,并临时存储在磁盘上,直到发送。由于 lambda 的资源在其执行后被停用,我可能会丢失这些事件,因为它们可能还没有被推出。

如何确保 AI 遥测客户端不会批量处理这些事件并在收到它们后立即发送它们?

下面是我的 Lambda 代码

exports.handler = (event, context, callback) => {
    var zlib = require("zlib");
    var appInsights = require("applicationinsights");

    appInsights.setup("<My Subscription Key>").setUseDiskRetryCaching(false);;
    var client = appInsights.defaultClient;
    // TODO implement
    var payload = new Buffer.from(event.awslogs.data, 'base64');

    zlib.gunzip(payload, function(err, dezipped) {
        if (!err) {
            client.trackEvent({ name: dezipped.toString() });
        }
    });

    client.flush(); 
};

我应该遵循任何其他方法或最佳实践来实现我的目标?

【问题讨论】:

  • 在我的 lambda 中使用 ElastiCache 时也遇到了这个问题。我得到的解决方案是关闭ElastiCache 连接。我不知道Azure,但会发生类似的事情。
  • 如果您需要我可以提供的代码。
  • @IftekharDani 对于应用程序洞察,我们不管理打开或关闭连接。所有这些都由图书馆本身负责。我不确定我们如何或是否可以在这里做到这一点。

标签: node.js aws-lambda azure-application-insights amazon-cloudwatch


【解决方案1】:

你不见了,

context.callbackWaitsForEmptyEventLoop = false;

在您的代码中。

请在立即进入函数后添加它,并调用带有响应的回调以退出进程。

修改后的代码为:

    exports.handler = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    var zlib = require("zlib");
    var appInsights = require("applicationinsights");

    appInsights.setup("<My Subscription Key>").setUseDiskRetryCaching(false);;
    var client = appInsights.defaultClient;
    // TODO implement
    var payload = new Buffer.from(event.awslogs.data, 'base64');

    function gunzipcomplete() { 
         client.flush();
         callback(null, done);
    }

    zlib.gunzip(payload, function(err, dezipped) {
        if (!err) {
            client.trackEvent({ name: dezipped.toString() });
        }
        gunzipcomplete();  // this is a complete.
    });



};

希望这会有所帮助。

【讨论】:

  • 请看这篇文章https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html。当我们更改context.callbackWaitsForEmptyEventLoop = false; 时,它会更改callback 的基本行为。所以改变价值是不好的。
  • @IftekharDani 需要时更改是好的,使用 AI,您需要在调用回调后完成该过程。否则 AI 将忙于事件循环。
【解决方案2】:

我可以看到这种行为,只有当我的 lambda 在其上一次调用后几分钟的间隙后执行时。我尝试以 1 秒的间隔连续运行 lambda,我可以看到只有第一个请求需要这么多时间,而后续请求平均不超过 400 毫秒。这是因为对于第一个 lambda 执行请求,AWS 需要一些时间来调试资源并使用相同的资源,如果在第一次调用后快速连续调用 lambda。

看起来我的理解“lambda 的资源在执行后将被停用”是不完整的。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多