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

FastAPI+Uvicorn多Worker模式下NewRelic集成失效问题求助

问题原因分析

核心原因

  1. 进程fork导致Agent状态异常:Uvicorn多Worker模式通过主进程fork子进程实现,New Relic Agent在主进程初始化后,子进程会继承不完整的Agent状态——Agent内部的线程、连接等资源无法在子进程中正常工作,导致数据上报失败。
  2. 模块导入逻辑问题:当使用uvicorn.run("new_relic_test:app")这种字符串引用方式时,Uvicorn的子进程会重新导入new_relic_test模块,而你的Agent初始化代码写在if __name__ == "__main__"块中,子进程不会执行这段代码,相当于完全没初始化Agent,自然无法上报数据。
解决方案

方案一:使用New Relic官方启动命令(推荐)

用newrelic-admin命令启动Uvicorn,它会自动处理多进程下的Agent初始化,确保每个Worker进程都能正常上报:

newrelic-admin run-program uvicorn new_relic_test:app --host 0.0.0.0 --port 5600 --workers 15

方案二:调整代码初始化位置

把Agent初始化代码移出if __name__ == "__main__"块,放到模块顶层(FastAPI App定义的文件中),这样每个子进程导入模块时都会执行初始化:

# new_relic_test.py
import os
import newrelic.agent
from fastapi import FastAPI

# 模块顶层初始化Agent,子进程导入时自动执行
newrelic.agent.initialize()
print("api key ", os.environ.get("NEW_RELIC_LICENSE_KEY", 1))
print("app name ", os.environ.get("NEW_RELIC_APP_NAME", 1))

app = FastAPI()

# 路由定义...

if __name__ == "__main__":
    uvicorn.run("new_relic_test:app", host='0.0.0.0', port=5600, workers=15)

方案三:预加载App+配置多进程模式(不推荐)

启用Uvicorn的preload_app参数,同时配置Agent的fork模式,让主进程初始化后子进程能复用状态:

if __name__ == "__main__":
    import newrelic.agent
    # 初始化时指定多进程fork模式
    newrelic.agent.initialize(settings={'newrelic': {'daemon': 'fork'}})
    uvicorn.run("new_relic_test:app", host='0.0.0.0', port=5600, workers=15, preload_app=True)

注:该方式需要确保New Relic daemon配置正确,稳定性不如前两种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:12:51