Lambda AWS X-Ray。 Python SDK-本地停用

时间:2018-11-13 15:56:40

标签: amazon-web-services aws-lambda aws-xray

我有一个Flask应用程序作为与Zappa一起部署的AWS Lambda Function运行,并且想激活X-Ray以获取有关不同功能的更多信息。

使用Zappa激活X射线很容易-只需在zappa-settings.json中添加以下行即可:

"xray_tracing": true

此外,我安装了AWS X-Ray Python SDK,并为某些功能添加了一些装饰器,如下所示:

@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中观看的功能上本地运行单元测试。

1 个答案:

答案 0 :(得分:3)

此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

已经存在一个未解决的问题