获取AWS Lambda中的冷启动概述

时间:2019-07-11 12:30:46

标签: amazon-web-services aws-lambda cold-start

是否有可能获得AWS Lambda冷启动的概述,即有多少次启动以及花费了多长时间?

我知道有一些冷启动的解决方案,而且我知道可以log something on a cold start,但这不是我所需要的。我想回顾一下过去的冷门。

我知道发生冷启动时会创建一个新的日志流,因此尽管我将使用CloudWatch Insights为每个日志流获取类型为REPORT的第一条记录。但是我无法编写一个查询来按日志流对报告进行分组,然后对每个组进行查询。

这将为我提供一个概述,使我可以在Excel中进行分析,但是数据对于Excel来说太大了:

filter @type = "REPORT"
| fields @logStream, @duration, @timestamp
| sort @logStream, @timestamp asc

我可以获得stats max(@duration) by @logStream,但这不是我想要的。我想要第一条记录,并从那里获取@duration。这是可能吗?还是我应该在别处寻找?

2 个答案:

答案 0 :(得分:1)

我终于找到了办法。由于AWS lambda会为其创建的每个lambda实例创建一个新的日志流,因此我们可以查看我们感兴趣的每个日志流中的第一个REPORT。

想法是执行以下步骤:

1。获取所需的日志流集

就我而言,我需要2个月的时间。因为日志流的名称以/开头(例如2019/05),所以我可以查询AWS:

await cloudWatchLogs.describeLogStreams({
    logGroupName: "/aws/lambda/my-lambda-name",
    logStreamNamePrefix: "2019/05",
    descending: true
}).promise();

2。获取日志事件

对于每个日志流,我现在可以获取日志事件:

await cloudWatchLogs.getLogEvents({
    logGroupName: "/aws/lambda/my-lambda-name",
    logStreamName: logStream.logStreamName,
    startFromHead: true
}).promise();

3。找到第一个报告

然后,我们遍历事件并找到第一条REPORT消息。这包含此调用的持续时间。由于这是日志流中的第一个,所以这是我们冷启动的持续时间。

for (let event of events.events) {
    if (event.message.startsWith("REPORT")) {
        const duration = /Duration:(.*)Billed/.exec(event.message);
        if (duration) {
            console.log(`${logStream.logStreamName}  --  ${duration[1]}`);
        }

        break;
    }
}

我还创建了a Gist with the full code

答案 1 :(得分:1)

不确定何时添加,但CloudWatch Logs现在在try { var ref = firebase.database().ref("URL").child("1"); ref.on("child_changed", function(snapshot) { var changedPost = snapshot.val(); alert(changedPost); }); } catch(err) { alert("Error"); } 字段中详细说明了冷启动的持续时间:“对于第一个请求,该时间是运行时加载函数所花费的时间并在处理程序方法之外运行代码。”如果未包含Init Duration,则不会触发冷启动,并且您的调用是由已初始化/较早运行的实例处理的。

这是Node.js runtime的文档。