错误:“无法从上下文中获取当前子/段”在 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&#821510

我尝试的另一个解决方案来自https://forums.aws.amazon.com/thread.jspa?messageID=829923&#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投票通过

Lamb表达式匿名类实现接口方法

Channel L 自然拼读法 Teacher:Lamb

V3 - 句子成分- 动词种类 Teacher:Lamb

I4-6 Present continuous Teacher: Lamb

I Show - Sport Teacher: Lamb