You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda中使用OpenTelemetry引发JSON序列化错误

问题

我们的架构是API Gateway后方部署基于Flask的Serverless AWS Lambda应用。添加OpenTelemetry作为Lambda附加层(ARN:arn:aws:lambda:eu-central-1:184161586896:layer:opentelemetry-python-0_18_0:2),并配置AWS_LAMBDA_EXEC_WRAPPER为"/opt/otel-instrument"后,出现大量错误。

示例错误场景代码:

@app.route("/s3/credentials", methods=["GET"])
def credentials():
    user = get_user() # returns a string
    credentials = request_credentials(User=user)

    credentials["Expiration"] = str(credentials["Expiration"])
    return jsonify(credentials)

def request_credentials(self, User=None):
    arn = RoleFinder().find_by_name(User)["Arn"]
    res = self._client.assume_role(RoleArn=arn, RoleSessionName="bucket-lambda")       
    return res["Credentials"]

日志显示return jsonify代码行从未执行,但Lambda函数声称执行成功,收到的响应状态码为500,错误信息为{'error': 'Object of type datetime is not JSON serializable'}。

由于代码库规模庞大,大量函数存在不可序列化的返回值,请问是否遗漏了OpenTelemetry的关键配置?

解决方案

这是因为OpenTelemetry的自动 instrumentation 会在Flask请求处理流程之外,额外捕获Lambda函数的返回值并尝试序列化上报——你只处理了Flask返回时的序列化,没覆盖OTel这一步的处理逻辑。

  • 适配Flask请求流程:添加环境变量OTEL_PYTHON_LAMBDA_HANDLER_WRAPPER=flask,让OTel遵循Flask的请求处理链路,不再单独处理Lambda返回值的序列化操作。
  • 全局配置自定义序列化器:如果需要保留全链路追踪的返回值上报,可自定义JSON序列化函数来处理datetime等不可序列化类型,然后通过环境变量OTEL_EXPORTER_OTLP_JSON_SERIALIZER指定该函数的路径(需将序列化函数打包进Lambda代码包或附加层)。
  • 升级OTel版本:当前使用的0.18.0是较旧的版本,后续1.x系列的Lambda附加层修复了不少Flask+Lambda的兼容性问题,升级后能直接减少这类适配错误。

内容的提问来源于stack exchange,提问作者rmbt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 19:32:27