我有一个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中观看的功能上本地运行单元测试。
答案 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