[Python] pyenv와 virtualenv에서 python에 newrelic apm 사용하기
업데이트(2018.04.29): 내용을 조금 보완하였습니다.
python을 통한 서버를 돌릴 때 newrelic을 사용하는 방법을 알아보고 나아가 pyenv와 virtualenv를 사용하는 환경에서 나타나는 오류를 어떻게 해결했는지 알아보자
환경
- python(with Django)
- pyenv 및 virtualenv
newrelic 연동하기
먼저 newrelic 사이트에 들어가서 가입을 하고 로그인을 하면 아래와 같은 창이 나오며 아래에서 APM
을 선택합니다.
다음 메뉴에서 python
을 선택합니다.
위에서 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()