AWS Lambda 具有 XRay 不正确的响应代码,无堆栈跟踪,无函数跟踪



我目前正在尝试为Lambda API设置XRay。我无法获取不是 200 的堆栈跟踪或状态代码。我遇到了一个简单地抛出 500 错误的端点。这里的想法是,我的代码中的任何错误都会冒泡到带有返回 500 并记录错误的错误处理程序的最终 catch 语句。我还希望查看堆栈跟踪到XRay中的相关错误,并按500个响应进行排序以找到所述错误。

该函数看起来像这样(它在打字稿中(:

忽略明显的错误、缺少导入等。我基本上只拿了重要的部分。

import AWSXRay from 'aws-xray-sdk';
import Logger from "../../common/utils/logger";
import {
AlbEvent,
ALBReturnType,
LambdaContext,
ApiErrorResponse,
} from "src/common/types";
export const formatApiError = (error: ApiError): ApiErrorResponse => ({
statusCode: error.statusCode,
Errors: typeof error.body === "string" ? [error.body] : error.body,
})
export const handleError = (
segment: AWSXRay.Segment,
ctx: LambdaContext, 
cb: (x:any, y?:any) => void,
logger: Logger,
error: Error | ApiError
): Promise<ApiErrorResponse | void | String> => {
const subsegment = segment.addNewSubsegment('handleError');
subsegment.addError(error);
if (error instanceof ApiError) {
const response = JSON.stringify(formatApiError(error as ApiError));
segment.close()
return Promise.reject(response);
} else {
logger.error("Internal Server Error: ", error);
const response = JSON.stringify(formatApiError(new ApiError(500, "Internal Server Error: ")));
segment.close()
return Promise.reject(response);
}
};

const handler = async (
event: AlbEvent,
context: LambdaContext,
cb: () => void
): Promise<String> => {
const segment = AWSXRay.getSegment(); 
logger.child({
requestId: context.requestId,
}); // Pino logger
return handleError(segment as AWSXRay.Segment, context, cb, logger, new Error("Error: oh no")) 
}
export { handler };

我从 API 的响应如下所示(Postman 确实将此识别为 500 错误(:

{
"statusCode": 500,
"Errors": [
"Error: oh no"
]
}

但是,XRay 控制台只有 200 个状态代码: X仅 200 响应

并且不可见堆栈跟踪: 无堆栈跟踪

跟踪似乎也没有捕获对 errorHandler 函数或处理程序的调用:

跟踪中没有函数

从我在这个线程中读到的内容来看:https://github.com/aws/aws-xray-sdk-node/issues/148

你只需要调用"getSegment"来获取自动生成的nodejs lambda根段。

还值得注意的是,我正在使用 API 网关 Lambda 与 lambda 错误正则表达式/映射模板的集成。显然,这是XRay记录的响应的下游,但也许我返回的格式不是XRay默认期望的标准格式?

从代码段来看,handError中的subsegment永远不会关闭,因此永远不会发出。请参阅 https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-subsegments.html 以关闭每个打开的子细分。

最新更新