错误:"在使用带有node.js的Lambda中的AWS X射线时,无法从上下文获取当前子/段"

pyy*_*pyy 13 amazon-web-services node.js aws-lambda serverless-framework aws-xray

我正在尝试将AWS X射线实施到我当前的项目中(使用Node.js和Serverless框架).我试图将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).....
Run Code Online (Sandbox Code Playgroud)

代码如下:

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) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

对于这个问题,我使用的解决方案来自 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});

    //....
}
Run Code Online (Sandbox Code Playgroud)

还是行不通...

感谢任何形式的帮助.

r.p*_*osa 9

正如您所提到的,发生这种情况是因为您在本地运行(使用无服务器离线插件)并且无服务器离线插件不提供有效的 XRAY 上下文。

传递此错误并仍然能够在本地调用您的函数的一种可能方法是将AWS_XRAY_CONTEXT_MISSING 环境变量设置为LOG_ERROR而不是RUNTIME_ERROR(默认)。

类似的东西

serverless invoke local -f functionName -e AWS_XRAY_CONTEXT_MISSING=LOG_ERROR
Run Code Online (Sandbox Code Playgroud)

我没有使用无服务器框架对此进行测试,但是当在本地调用放大函数时发生相同的错误时它起作用了:

amplify function invoke <function-name>
Run Code Online (Sandbox Code Playgroud)

  • 在 .env 中指定 AWS_XRAY_CONTEXT_MISSING=IGNORE_ERROR 对我有帮助,LOG_ERROR 对我的情况没有帮助。 (3认同)

小智 6

我也遇到了这个错误。为了解决这个问题,我在本地运行时禁用了 XRay。本地运行时不需要 XRay,因为当时我可以设置调试日志语句。

这就是代码的样子

let AWS = require('aws-sdk');
if (!process.env.IS_OFFLINE) {
    const AWSXRay = require('aws-xray-sdk');
    AWS = AWSXRay.captureAWS(require('aws-sdk'));
}
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢这种方法,您可以设置 contextStrategy,以便在上下文丢失时不会出错。

链接在这里

AWSXRay.setContextMissingStrategy("LOG_ERROR");
Run Code Online (Sandbox Code Playgroud)