3

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

我知道有冷启动的解决方案,我知道我可以在冷启动时记录一些东西,但这不是我需要的。我想了解过去冷启动的概况。

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

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

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

我可以得到,stats max(@duration) by @logStream但这不是我想要的。我想要第一张唱片,然后@duration从那里拿走。这是可能吗?还是我应该去别处寻找?

4

2 回答 2

2

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

然后我们遍历事件并找到第一条 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;
    }
}

我还用完整的代码创建了一个要点

于 2019-07-16T06:43:18.430 回答
2

不确定何时添加,但 CloudWatch Logs 现在在Init Duration字段中详细说明了冷启动的持续时间:“对于第一个服务请求,运行时加载函数并在处理程序方法之外运行代码所花费的时间。” 如果Init Duration不包括在内,则不会触发冷启动,并且您的调用由之前初始化/运行的实例处理。

这是Node.js 运行时的文档。

于 2020-09-19T17:24:43.577 回答