具有 XRay 错误响应代码、无堆栈跟踪、无函数跟踪的 AWS Lambda

AWS Lambda with XRay Incorrect Response Code, No Stack Trace, No Function Tracing

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

函数看起来像这样(在 Typescript 中):

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

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 得到的回复是这样的(邮递员确实将其识别为 500 错误):

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

然而XRay控制台只有200个状态码: XRay only 200 response

并且看不到堆栈跟踪: No stack trace

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

No functions in trace

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

您只需调用“getSegment”即可获取自动生成的 nodejs lambda 根段。

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

从代码片段中,handError 中的 subsegment 从未关闭,因此永远不会发送出去。请参考https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs-subsegments.html关闭每个打开的子段。