AWS Lambda 执行 15-20 秒以将遥测事件发送到 Azure Application Insights

AWS Lambda executes for 15-20 seconds for sending telemetry events to Azure Application Insights

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

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

我的理解是AI telemetry client是批量发送数据,在发送前暂存在磁盘中。由于 lambda 的资源正在退役 post 它的执行,我可能会丢失这些事件,因为它们可能尚未推出。

如何保证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(); 
};

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

你不见了,

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.
    });



};

希望对您有所帮助。

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

看来我的理解 "resources for lambda are get decommissioned post its execution" 不完整。