为什么我的 cloudwatch 日志中有漏洞?
Why are there holes in my cloudwatch logs?
我已经 运行 使用 C# 和 serverless.com 框架的 lambdas 几个月了,我一直注意到 cloudwatch 日志中的漏洞。到目前为止,这只是一个烦恼。我一直在四处寻找一些解释,但它开始到了我需要 understand/fix 问题的地步。
例如,今天我可以看到 lambda 监视器在早上 7 点到早上 8 点之间显示数百到数千次执行,但 cloudwatch 日志显示日志文件直到 7:19AM,然后直到 8:52AM 才显示任何日志文件。
这是怎么回事?
日志通过调用 lambda 和日志组链接通过并发执行。如果你查看你的 lambda 指标,你会看到一个名为 ConcurrentExecution 的统计数据——这是你在任何给定时刻 运行ning 的并发无服务器 lambda 容器的总数——但这并不等于调用。我正在进行的无头项目每小时进行大约 5k 次调用,而我们的任何 25ish lambda 的并发执行从未超过 5 次(帮助它们在大约 300 毫秒启动后 运行)
因此,如果您在 10 秒内有 100 次调用,但它们都需要不到一秒的时间 运行,一旦给定的 lambda 容器启动,只要它不断接收事件,它就会被重用.这就是 AWS 尽可能解决 'cold start' 问题的方式,其中给定的 lambda 可能需要 10-15 秒或更长时间才能启动。通过尝试预测流量(您也可以操纵这些设置),AWS 正试图让一个温暖的 lambda 随时为您服务。
这些并发执行会随着它们的音量下降而慢慢关闭,它们的调用会返回到其他仍处于活动状态的执行。
这对日志组日志意味着两方面:
您有时可能会看到很大的 'gaps',但如果您仔细观察,任何给定的日志组都会有多个调用。
日志组会延迟几秒到几分钟,具体取决于服务器负载,因此在任何给定时间您实际上可能看不到给定时刻的所有日志。
另一种可能性是您的日志记录设置不正确(Python lambda 尤其难以正确记录到 cloudwatch - 默认的日志记录处理程序与 lambda 启动的方式不兼容处理程序将其附加到日志组)或者你得到的是大量实际上没有做任何事情的点击 - 只有 pings/keep 活动事件实际上不会触发任何你的日志语句 - 你通常只会查看并发启动 up/shutdown 日志语句(如上所述,它们要少得多)
日志组中的间隙是什么意思?
日志组通过日志流获取其日志,并且同一 lambda 容器之一使用相同的日志流。因此,它可能不是您的日志组中具有最新日志条目的最新日志流。
在这里您可以阅读更多相关信息:
https://dashbird.io/blog/how-to-save-hundreds-hours-debugging-lambda/
在尝试使用屏幕截图和数据统计来编辑我的问题时,我找到了答案。我认为将其作为一个单独的答案会有所帮助,因为它非常具体且具有启发性。
问题的症结在于我没想到调用时间和日志写入时间之间会有如此巨大的差距。 12分钟与我过去所做的工作相比是永恒的。
考虑这张图:
12:59 UTC 应该是 7:59AM CST。计算 12:59 和 13:08 之间的调用次数,我得到大约 ~110。
Cloudwatch 显示这些日志流:
看看这些日志流,似乎有很大的差距。日志流上的时间戳是“文件关闭”时间。 8:08:37 的日志流包括 12 分钟前的事件。
所以日志流上的时间戳对于查找调试数据不是很有用。到目前为止,搜索也不是很有帮助。缓慢且非常有限。我将研究一些其他处理日志的方法。
我已经 运行 使用 C# 和 serverless.com 框架的 lambdas 几个月了,我一直注意到 cloudwatch 日志中的漏洞。到目前为止,这只是一个烦恼。我一直在四处寻找一些解释,但它开始到了我需要 understand/fix 问题的地步。
例如,今天我可以看到 lambda 监视器在早上 7 点到早上 8 点之间显示数百到数千次执行,但 cloudwatch 日志显示日志文件直到 7:19AM,然后直到 8:52AM 才显示任何日志文件。
这是怎么回事?
日志通过调用 lambda 和日志组链接通过并发执行。如果你查看你的 lambda 指标,你会看到一个名为 ConcurrentExecution 的统计数据——这是你在任何给定时刻 运行ning 的并发无服务器 lambda 容器的总数——但这并不等于调用。我正在进行的无头项目每小时进行大约 5k 次调用,而我们的任何 25ish lambda 的并发执行从未超过 5 次(帮助它们在大约 300 毫秒启动后 运行)
因此,如果您在 10 秒内有 100 次调用,但它们都需要不到一秒的时间 运行,一旦给定的 lambda 容器启动,只要它不断接收事件,它就会被重用.这就是 AWS 尽可能解决 'cold start' 问题的方式,其中给定的 lambda 可能需要 10-15 秒或更长时间才能启动。通过尝试预测流量(您也可以操纵这些设置),AWS 正试图让一个温暖的 lambda 随时为您服务。
这些并发执行会随着它们的音量下降而慢慢关闭,它们的调用会返回到其他仍处于活动状态的执行。
这对日志组日志意味着两方面:
您有时可能会看到很大的 'gaps',但如果您仔细观察,任何给定的日志组都会有多个调用。
日志组会延迟几秒到几分钟,具体取决于服务器负载,因此在任何给定时间您实际上可能看不到给定时刻的所有日志。
另一种可能性是您的日志记录设置不正确(Python lambda 尤其难以正确记录到 cloudwatch - 默认的日志记录处理程序与 lambda 启动的方式不兼容处理程序将其附加到日志组)或者你得到的是大量实际上没有做任何事情的点击 - 只有 pings/keep 活动事件实际上不会触发任何你的日志语句 - 你通常只会查看并发启动 up/shutdown 日志语句(如上所述,它们要少得多)
日志组中的间隙是什么意思? 日志组通过日志流获取其日志,并且同一 lambda 容器之一使用相同的日志流。因此,它可能不是您的日志组中具有最新日志条目的最新日志流。
在这里您可以阅读更多相关信息: https://dashbird.io/blog/how-to-save-hundreds-hours-debugging-lambda/
在尝试使用屏幕截图和数据统计来编辑我的问题时,我找到了答案。我认为将其作为一个单独的答案会有所帮助,因为它非常具体且具有启发性。
问题的症结在于我没想到调用时间和日志写入时间之间会有如此巨大的差距。 12分钟与我过去所做的工作相比是永恒的。
考虑这张图:
12:59 UTC 应该是 7:59AM CST。计算 12:59 和 13:08 之间的调用次数,我得到大约 ~110。
Cloudwatch 显示这些日志流:
看看这些日志流,似乎有很大的差距。日志流上的时间戳是“文件关闭”时间。 8:08:37 的日志流包括 12 分钟前的事件。
所以日志流上的时间戳对于查找调试数据不是很有用。到目前为止,搜索也不是很有帮助。缓慢且非常有限。我将研究一些其他处理日志的方法。