错误:“无法从上下文中获取当前子/段”在 Lambda 中使用 AWS X-ray 和 node.js
Posted
技术标签:
【中文标题】错误:“无法从上下文中获取当前子/段”在 Lambda 中使用 AWS X-ray 和 node.js【英文标题】:Error:"Failed to get the current sub/segment from the context" when use AWS X-ray in Lambda with node.js 【发布时间】:2019-05-01 22:32:11 【问题描述】:我正在尝试在我当前的项目中使用 AWS X-ray(使用 Node.js 和无服务器框架)。我正在尝试将 X 射线连接到我的 lambda 函数之一,我遇到了
的问题Error: Failed to get the current sub/segment from the context.
at Object.contextMissingRuntimeError [as contextMissing] (/.../node_modules/aws-xray-sdk-core/lib/context_utils.js:21:15)
at Object.getSegment (/.../node_modules/aws-xray-sdk-core/lib/context_utils.js:92:45)
at Object.resolveSegment (/.../node_modules/aws-xray-sdk-core/lib/context_utils.js:73:19).....
代码如下:
import DynamoDB from "aws-sdk";
import AWSXRay from 'aws-xray-sdk';
export const handler = async (event, context, callback) =>
const dynamo = new DynamoDB.DocumentClient(
service: new DynamoDB( region )
);
AWSXRay.captureAWSClient(dynamo.service);
try
// call dynamoDB function
catch(err)
//...
对于这个问题,我使用的解决方案来自 https://forums.aws.amazon.com/thread.jspa?messageID=821510󈤆
我尝试的另一个解决方案来自https://forums.aws.amazon.com/thread.jspa?messageID=829923󊧣
代码就像
import AWSXRay from 'aws-xray-sdk';
const AWS = AWSXRay.captureAWS(require('aws-sdk'));
export const handler = async (event, context, callback) =>
const dynamo = new AWS.DynamoDB.DocumentClient(region);
//....
还是不行……
感谢任何形式的帮助。
【问题讨论】:
什么时候出现这个错误?在本地测试时?正如错误消息所说,您的上下文对象(您的第二个参数)似乎缺少它需要的段。 X-Ray 想要使用这些,以便您可以跟踪调用的去向、每个操作需要多长时间等。因此,它需要一个有效的上下文。 (在使用假上下文对象运行本地测试时,我自己也遇到了同样的问题。) @Hieron 感谢您的回复。实际上,我使用的是无服务器框架,并且我使用了无服务器离线插件来帮助我在本地运行。上下文是否假。我使用的解决方案是在 Lambda 函数中启用配置。 好的,所以您在本地运行,因此可能是上下文与实际在 AWS 上运行时不完全相同的问题。这也意味着它可能不是 AWS/Lambda 的问题,而是无服务器离线插件的问题。也许在他们的 github 页面上问他们? @pyy,解决方案是什么? @VictorP 现在,我通过在管理控制台或 cloudformation 模板中启用 X 射线跟踪来使用 Lambda 功能。所以 X 射线现在可以追踪 Lambda。稍后我会花时间尝试 X-ray 与其他 AWS 服务。 【参考方案1】:正如您所提到的,发生这种情况是因为您在本地运行(使用无服务器离线插件)并且无服务器离线插件没有提供有效的 XRAY 上下文。
传递此错误并仍然能够本地调用您的函数的一种可能方法是将AWS_XRAY_CONTEXT_MISSING environment variable设置为LOG_ERROR
而不是RUNTIME_ERROR
(默认)。
Something like:
serverless invoke local -f functionName -e AWS_XRAY_CONTEXT_MISSING=LOG_ERROR
我没有使用无服务器框架对此进行测试,但是当调用 amplify function locally 时发生同样的错误时它可以工作:
amplify function invoke <function-name>
【讨论】:
【参考方案2】:我也遇到了这个错误。为了解决这个问题,我在本地运行时禁用了 XRay。在本地运行时不需要 XRay,因为那时我可以设置调试日志语句。
这就是代码的样子
let AWS = require('aws-sdk');
if (!process.env.IS_OFFLINE)
const AWSXRay = require('aws-xray-sdk');
AWS = AWSXRay.captureAWS(require('aws-sdk'));
如果您不喜欢这种方法,您可以设置一个 contextStrategy 以在缺少上下文时不会出错。
Link here
AWSXRay.setContextMissingStrategy("LOG_ERROR");
【讨论】:
以上是关于错误:“无法从上下文中获取当前子/段”在 Lambda 中使用 AWS X-ray 和 node.js的主要内容,如果未能解决你的问题,请参考以下文章
主网001提案|销毁Lambda研发团队持有的7亿LAMB投票通过