我对SAM不太熟悉,但是...
您需要设置 _X_AMZN_TRACE_ID 环境变量。目前,X-Ray 节点 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 变量。这有点像 catch-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/Parent ID/Sampling 加载到 _X_AMZN_TRACE_ID 然后关闭分段)然后清除缓存/重新- 之后导入 SDK,然后应该可以工作。
否则,我怀疑在 SAM 端可能需要做一些工作来内置它。但是,希望这个工作可以解决。