4

我有一个 Flask 应用程序作为使用 Zappa 部署的 AWS Lambda 函数运行,并希望激活 X-Ray 以获取有关不同函数的更多信息。

使用 Zappa 激活 X-Ray 非常简单——只需要在 zappa-settings.json 中添加这一行:

"xray_tracing": true

此外,我安装了AWS X-Ray Python 开发工具包并为一些函数添加了一些装饰器,如下所示:

@xray_recorder.capture()

当我将其部署为 Lambda 函数时,一切正常。问题是在本地使用系统,无论是在运行测试时还是在本地服务器中运行 Flask 而不是作为 lambda 函数时。

当我使用在测试中或通过本地服务器修饰的任何函数时,将引发以下异常:

aws_xray_sdk.core.exceptions.exceptions.SegmentNotFoundException: cannot find the current segment/subsegment, please make sure you have a segment open

这当然是有道理的,因为 AWS Lambda 处理段的创建。

有什么好的方法可以在本地停用捕获吗?这将很有用,例如,对于我想在 X-Ray 中观看的功能在本地运行单元测试。

4

1 回答 1

6

此 SDK 的功能请求之一是具有“禁用”全局标志,因此一切都变为无操作https://github.com/aws/aws-xray-sdk-python/issues/26

但是,它仍然取决于您要测试的内容。测试将在 Lambda 上实际运行的内容是一种很好的做法。您可以设置一些环境变量,以便 SDK 认为它在 Lambda 上运行。

您可以看到 SDK 正在寻找两个环境变量https://github.com/aws/aws-xray-sdk-python/blob/master/aws_xray_sdk/core/lambda_launcher.py。一个LAMBDA_TASK_ROOT设置为,true因此它知道切换到 lambda 模式。另一个是_X_AMZN_TRACE_ID包含通常由 lambda 容器传递的跟踪上下文。

如果您只想测试非 XRay 代码,您可以设置AWS_XRAY_CONTEXT_MISSING为,LOG_ERROR这样 SDK 就不会抱怨缺少上下文,而只是放弃捕获包装的函数。与模仿 lambda 行为相比,这将运行更少的代码路径。理想情况下,lambda 本地测试工具对 X 射线友好会更好。您在使用https://github.com/awslabs/aws-sam-cli吗?此功能已经有一个未解决的问题https://github.com/awslabs/aws-sam-cli/issues/217

于 2018-11-19T22:27:09.780 回答