[Python] pyenv와 virtualenv에서 python에 newrelic apm 사용하기

업데이트(2018.04.29): 내용을 조금 보완하였습니다.

python을 통한 서버를 돌릴 때 newrelic을 사용하는 방법을 알아보고 나아가 pyenv와 virtualenv를 사용하는 환경에서 나타나는 오류를 어떻게 해결했는지 알아보자


환경

  • python(with Django)
  • pyenv 및 virtualenv


newrelic 연동하기

먼저 newrelic 사이트에 들어가서 가입을 하고 로그인을 하면 아래와 같은 창이 나오며 아래에서 APM을 선택합니다.

New Relic Page


다음 메뉴에서 python을 선택합니다.

Choose Language


위에서 python을 선택하게 되면 1~5까지 어떻게 하면 실행하면 되는지 자세하게 나와있습니다. 상세하게 설명이 되어 있으니 여기서는 간단하게만 요약해서 보여드리겠습니다.


  • Reveal license key를 클릭해서 키를 발급 받습니다.

  • 사용하고자 하는 프로젝트 혹은 파이썬 가상환경에서 newrelic 파이썬 패키지를 설치합니다.

$ pip install newrelic
  • 아래 명령어를 통해서 위에서 만든 license key를 통해 newrelic.ini 파일을 생성합니다. 이는 프로젝트 폴더 안에 두는것이 좋습니다.
$ newrelic-admin generate-config <your-key-goes-here> newrelic.ini
  • NEW_RELIC_CONFIG_FILE 다음에는 위에서 만든 newrelic.ini이 오게하고 run-program 다음에는 원하는 서버 명령어를 입력하시면 됩니다. 저희 django 같은 경우 python manage.py runserver와 같은 명령어를 넣어주시면 됩니다.
$ NEW_RELIC_CONFIG_FILE=newrelic.ini newrelic-admin run-program YOUR_COMMAND_OPTIONS
  • 이제 서버에서 newrelic으로 통신이 오고가면 관리페이지로 이동합니다.


pyenv와 virtualenv에서 newrelic 연동하기

파이썬의 경우 가상환경을 만들어서 실행하는 경우가 많은데 pyenv와 virtualenv를 통해서 실행한 경우에 가끔 다음과 같이 django을 찾을 수 없다고 나올 때가 있습니다.

이 문제는 현재 django가 없다고 합니다. 분명히 설치했는데도 이런 오류가 생기는거면 sys.path를 통해서 저희가 사용하는 가상 환경과 패키지 파일들이 들어가 있는지 확인하는것이 좋습니다.

ImportError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
Traceback (most recent call last):
  File "./linku/wsgi.py", line 12, in <module>
    from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)


위와 같은 경우에 sys.path/home/linku/.pyenv/versions/[virtualenv name]/lib/python3.5/site-packages에서 모듈들을 가져오지 않아서 생기는 문제인데 wsgi.py에 위의 경로를 sys.path에 추가해주면 일단 해결이 됩니다. 당연히 이 경로는 사용하시는 분에 따라서 다르며 virtualenv는 설정하신 이름으로 넣어주셔야합니다.

wsgi.py

import os
import sys
sys.path.append('/home/linku/.pyenv/versions/[virtualenv name]/lib/python3.5/site-packages')
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "[your project name].settings")

application = get_wsgi_application()