FastAPI+Uvicorn多Worker模式下NewRelic集成失效问题求助
问题原因分析
核心原因
- 进程fork导致Agent状态异常:Uvicorn多Worker模式通过主进程fork子进程实现,New Relic Agent在主进程初始化后,子进程会继承不完整的Agent状态——Agent内部的线程、连接等资源无法在子进程中正常工作,导致数据上报失败。
- 模块导入逻辑问题:当使用
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
相关产品推荐
相关产品推荐

