Integrating uWSGI with New Relic using systemd and virtualenv
Introduction:⌗
This article explains how to integrate uWSGI with New Relic for Python. We’ll use the admin script . This method is recommended because it is easy and doesn’t require making changes to your app code.
Variables:⌗
CentOS 7.3.1611
Python 3.4.5
uwsgi 2.0.15
Install Python 3 and uWSGI from EPEL (Extra Packages for Enterprise Linux) repository:
# yum install -y python34 python34-pip uwsgi uwsgi-plugin-python3
Create Python virtual environment:
# mkdir -p /projects/myapp
# virtualenv --python=/usr/bin/python3 /projects/myapp/venv34
Install New Relic agent in your virtualenv and generate the agent configuration file:
# source /projects/myapp/venv34/bin/activate
(venv34) # pip install newrelic
(venv34) # newrelic-admin generate-config YOUR_LICENSE_KEY newrelic.ini
We need to modify the existing systemd service unit for uWSGI to prefix the ExecStart
command with newrelic-admin
script:
# cp /usr/lib/systemd/system/uwsgi.service /etc/systemd/system/
# diff -u /usr/lib/systemd/system/uwsgi.service /etc/systemd/system/uwsgi.service
--- /usr/lib/systemd/system/uwsgi.service 2017-05-19 15:31:54.000000000 +0100
+++ /etc/systemd/system/uwsgi.service 2017-07-05 09:38:04.413117252 +0100
@@ -4,9 +4,10 @@
[Service]
EnvironmentFile=-/etc/sysconfig/uwsgi
+Environment="NEW_RELIC_CONFIG_FILE=/projects/myapp/newrelic.ini"
ExecStartPre=/bin/mkdir -p /run/uwsgi
ExecStartPre=/bin/chown uwsgi:uwsgi /run/uwsgi
-ExecStart=/usr/sbin/uwsgi --ini /etc/uwsgi.ini
+ExecStart=/projects/myapp/venv34/bin/python /projects/myapp/venv34/bin/newrelic-admin run-program /usr/sbin/uwsgi --ini /etc/uwsgi.ini
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
Restart=always
This is my uWSGI config for Django but the above setup should work with any other web framework like Flask etc.:
# cat /etc/uwsgi.d/myapp.ini
[uwsgi]
# Variables
base = /projects/myapp
# Generic Config
auto-procname = true
procname-prefix-spaced = [%i]
plugins = python3
virtualenv = %(base)/venv34
pythonpath = %(base)/myapp
module = myapp.wsgi
logto = /var/log/uwsgi/%n.log
socket = /run/uwsgi/%n.sock
chmod-socket = 777
harakiri = 30
vacuum = true
max-requests = 1000
enable-threads = true
processes = 50
cheaper-algo = spare
cheaper = 2
cheaper-step = 1
Reload the configuration and start uWSGI service:
# systemctl daemon-reload
# systemctl enable uwsgi.service
# systemctl start uwsgi.service
Read other posts