LabHub
배우기 러닝패스 코스

Debugging in Practice

From Traceback to Instrumentation

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

트레이스백에서 원인을 3분 안에 특정하고, 고치는 데서 멈추지 않고 다음번을 위한 계측까지 심을 수 있게 됩니다.

왜 중요한가

트레이스백은 아래에서 위로 읽습니다. 맨 아랫줄이 예외 종류와 이유를 말하고, 그 바로 위가 실제로 터진 코드 줄이며, 위쪽은 거기까지 도달한 경로입니다. 그리고 예외 메시지에는 대개 문제를 일으킨 실제 값이 들어 있어서, 그 값으로 원본 데이터를 검색하면 몇 초 만에 범인 행을 찾습니다.

또 하나 중요한 것은 트레이스백이 표준출력이 아니라 표준오류로 나간다는 사실입니다. 고객사 배치 잡의 크론 설정에 2>&1 이 빠져 있어서 몇 달째 실패 원인이 어디에도 안 남고 있는 경우가 정말 흔합니다. "로그에 아무것도 없다" 는 말을 들으면 이것부터 확인하세요.

마지막으로, 고치고 끝내면 다음 주에 같은 일이 반복됩니다. 건너뛴 행을 기록하게 만드는 한 줄이 다음번 조사 시간을 30분에서 1분으로 줄입니다. 이것이 계측 심기이고, 재현되지 않는 문제를 다루는 정공법이기도 합니다.

단계

  1. /root/trace 를 만들고 /opt/app/report.py/root/trace/report.py 로 복사하세요.
  2. 실패하는 실행의 출력을 표준오류까지 포함해 /root/trace/traceback.txt 에 저장하세요.
  3. 발생한 예외의 이름만 /root/trace/error_type.txt 에 적으세요.
  4. 실행을 처음으로 멈춰 세운 행의 id 값을 /root/trace/bad_row.txt 에 적으세요.
  5. /root/trace/report.py 를 사양대로 고쳐 종료 코드 0 으로 끝나게 만드세요.
  6. 고친 스크립트의 출력을 /root/trace/out.txt 에 저장하세요. rows=18 total=130400 이 나와야 합니다.
  7. 건너뛴 행을 한 줄에 하나씩 /root/trace/skipped.log 에 남기도록 계측을 넣으세요.
  8. 같은 스크립트를 /opt/data/orders_api.csv 에 대해 실행하고 출력을 /root/trace/out2.txt 에 저장하세요.

참고

작업 사본 만들기

/root/trace 를 만들고 /opt/app/report.py/root/trace/report.py 로 복사하세요.

/root/trace 를 만들고 /opt/app/report.py 를 그 안으로 복사하세요.

실패 원문 확보하기

실패하는 실행의 출력을 표준오류까지 포함해 /root/trace/traceback.txt 에 저장하세요.

트레이스백은 표준출력이 아니라 표준오류로 나갑니다. 리다이렉션에 2>&1 이 필요합니다.

예외 종류 적기

발생한 예외의 이름만 /root/trace/error_type.txt 에 적으세요.

트레이스백 맨 아랫줄의 콜론 앞부분이 예외 이름입니다. 이름만 적으세요.

최초 실패 행 특정하기

실행을 처음으로 멈춰 세운 행의 id 값을 /root/trace/bad_row.txt 에 적으세요.

예외 메시지에 실제 값이 들어 있습니다. 원본 CSV 에서 그 값을 가진 행의 id 를 찾으세요.

종료 코드 0 으로 만들기

/root/trace/report.py 를 사양대로 고쳐 종료 코드 0 으로 끝나게 만드세요.

docstring 의 사양에 유효한 행의 조건 세 가지가 적혀 있습니다. 조건에 맞지 않으면 건너뛰고 계속 진행해야 합니다.

집계 결과 저장하기

고친 스크립트의 출력을 /root/trace/out.txt 에 저장하세요. rows=18 total=130400 이 나와야 합니다.

고친 스크립트의 출력을 그대로 파일로 넘기세요. rows= 와 total= 두 값이 다 필요합니다.

건너뛴 행 기록하기

건너뛴 행을 한 줄에 하나씩 /root/trace/skipped.log 에 남기도록 계측을 넣으세요.

다음번에 같은 일이 나면 1분 만에 끝나도록 계측을 심는 단계입니다. 건너뛴 행 하나당 한 줄씩 남기세요.

다른 입력에 돌려 보기

같은 스크립트를 /opt/data/orders_api.csv 에 대해 실행하고 출력을 /root/trace/out2.txt 에 저장하세요.

오늘 데이터에만 맞춘 수정은 수정이 아닙니다. /opt/data/orders_api.csv 로 같은 스크립트를 돌려 결과를 저장하세요.