Aws lambda 如何在AWSXRay中创建子分段?

Aws lambda 如何在AWSXRay中创建子分段?,aws-lambda,aws-xray,Aws Lambda,Aws Xray,目标:显示AWS X射线上的错误(所有来自lambda的错误) 当我使用AWSXRay.captureAWS时,子段“错误”不会显示在X光片上。如果我不使用CaptureAW,则错误会正确显示在X光片中。问题可能在于如何构造Lambda。首先,您不应该在异步函数处理程序中使用回调,异步函数处理程序应该按照返回本机承诺或错误 如果您想使用回调函数返回函数的结果(看起来是这样的),那么处理程序应该是同步的。也就是说,您在回调后抛出错误,这不会在X射线中反映出来,因为调用回调时Lambda函数的X射线

目标:显示AWS X射线上的错误(所有来自lambda的错误)


当我使用AWSXRay.captureAWS时,子段“错误”不会显示在X光片上。如果我不使用CaptureAW,则错误会正确显示在X光片中。

问题可能在于如何构造Lambda。首先,您不应该在异步函数处理程序中使用
回调
,异步函数处理程序应该按照返回本机承诺或错误

如果您想使用回调函数返回函数的结果(看起来是这样的),那么处理程序应该是同步的。也就是说,您在回调后抛出错误,这不会在X射线中反映出来,因为调用回调时Lambda函数的X射线段关闭。如果在回调之前抛出错误(例如在DynamoDB调用期间),则应在错误子段中捕获该错误

编辑

编辑原始帖子后,我无法用以下代码重现错误:

const AWSXRay = require('aws-xray-sdk');
const AWS = AWSXRay.captureAWS(require('aws-sdk'));

const ddb = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event, context) => {
    try { 
        const res = await ddb.scan({TableName: 'scorekeep-game'}).promise();
        throw('Test Error');
        return result;
    } catch (e) {
        console.log('caught!');
        var sub2 = AWSXRay.getSegment().addNewSubsegment('err');
        sub2.addError(e);
        sub2.addErrorFlag();
        sub2.close();
        return e;
    }
};

对不起,我没有注意到我在这篇文章中投错了球,谢谢。我已经更正了帖子。我无法在自己的Lambda环境中重现所描述的问题;错误子段出现在我的X射线控制台中,带有附加的错误和其他元数据,无论是否带有检测的AWS客户端。您能否使用captureAWS从X射线控制台提供跟踪的原始数据?。(捕获aws服务和自定义错误)以下是跟踪:是。编辑了我的帖子。我只是复制/粘贴了你的代码。(更改表名)。它只向我展示了迪纳摩河,而不是亚段错误。我已经为lambda启用了x射线。
const AWSXRay = require('aws-xray-sdk');
const AWS = AWSXRay.captureAWS(require('aws-sdk'));

const ddb = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event, context) => {
    try { 
        const res = await ddb.scan({TableName: 'scorekeep-game'}).promise();
        throw('Test Error');
        return result;
    } catch (e) {
        console.log('caught!');
        var sub2 = AWSXRay.getSegment().addNewSubsegment('err');
        sub2.addError(e);
        sub2.addErrorFlag();
        sub2.close();
        return e;
    }
};