Lambda AWS X 射线。 Python SDK - 本地停用
Lambda AWS X-Ray. Python SDK - Deactivate Locally
我有一个 Flask 应用程序 运行 作为与 Zappa 一起部署的 AWS Lambda 函数,我想激活 X-Ray 以获得不同函数的更多信息。
使用 Zappa 激活 X-Ray 非常简单 - 只需要在 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 中观察的函数进行本地单元测试。
此 SDK 的功能要求之一是有一个 "disabled" 全局标志,这样一切都变成空操作 https://github.com/aws/aws-xray-sdk-python/issues/26。
但是,这仍然取决于您要测试的对象。在 Lambda 上测试 运行 实际是什么是很好的做法。您可以设置一些环境变量,以便 SDK 认为它在 Lambda 上 运行ning。
您可以看到 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? There is already an open issue for this feature https://github.com/awslabs/aws-sam-cli/issues/217
我有一个 Flask 应用程序 运行 作为与 Zappa 一起部署的 AWS Lambda 函数,我想激活 X-Ray 以获得不同函数的更多信息。
使用 Zappa 激活 X-Ray 非常简单 - 只需要在 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 中观察的函数进行本地单元测试。
此 SDK 的功能要求之一是有一个 "disabled" 全局标志,这样一切都变成空操作 https://github.com/aws/aws-xray-sdk-python/issues/26。
但是,这仍然取决于您要测试的对象。在 Lambda 上测试 运行 实际是什么是很好的做法。您可以设置一些环境变量,以便 SDK 认为它在 Lambda 上 运行ning。
您可以看到 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? There is already an open issue for this feature https://github.com/awslabs/aws-sam-cli/issues/217