Python 2용 앱 통계

Python 2 SDK에는 애플리케이션의 리모트 프로시져 콜(RPC) 성능을 프로파일링하는 데 사용되는 앱 통계 라이브러리가 있습니다. App Engine RPC는 애플리케이션과 App Engine 서비스 API 사이의 왕복 네트워크 호출입니다. 예를 들어 모든 API 호출은 RPC 호출입니다.

  • Datastorendb.get_multi(), ndb.put_multi() 또는 ndb.gql()을 호출합니다.
  • Memcachememcache.get() 또는 memcache.get_multi()를 호출합니다.
  • URL Fetchurlfetch.fetch()를 호출합니다.
  • 메일mail.send()를 호출합니다.

확장 가능한 애플리케이션을 최적화하거나 디버깅하는 것은 다양한 문제가 발생하여 성능을 떨어뜨리거나 예기치 않은 비용을 발생시킬 수 있기 때문에 어려운 일로 여겨집니다. 이러한 문제는 로그 또는 요청 시간 통계와 같은 일반적인 정보로 디버깅하기가 매우 어렵습니다. 대부분의 애플리케이션 요청은 네트워크 요청이 완료되는 데 시간 대부분을 소비합니다.

애플리케이션의 속도를 빠르게 유지하려면 다음 사항을 확인해야 합니다.

  • 애플리케이션에서 불필요한 RPC 호출을 만들고 있나요?
  • 애플리케이션은 동일한 데이터를 얻기 위해 반복적인 RPC 호출을 하는 대신 데이터를 캐시해야 하나요?
  • 여러 요청이 순차적으로 실행되지 않고 동시에 실행되는 경우 애플리케이션의 성능이 향상되나요?

앱 통계 라이브러리는 위 질문에 답변하는 데 도움을 줄 뿐만 아니라 RPC 요청 프로파일링을 통해 애플리케이션이 RPC 요청을 가장 효율적인 방법으로 사용하고 있는지 확인합니다. 앱 통계를 사용하면 주어진 요청에 대한 모든 RPC 호출을 추적하고 각 호출의 시간과 비용을 확인할 수 있습니다.

애플리케이션의 RPC 사용을 최적화하면 비용도 줄일 수 있습니다. 앱의 리소스 사용량 관리 문서를 참조하세요.

예시 동영상 보기

설정

앱 통계를 사용하기 위해 다운로드하거나 설치할 것은 없습니다. 아래 단계에 설명된 대로 애플리케이션을 구성하고 재배포한 뒤 앱 통계 콘솔에 액세스하세요. 그런 다음 앱 통계 라이브러리가 나머지를 처리합니다.

1. 이벤트 레코더 설치

웹 요청에 대한 통계를 기록하려면 애플리케이션의 각 요청 핸들러가 앱 통계를 호출해야 합니다. 애플리케이션에서 사용하는 프레임워크에 따라 다음 중 하나를 선택하세요.

  • WSGI 요청 핸들러

    WSGI 요청 핸들러(webapp2와 같은 WSGI 프레임워크 포함)로 앱 통계를 사용하려면 WSGI 애플리케이션과 앱 통계 미들웨어를 래핑해야 합니다. 이를 수행하는 가장 간단한 방법은 appengine_config.py을 사용하여 모든 WSGI 애플리케이션을 래핑하도록 WSGI 미들웨어를 정의하는 것입니다.

    appengine_config.py가 없으면 애플리케이션의 루트 디렉토리에 이 이름으로 된 파일을 만들고 다음 함수를 추가합니다.

    def webapp_add_wsgi_middleware(app):
        from google.appengine.ext.appstats import recording
        app = recording.appstats_wsgi_middleware(app)
        return app

    WSGI 애플리케이션을 호출하기 전에 런타임에서 이 파일을 가져와서 webapp_add_wsgi_middleware 함수(있는 경우)를 호출합니다.

    appengine_config.py에 대한 자세한 내용은 아래의 선택적 구성을 참조하세요.

  • Django 프레임워크

    Django 애플리케이션에 앱 통계 미들웨어를 설치하려면 settings.py 파일을 편집하고 다음 줄을 MIDDLEWARE_CLASSES의 첫 번째 항목으로 추가합니다.

    <pre suppresswarning="yes" class="prettyprint">
    MIDDLEWARE_CLASSES = (
      'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
    
      # ...
    )
    </pre>
    

    프로파일러가 통계에 다른 미들웨어를 포함할 수 있도록 앱 통계 미들웨어는 첫 번째 항목이어야 합니다.

    Django 미들웨어는 앱 통계를 호출하여 이벤트를 기록합니다. 다른 애플리케이션 코드는 변경할 필요가 없습니다.

2. 콘솔 경로 설정

앱 통계 콘솔은 웹브라우저에서 애플리케이션의 URL을 방문하여 액세스할 수 있습니다. 다음 두 가지 방법 중 하나로 URL의 경로를 설정해야 합니다.

  • 기본 URL

    앱 통계를 기본 디렉토리(/_ah/stats/)에 매핑하려면 appstats 내장 기능을 app.yaml파일에 추가합니다.

    runtime: python27
    api_version: 1
    threadsafe: yes
    
    builtins:
    - appstats: on
    
    handlers:
    - url: .*
      script: main.app
    
  • 커스텀 URL

    앱 통계를 기본 디렉터리가 아닌 다른 디렉터리에 매핑해야 하는 경우 app.yaml에서 url 지시문을 사용할 수 있습니다.

      - url: /stats.*
      script: google.appengine.ext.appstats.ui.app
      

3. 선택적 구성

앱 통계의 동작은 애플리케이션의 루트 디렉토리에 있는 appengine_config.py 파일에 내용을 추가하여 구성할 수 있습니다. 구성 옵션의 전체 예제는 SDK의 google/appengine/ext/appstats/sample_appengine_config.py 파일을 참조하세요.

appengine_config.py에 대해 알아야 할 주요 사항

  • 요청 핸들러가 sys.path를 수정하는 경우 앱 통계 웹 인터페이스에서 모든 파일을 볼 수 있도록 appengine_config.pysys.path도 같이 수정해야 합니다.

비용 표시

앱 통계는 RPC 비용뿐만 아니라 시간도 추적할 수 있습니다. 애플리케이션이 충분히 빠르지만 예상보다 많은 비용이 드는 경우 예상보다 많은 비용이 소요되는 작업을 찾습니다. 비용 추적 기능을 사용하려면 appengine_config.py 파일에서 appstats_CALC_RPC_COSTS = True를 설정하세요.

4. 개발 서버에서 앱 통계 테스트

개발 서버를 사용하여 앱 통계 설정을 테스트할 수 있습니다. 위의 기본 URL을 사용하도록 콘솔 경로를 구성한 경우 http://localhost:8080/_ah/stats/에서 콘솔에 액세스할 수 있습니다.

5. 배포

앱 통계 설정에 만족하면 애플리케이션을 배포하세요. 위의 기본 URL을 사용하도록 콘솔 경로를 구성한 경우 http://your_app_id.appspot.com/_ah/stats에서 콘솔에 액세스할 수 있습니다.

앱 통계 콘솔 둘러보기

앱 통계 콘솔은 생성된 RPC 호출, 요청된 URL 경로, 최근 요청 내역 및 개별 요청의 세부정보를 제공합니다.

  • RPC 통계 표는 애플리케이션에서 작성한 각 RPC 유형에 대한 통계를 나타냅니다. 더하기 버튼을 누르면 RPC에 대한 경로 요청별 세부정보가 표시됩니다.

    스크린샷

  • 경로 통계 표는 애플리케이션에 전송된 각 경로 요청에 대한 통계를 표시합니다. 더하기 버튼을 누르면 RPC에 대한 경로 요청별 세부정보가 표시됩니다.

    스크린샷

    API 비용 추적 기능을 사용하도록 설정한 경우 비용도 표시됩니다.

  • 요청 내역 표는 개별 요청과 관련된 데이터를 표시합니다. 더하기 버튼을 누르면 RPC별 세부정보가 표시되며, 요청 링크를 클릭하면 개별 RPC 소요시간을 포함한 요청 타임라인이 표시됩니다.

    스크린샷

  • RPC 타임라인 그래프는 특정 RPC 호출이 발생한 시기와 요청 처리에 소요된 시간을 표시합니다. RPC 합계 막대는 RPC 호출을 기다리는 데 소비된 총 시간을 표시하고 전체 합계 막대는 요청을 처리하는 데 소요된 총 시간을 표시합니다. 아래의 타임라인에서 볼 수 있듯이 대부분의 시간은 RPC 호출에 소비되었습니다. 이러한 경우가 일반적입니다. 다른 탭에는 요청에 대한 추가 정보가 표시됩니다. RPC 호출이 애플리케이션 응답 시간에 미치는 영향을 이해하는 것은 성능을 분석하는 데 매우 중요합니다.

    스크린샷

  • 개발자는 양방향 플레이그라운드를 통해 임의의 Python 코드를 웹 양식에 입력하고 앱 환경 내에서 실행할 수 있습니다.

    앱 통계로 이동한 후 양방향 플레이그라운드를 클릭하면 단일 텍스트 영역이 있는 양식이 표시됩니다. 텍스트 영역에서 Python 코드를 입력한 다음 양식을 제출하여 실행합니다. 표준 출력으로 인쇄된 모든 결과가 텍스트 영역 옆에 표시되고 코드에서 생성된 RPC 호출에 대한 타임라인 분석이 표시됩니다.

    양방향 플레이그라운드는 사용하거나 사용하지 않도록 설정할 수 있습니다. SDK에서는 기본적으로 사용하도록 설정되어 있고 프로덕션 환경에서는 기본적으로 비활성화되어 있습니다. 사용 설정하려면 다음 줄을 appengine_config.py 파일에 추가합니다.

    <pre suppresswarning="yes" class="prettyprint">
    appstats_SHELL_OK = True
    </pre>
    

작동 방식

앱 통계는 API 후크를 사용하여 App Engine 서비스 API의 기초가 되는 원격 절차 호출 프레임워크에 자신을 추가합니다. 앱 통계는 요청 핸들러에서 만들어진 모든 API 호출에 대한 통계를 기록한 다음 __appstats__의 네임스페이스를 사용하여 Memcache에 데이터를 저장합니다. 앱 통계에는 최근 1,000건의 요청에 대한 통계가 있습니다. 이러한 데이터에는 약 200바이트의 요약 레코드와 최대 100KB의 세부 레코드가 포함되며 세부 레코드에 저장된 세부 사항의 양을 제어할 수 있습니다. 자세한 내용은 선택적 구성 및 예제 구성 파일을 참조하세요.

API 후크는 요청 핸들러에 약간의 오버헤드를 추가합니다. 앱 통계는 '정보' 수준의 로그에 메시지를 추가하여 앱 통계 라이브러리 자체에서 사용하는 리소스의 양을 보고합니다. 로그 행은 다음과 같이 표시됩니다.

<pre suppresswarning="yes" class="prettyprint">
INFO 2009-08-25 12:04:07,277 recording.py:290] Saved; key: __appstats__:046800, part: 160 bytes, full: 25278 bytes, overhead: 0.019 + 0.018; link: http://your_app_id.appspot.com/stats/detail?time=1234567890123
</pre>

이 행은 업데이트된 memcache 키, 요약(part) 및 세부(full) 레코드의 크기, 이 정보를 기록하는 데 소요한 시간(초)을 보고합니다. 로그 행은 이 이벤트에 대한 데이터를 표시하는 앱 통계 관리 인터페이스 링크를 포함합니다.