오류 보고

이 가이드에서는 Google Cloud Console을 사용하여 Python Bookshelf 앱에서 처리되지 않은 예외를 보고하고 추적하는 방법을 보여줍니다.

Error Reporting은 각각의 고유한 오류, 스택 추적, 발생 내역을 보여주는 중앙 집중식 대시보드를 제공합니다. 또한 오류 발생 시 표시할 알림을 설정할 수 있습니다.

이 페이지는 여러 페이지로 구성된 가이드의 일부입니다. 처음부터 시작하여 설정 안내를 보려면 Python Bookshelf 앱으로 이동하세요.

설정 구성

이 섹션에서는 5-logging 디렉터리에서 코드를 사용합니다. 이 디렉터리에서 파일을 수정하고 명령어를 실행하세요.

  1. 수정하기 위해 config.py 파일을 열고 다음 값을 변경합니다.
    • [PROJECT_ID] 값을 Cloud Console에 표시되는 프로젝트 ID로 설정합니다.
    • [DATA_BACKEND] 값을 구조화된 데이터 사용 가이드에서 사용한 값과 동일하게 설정합니다.
    • Cloud SQL 또는 MongoDB를 사용하는 경우 Cloud SQL 또는 Mongo 섹션의 값을 구조화된 데이터 사용 단계에서 사용한 값과 동일하게 설정합니다.
    • [CLOUD_STORAGE_BUCKET] 값을 Cloud Storage 버킷 이름으로 설정합니다.
    • OAuth2 configuration 섹션에서 [GOOGLE_OAUTH2_CLIENT_ID][GOOGLE_OAUTH2_CLIENT_SECRET] 값을 이전에 만든 애플리케이션 클라이언트 ID 및 비밀번호로 설정합니다.

  2. 저장하고 config.py 파일을 닫습니다.

Cloud SQL을 사용하는 경우 다음을 수행합니다.

  1. 수정할 app.yaml 파일을 엽니다.
  2. cloudsql-instance 값을 config.py 파일의 [CLOUDSQL_CONNECTION_NAME]에 사용된 값과 동일하게 설정합니다. project:region:cloudsql-instance 형식을 사용하세요. 이 전체 줄의 주석 처리를 삭제합니다.
  3. 저장하고 app.yaml 파일을 닫습니다.

종속 항목 설치

가상 환경을 만들고 종속 항목을 설치하려면 다음 명령어를 사용합니다.

Linux/macOS

virtualenv -p python3 env
source env/bin/activate
pip install -r requirements.txt

Windows

virtualenv -p python3 env
env\scripts\activate
pip install -r requirements.txt

로컬 머신에서 앱 실행

  1. 로컬 웹 서버를 시작합니다.

    python main.py
    
  2. 웹브라우저에 다음 주소를 입력합니다.

    http://localhost:8080
    

작업자를 종료한 다음 로컬 웹 서버를 종료하려면 Control+C를 누르세요.

App Engine 가변형 환경에 앱 배포

  1. 샘플 앱을 배포합니다.

    gcloud app deploy
    
  2. 브라우저에 다음 URL을 입력합니다.

    https://PROJECT_ID.REGION_ID.r.appspot.com

    다음을 바꿉니다.

앱을 업데이트하는 경우, 앱을 배포하는 데 사용된 동일한 명령어를 입력하여 업데이트된 버전을 배포합니다. 배포하면 앱의 새 버전이 생성되고 기본 버전으로 승격됩니다. 이전 버전의 앱은 연결된 가상 머신(VM) 인스턴스와 마찬가지로 유지됩니다. 이러한 모든 앱 버전과 VM 인스턴스는 청구 가능한 리소스입니다. 비용을 줄이려면 기본 버전 이외의 앱 버전을 삭제합니다.

앱 버전을 삭제하는 방법은 다음과 같습니다.

  1. Google Cloud 콘솔에서 App Engine의 버전 페이지로 이동합니다.

    Versions로 이동

  2. 삭제할 기본이 아닌 앱 버전의 체크박스를 선택합니다.
  3. 앱 버전을 삭제하려면 삭제를 클릭합니다.

청구 가능 리소스 정리에 대한 자세한 내용은 이 가이드의 마지막 단계에서 삭제 섹션을 참조하세요.

오류 시뮬레이션

Error Reporting의 작동 방식을 확인하려면 의도적으로 코드에 실수를 도입한 다음 Cloud Console의 Error Reporting 페이지에서 예외를 찾습니다.

  1. bookshelf/crud.py에서 정의되지 않은 변수에 액세스하고 색인 뷰에 ReferenceError을 생성하는 작업을 추가합니다.

    @crud.route("/")
    def list():
       x[3]
    
  2. 앱을 배포합니다.

    gcloud app deploy
  3. 색인 페이지에 액세스합니다.

    gcloud app browse

    메시지 An internal error occurred를 볼 수 있습니다.

  4. Cloud Console에서 Error Reporting 페이지로 이동합니다.

    Python으로 이동

    나열된 오류를 확인할 수 있습니다.

    오류 보기

  5. 오류를 클릭하면 오류가 마지막으로 표시된 시간, 오류가 발생한 횟수, 발생 시간에 대한 히스토그램, 스택 추적과 같은 오류 관련 정보를 볼 수 있습니다.

코드 이해하기

처리되지 않은 예외를 보고하려면 코드에서 먼저 Flask errorhandler 데코레이터를 사용한 다음 Python용 Cloud 클라이언트 라이브러리를 사용하여 Error Reporting에 예외를 보고합니다.

@app.errorhandler(500)
def server_error(e):
    client = error_reporting.Client(app.config['PROJECT_ID'])
    client.report_exception(
        http_context=error_reporting.build_flask_context(request))
    return """
    An internal error occurred.
    """, 500

클라이언트는 자동으로 역추적 정보를 추가하고 도우미 함수를 사용하여 Flask 요청에서 관련 요청 세부정보를 추출합니다. 이렇게 하면 앱에서 처리되지 않은 비정상적 InternalServerError HTTP 500 예외에 관한 해당 스택 추적 및 HTTP 컨텍스트로 오류보고를 채웁니다.

정리

이 가이드에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.