Получить обзор холодных запусков в AWS Lambda - PullRequest
0 голосов
/ 11 июля 2019

Можно ли получить обзор холодных запусков AWS Lambda, т. Е. Сколько их было и сколько времени они заняли?

Я знаю, что есть решения для холодных запусков, и я знаю, что может что-то записать при холодном пуске , но это не то, что мне нужно. Я хочу краткий обзор холодных запусков в прошлом.

Я знаю, что новый поток журнала создается при холодном запуске, поэтому я решил использовать CloudWatch Insights для получения первой записи типа REPORT для каждого потока журнала. Но мне не удается написать запрос, который бы группировал отчеты по потоку журналов, а затем принимал первый для каждой группы.

Это даст мне обзор, который я мог бы проанализировать в Excel, но данные слишком велики для Excel:

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

Я могу получить stats max(@duration) by @logStream, но это не то, что я хочу. Я хочу первую запись и взять оттуда @duration. Это вообще возможно? Или я должен искать в другом месте?

1 Ответ

1 голос
/ 16 июля 2019

Я в конце концов нашел способ.Поскольку AWS lambda создает новый поток журналов для каждого создаваемого им лямбда-экземпляра, мы можем посмотреть первый ОТЧЕТ в каждом интересующем нас потоке журналов.

Идея состоит в том, чтобы выполнить следующие шаги:

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.найти первый ОТЧЕТ

Затем мы запускаем события и находим первое сообщение ОТЧЕТ.Это содержит продолжительность этого вызова.Поскольку это первый поток в журнале, это продолжительность нашего холодного запуска.

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;
    }
}

Я также создал Gist с полным кодом .

...