代码之家  ›  专栏  ›  技术社区  ›  Peter Alexandr Nikitin

获取AWS Lambda冷启动概述

  •  0
  • Peter Alexandr Nikitin  · 技术社区  · 7 年前

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

    我知道有解决冷启动的方法,我知道我可以 log something on a cold start

    我知道在冷启动发生时会创建一个新的日志流,所以我想我应该使用cloudwatchinsights来获取类型的第一个记录 REPORT 对于每个日志流。但我无法编写一个查询,它将按日志流对报表进行分组,然后为每个组获取第一个查询。

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

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

    我可以得到 stats max(@duration) by @logStream 但那不是我想要的。我要第一张唱片 @duration 从那里开始。这可能吗?或者我应该找别的地方吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Peter Alexandr Nikitin    7 年前

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

    1获取所需的日志流集

    对我来说,我需要两个月。因为日志流的名称以/(例如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();
    

    然后我们查看事件并找到第一条报告消息。包含此调用的持续时间。因为这是日志流中的第一个,所以这是冷启动的持续时间。

    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 .

    推荐文章