在本地使用 AWS X-Ray 调用 AWS Lambda
Invoke AWS Lambda with AWS X-Ray locally
有没有办法通过使用 sam invoke local
用 X-Ray 调用 lambda?
根据the idea which PaulMaddox mentioned,
下面的步骤我都试过了,不知道是不是我理解错了:
- 运行 按照 document
在本地 (0.0.0.0:2000) 创建一个 X-Ray 守护进程
- 在我的 lambda 中 template.yaml 设置
ENV AWS_XRAY_DAEMON_ADDRESS: 0.0.0.0:2000
- 调用函数,还是报错
Missing AWS Lambda trace data for X-Ray. Expected _X_AMZN_TRACE_ID to be set
这里是template.yaml
设置的一部分,我是用环境变量设置的AWS_XRAY_DAEMON_ADDRESS
如果能提供更多信息就好了
我对 SAM 不太熟悉,但是...
您需要设置_X_AMZN_TRACE_ID环境变量。目前,X-Ray Node SDK 通过 Lambda 运行时 start-up 代码和用户代码之间的交叉通信来工作。
Lambda 在其 start-up 代码中启动段,记录时间和异常等信息,并将段发送到 X-Ray 服务。然后,它通过设置 _X_AMZN_TRACE_ID 环境变量将跟踪 ID/parent ID/sampling 决定转发给用户代码。这允许 SDK 创建一个单独的子分段,推断与原始分段的连接,该分段在服务端获取 "weaved" 到原始分段,而实际上并没有直接相关。两者都是带外发送,彼此异步。
_X_AMZN_TRACE_ID 变量符合与跟踪 header 相同的格式,如此处所讨论:https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader
如果你想通过守护进程将跟踪发送到 X-Ray 服务,你需要弄清楚如何让 SAM 最初构建这个 Lambda 段并在之前设置 _X_AMZN_TRACE_ID正在导入 SDK。
由于 SDK auto-detects 存在 Lambda(据我了解,SAM 模仿),您必须在导入 SDK 之前设置 _X_AMZN_TRACE_ID 变量。这有点像第 22 条军规,因为您需要导入 SDK(在 non-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 然后关闭段)然后清除 cache/re-import SDK,然后就可以了。
否则,我怀疑 SAM 端可能需要做一些工作才能内置此功能。但是,希望这项工作能奏效。
有没有办法通过使用 sam invoke local
用 X-Ray 调用 lambda?
根据the idea which PaulMaddox mentioned, 下面的步骤我都试过了,不知道是不是我理解错了:
- 运行 按照 document 在本地 (0.0.0.0:2000) 创建一个 X-Ray 守护进程
- 在我的 lambda 中 template.yaml 设置
ENV AWS_XRAY_DAEMON_ADDRESS: 0.0.0.0:2000
- 调用函数,还是报错
Missing AWS Lambda trace data for X-Ray. Expected _X_AMZN_TRACE_ID to be set
这里是template.yaml
设置的一部分,我是用环境变量设置的AWS_XRAY_DAEMON_ADDRESS
如果能提供更多信息就好了
我对 SAM 不太熟悉,但是...
您需要设置_X_AMZN_TRACE_ID环境变量。目前,X-Ray Node SDK 通过 Lambda 运行时 start-up 代码和用户代码之间的交叉通信来工作。
Lambda 在其 start-up 代码中启动段,记录时间和异常等信息,并将段发送到 X-Ray 服务。然后,它通过设置 _X_AMZN_TRACE_ID 环境变量将跟踪 ID/parent ID/sampling 决定转发给用户代码。这允许 SDK 创建一个单独的子分段,推断与原始分段的连接,该分段在服务端获取 "weaved" 到原始分段,而实际上并没有直接相关。两者都是带外发送,彼此异步。
_X_AMZN_TRACE_ID 变量符合与跟踪 header 相同的格式,如此处所讨论:https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader
如果你想通过守护进程将跟踪发送到 X-Ray 服务,你需要弄清楚如何让 SAM 最初构建这个 Lambda 段并在之前设置 _X_AMZN_TRACE_ID正在导入 SDK。
由于 SDK auto-detects 存在 Lambda(据我了解,SAM 模仿),您必须在导入 SDK 之前设置 _X_AMZN_TRACE_ID 变量。这有点像第 22 条军规,因为您需要导入 SDK(在 non-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 然后关闭段)然后清除 cache/re-import SDK,然后就可以了。
否则,我怀疑 SAM 端可能需要做一些工作才能内置此功能。但是,希望这项工作能奏效。