python - AWS xray + lambda 异常处理,如何返回错误消息并将我的 xray 跟踪标记为失败

标签 python amazon-web-services aws-lambda zappa aws-xray

我有一个使用最新稳定的 aws_xray_sdk 用 Python 3.6 编写的 AWS Lambda,并部署为 lambda 函数,而不是 API 网关端点。

一切都按预期运行,但是,我为 lambda 创建了一个自定义异常处理程序,因此如果发生异常,则会记录错误并向调用者发送错误响应,而不仅仅是 return false .

有没有办法将我当前的 aws xray 子分段标记为错误? 我找到了subsegment对象有一个 apply_status_code然而,这似乎也没有达到我所希望的效果。

def unhandled_exception(e, event: LambdaDict, context: LambdaContext):
    logging.exception(e)
    logging.error(f"""Event: {str(event)}
Context: {str(dict(context))}""")
    sub_segment = xray_recorder.current_subsegment()
    sub_segment.apply_status_code(500)
    return {
            'sms_sent': False,
            'error': f"{type(e).__name__}:{e}",
        }

编辑 1: 我已经能够使用以下代码在 X 射线跟踪中至少获得我自己的子段报告 400 和错误状态。

...
# when an error state exists
if sub_segment:
    sub_segment.add_error_flag()
    sub_segment.apply_status_code(400)
...
...
# directly before the return
try:
    xray_recorder.end_subsegment()
    xray_recorder.end_segment()
except Exception as xray_e:
    logging.warning(xray_e)

return response

aws console xray trace

但是,这不是用于生成 X 射线服务 map 的内容。 aws console xray service map

我开始认为我应该只创建我的 lambdas Rest API,因为至少它们会返回我可以跟踪的 HTTP 状态代码。

最佳答案

服务映射中的节点对应于段,因此为了让您看到反射(reflect)的故障或错误,您需要将错误标志添加到段。不幸的是,Lambda::Function 段是由 Lambda 创建的,无法修改,因此如果您自己处理异常,则无法设置 Lambda::Function > 段错误标志。

但是,您可以通过将 Lambda 负载中返回的状态代码映射到应用程序代码中的段错误或错误,使 im-xmpp-prod 节点反射(reflect)服务映射中的错误或故障。您可以通过调用 segment = xray_recorder.current_segment() 获取当前段,然后调用 segment.add_error_flag() 来执行此操作(假设这也是 Python) >segment.add_fault_flag() 将段错误或故障属性设置为 true。

关于python - AWS xray + lambda 异常处理,如何返回错误消息并将我的 xray 跟踪标记为失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55683640/

相关文章:

amazon-web-services - 为什么通过 CloudFormation 创建的 CloudWatch 请求计数警报会产生 "Insufficient Data"?

node.js - Alexa 的 AWS Lambda 函数中的 HTTP 请求失败

aws-lambda - 无服务器框架/Cloudformation : deploying Kinesis trigger with DLQ

amazon-web-services - 适用于多环境的 AWS SAM/Cloudformation - 将逗号分隔列表转换为 ARN

python - Pandas中水平条形图的修改

python - 在subprocess.Popen中,bufsize适用于哪个文件?

jquery - 如何序列化发布到 django 后端的数组

python - 如何在多线程中使用 tqdm?

ios - DynamoDB 获取项目计数

amazon-web-services - AWSDescribeStacks 操作 - 我可以限制特定资源吗?