在本地使用 AWS X-Ray 调用 AWS Lambda

Cho*_*ouW 8 amazon-web-services aws-lambda aws-xray aws-sam-cli

有没有办法使用 X-Ray 调用 lambda sam invoke local

根据PaulMaddox提到的想法,我尝试了下面的步骤,不知道是不是我理解错了

  1. 按照文档在本地 (0.0.0.0:2000) 运行 X-Ray 守护程序
  2. 在我的 lambda 的 template.yaml 中设置 ENV AWS_XRAY_DAEMON_ADDRESS: 0.0.0.0:2000
  3. 调用函数,还是报错 Missing AWS Lambda trace data for X-Ray. Expected _X_AMZN_TRACE_ID to be set

这里是template.yaml设置的一部分,我是用环境变量来设置的AWS_XRAY_DAEMON_ADDRESS

在此处输入图片说明

如果您能提供更多信息就好了。

AWS*_*dra 6

我对 SAM 不太熟悉,但是...

您需要设置 _X_AMZN_TRACE_ID 环境变量。目前,X-Ray Node SDK 通过 Lambda 运行时启动代码和用户代码之间的交叉通信来工作。

Lambda 在启动代码中启动该段,记录时间和异常等信息,并将该段发送到 X-Ray 服务。然后,它通过设置 _X_AMZN_TRACE_ID 环境变量将跟踪 ID/父 ID/采样决策转发给用户代码。这允许 SDK 创建一个单独的子分段,推断与原始分段的连接,该连接“编织”到服务端的原始分段中,而实际上并不直接相关。两者都在带外发送,彼此异步。

_X_AMZN_TRACE_ID 变量与此处讨论的跟踪标头的格式相同: https: //docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader

如果您想通过守护进程将跟踪发送到 X-Ray 服务,您需要弄清楚如何让 SAM 最初构建此 Lambda 段,并在导入 SDK 之前设置 _X_AMZN_TRACE_ID。

由于 SDK 会自动检测 Lambda 的存在(据我所知,SAM 模仿),因此您必须在导入 SDK 之前设置 _X_AMZN_TRACE_ID 变量。这有点像第 22 条军规,因为您需要导入 SDK(在非 Lambda 模式下)来构建 Lambda 段,然后才能填充 _X_AMZN_TRACE_ID。

问题出在这里:https://github.com/aws/aws-xray-sdk-node/blob/master/packages/core/lib/aws-xray.js#L361

如果将 SDK 切换到 LOG_ERROR 模式(忽略 Lambda 错误),创建并发送 Lambda 段(只需手动创建段,将生成的 ID/父 ID/采样加载到 _X_AMZN_TRACE_ID 然后关闭该段),然后清除缓存/重新- 之后导入 SDK,然后就可以了。

否则,我怀疑 SAM 端可能需要做一些工作来内置此功能。但是,希望这项工作能够奏效。