I recently needed to integrate one of my Python Flask apps with New Relic to get some monitoring insight. The app is being served via uWSGI running in Emperor mode. The docs available from New Relic weren’t particularly clear to me so it took me a little while longer than it should have, but I got it ironed out.
I’m going to assume that if you’re trying to do this, you’ve already got uWSGI running in Emperor mode and that your vassals are configured.
First, ensure that the New Relic module is installed and that your
newrelic.ini is created correctly (New Relic’s docs are fine for this) and that it resides in a location and has permissions where your app can read it. I like to leave mine in the root of my application.
Second, ensure that your vassal is configured correctly for New Relic to work. There are two required settings for New Relic;
enable-threads = true and
single-interpreter = true. I didn’t have any luck with using the
env configuration options presented by New Relic, so those aren’t present here. My dev vassal looks like this:
plugins = python
chdir = /path/to/myapplication
socket = /path/to/myapplication/tmp/uwsgi.sock
uid = www-data
gid = www-data
enable-threads = true
single-interpreter = true
module = myapplication:app
chmod-socket = 666
logto = /var/log/uwsgi/dev.myapplication.log
catch-exceptions = true
py-reload = 2
At this point, you should be able to restart uWSGI and effectively see no change in behavior.
Because of the previously mentioned issues using
eval to get this all running, my New Relic setup is actually part of the app itself, which I actually prefer. The magic bits to get this to work inside of your app are:
I have these immediately after the rest of the imports in my app. Note that this obviously assumes that you have the
newrelic.ini in the same place that I do – right next to the application.
Now if you restart uWSGI, make a few requests to your app, and wait a few minutes, you should start getting metrics reported to New Relic.