Flask Application에 New Relic 설정하기

Development / Python / Flask / newrelic / devops / apm

기존에는 ELK(AWS Elasticsearch Service)를 APM겸 로그 시스템으로 사용하고 있었는데, 결국 Eleasticsearch Node들도 DevOps 차원에서 관리가 필요한 부분이고, 서비스 트래픽 증가에 따라 Node와 Message Queue, Queue Worker들도 같이 Scale-up(혹은 Scale-out)이 되어야 해서 덩달아 비용이 기하급수적으로 늘어나고 있기에, 그 유명한 New Relic으로 갈아타는 것을 결심했다. (그리고 초당 150건씩 도큐먼트가 생성되니까 맨날 JVMMemoryPressure랑 CPU 100% 쳐가지고..ㅠ.ㅠ)

  1. 먼저 pip를 이용해 newrelic 패키지를 설치한다.

    $ pip install newrelic
    
  2. uwsgi에서 Flask 어플리케이션을 실행하는 커맨드에 다음의 파라미터를 추가한다. 나는 supervisord를 이용하고 있기 때문에, supervisord 설정을 수정하였다. 각자 실행 환경에 따라 수정하면 된다.

    --single-interpreter
    
  3. 설정 파일(.ini)를 만들 차례다. 간단히 아래의 명령어로 설정 파일을 생성할 수 있다.

    $ newrelic-admin generate-config <여기에라이센스키를입력> newrelic.ini
    
  4. 설정 파일을 수정하여 New Relic Dashboard에서 보이는 어플리케이션 이름이라던지, Flask Req./Resp. 로깅 등을 설정할 수 있다.

    ...
    app_name = <대시보드에서보고싶은앱네임>
    ...
    attributes.enabled = true
    attributes.include = request.headers.contentLength request.headers.contentType request.headers.referer request.headers.userAgent request.method request.parameteres.* response.contentLength response.status  # 이렇게 전체를 콜하는거면 '*' 로 치환도 가능하다고 함.
    ...
    
  5. Flask 어플리케이션의 진입점(우리의 경우에는 run.py) 상단에 다음의 소스를 추가한다.

    import newrelic.agent 
    newrelic.agent.initialize('/<ini파일위치>/newrelic.ini', '<어플리케이션이름>')
    

매우 감동적이다. APM 뿐만 아니라 Kibana에서 하던 모든 행위를 Insight 메뉴에서 아주 쉬운 Query로 확인이 가능하다.(Elasticsearch 쿼리는 아무리 해도 정이 안갔는데.) 이렇게 쉬운 세팅으로 전체 Flask 어플리케이션을 감시할 수 있다니. 정말 기술의 승리다. 더불어 서비스를 만드는 입장에서 감동 포인트라는게 어떠한 것인지를 확실히 깨닫게 해준 점에도 너무나 감사한다.

p.s. Elasticsearch는 이제 진짜 검색용으로만 써야겠다.

Share on : Twitter, Facebook or Google+