我们正在尝试将NewRelic与我们的快速API服务集成。当我们在uvicorn配置中没有提供工人数量时,它工作正常
if __name__ == "__main__":
# newrelic.agent.register_application()
import newrelic.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))
# printing to make sure licence key and app name are defined in env variables.
uvicorn.run(app, host='0.0.0.0', port=5600)
但是,当我们在uvicorn配置中定义工人数量时,NewRelic不会在 Jmeter 板中显示任何数据。
if __name__ == "__main__":
# newrelic.agent.register_application()
import newrelic.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))
# printing to make sure licence key and app name are defined in env variables.
uvicorn.run("new_relic_test:app", host='0.0.0.0', port=5600, workers=15)
这是由于多个服务器进程正在创建的uvicorn工人?
我试着让工人离开,但效果很好。但是对于大量的工人来说,这并不起作用
1条答案
按热度按时间b1payxdu1#
原因如下:当你只运行一个进程的
uvicorn.run
时,它会像普通的Python函数一样启动服务器。但是,当您运行workers=n
时,uvicorn
将启动n
新进程,原始Python进程将保留为这些进程之间的协调器。在这些新进程中,它不会使用不同的入口点启动代码,这意味着if __name__ == "__main__"
不会运行(这也是为什么在运行多个worker时,必须将应用指定为字符串而不是Python示例,因为uvicorn
需要知道从哪里导入应用)。所以在您的例子中,newrelic.agent.initialize()
没有运行。我建议将除
uvicorn.run
之外的所有内容从if __name__ == "__main__"
块中移出,并将其放在与您定义应用程序的文件相同的文件中。