了解 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;
}
}
不确定它是何时添加的,但 CloudWatch Logs 现在在 Init Duration
字段中详细说明了 cold-start 的持续时间:“对于服务的第一个请求,运行是时候在处理程序方法之外加载函数和 运行 代码了。"如果 Init Duration
未包含,则不会触发 cold-start,并且您的调用由早先初始化/运行ning 的实例处理。
这是 Node.js runtime 的文档。
是否可以获得 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;
}
}
不确定它是何时添加的,但 CloudWatch Logs 现在在 Init Duration
字段中详细说明了 cold-start 的持续时间:“对于服务的第一个请求,运行是时候在处理程序方法之外加载函数和 运行 代码了。"如果 Init Duration
未包含,则不会触发 cold-start,并且您的调用由早先初始化/运行ning 的实例处理。
这是 Node.js runtime 的文档。