18

我正在尝试在我当前的项目中使用 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});

    //....
}

还是行不通...

感谢任何形式的帮助。

4

3 回答 3

11

正如您所提到的,这是因为您在本地运行(使用 serverless-offline 插件)并且 serverless-offline 插件不提供有效的 XRAY 上下文。

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

serverless invoke local -f functionName -e AWS_XRAY_CONTEXT_MISSING=LOG_ERROR

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

amplify function invoke <function-name>
于 2019-10-22T16:57:09.200 回答
5

我也遇到了这个错误。为了解决这个问题,我在本地运行时禁用了 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 以在缺少上下文时不出错。

链接在这里

AWSXRay.setContextMissingStrategy("LOG_ERROR");
于 2021-04-01T19:19:50.277 回答
0

如果您不希望错误阻塞您的输出,您可以添加一个仅忽略该错误的助手。

// Removes noisy Error: Failed to get the current sub/segment from the context due to Xray
export async function disableXrayError() {
  console.error = jest.fn((err) => {
    if (err.message.includes("Failed to get the current sub/segment from the context")) {
      return;
    } else {
      console.error(err);
    }
  });
}
于 2022-03-04T19:18:22.783 回答