python-3.x NewRelic不支持多个工作线程Fast API Uvicorn

ztmd8pv5  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(162)

我们正在尝试将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工人?
我试着让工人离开,但效果很好。但是对于大量的工人来说,这并不起作用

b1payxdu

b1payxdu1#

原因如下:当你只运行一个进程的uvicorn.run时,它会像普通的Python函数一样启动服务器。但是,当您运行workers=n时,uvicorn将启动n新进程,原始Python进程将保留为这些进程之间的协调器。在这些新进程中,它不会使用不同的入口点启动代码,这意味着if __name__ == "__main__"不会运行(这也是为什么在运行多个worker时,必须将应用指定为字符串而不是Python示例,因为uvicorn需要知道从哪里导入应用)。所以在您的例子中,newrelic.agent.initialize()没有运行。
我建议将除uvicorn.run之外的所有内容从if __name__ == "__main__"块中移出,并将其放在与您定义应用程序的文件相同的文件中。

相关问题