了解 AWS Lambda 中的冷启动概览

Get overview of cold starts in AWS Lambda

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

我知道有冷启动的解决方案,我知道我可以 ,但这不是我需要的。我想了解一下过去的冷启动。

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

这会给我一个概览,我也许可以在 Excel 中进行分析,但数据对于 Excel 来说太大了:

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

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

我终于找到了办法。因为 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

不确定它是何时添加的,但 CloudWatch Logs 现在在 Init Duration 字段中详细说明了 cold-start 的持续时间:“对于服务的第一个请求,运行是时候在处理程序方法之外加载函数和 运行 代码了。"如果 Init Duration 未包含,则不会触发 cold-start,并且您的调用由早先初始化/运行ning 的实例处理。

这是 Node.js runtime 的文档。