한 걸음씩 기록하며

[트러블 슛팅] 버그 및 에러 관리 본문

항해 99 & 회고

[트러블 슛팅] 버그 및 에러 관리

Haksae 2022. 4. 13. 14:40
실전프로젝트가 게임 서비스 였기에, 서비스 특성상 예상치 못한 버그 및 에러가 속출하였다.
이에 대한 트러블 슛팅을 적어보고자 한다.

 

1. 문제 상황

  • 게임 서비스를 구현하며 가장 힘들었던 것이 바로 버그 및 에러를 잡아나가는 것이었다. (왜 내가 했던 게임들이 틈만 나면 업데이트를 한다는 건지 이제 알겠다..)
  • 게임을 개발해나가는 과정에서도 숱한 에러들로 밤을 지새웠는데, 유저 테스트를 위해 베타 서비스를 열자 버그와 에러가 이곳 저곳에서 나오기 시작했다.
  • 사실 버그와 에러가 나오는 것보다 더 문제인 것은, 버그와 에러 상황을 재현하는데 있었다.
  • 버그 및 에러를 잡기 위해서는 발생했던 상황을 재현하면서 잡아야하는데, 팀원들과 서버 로그를 계속해서 모니터링 하는 것도 물리적으로 불가능하고, 실제로 그렇게 하여도 재현이 어려운 경우가 많았다.
  • 우리는 버그와 에러를 잡기 위해서 더 디테일한 정보가 있어야겠다고 생각했다.

 

2. 해결 과정

1) 구글 설문지

  • 가장 먼저 해결방법으로 제시된 것은 구글 설문지였다. 피드백 및 에러 제보한 분에게 추첨을 통해 선물을 준다는 이벤트를 걸고, 유저로부터 구글 설문을 받았다.
  • 대략 25개정도의 피드백과 에러 제보를 받았고 이를 근거로 버그를 보완하려고 노력했다.

  => 그러나 1)의 방법으로는 모든 버그나 에러를 보완할 수 없었다.

  => 왜냐하면 버그나 에러를 재현하기 위한 정보가 부족했기 때문이다.

 

2) 버그 리폿

  • 에러나 버그를 잡으려면 발생했던 당시의 게임방과 유저들의 정보가 필요한데, 우리의 서비스는 게임이 끝나면 게임방과 유저들의 정보가 업데이트되기 때문에, 에러나 버그가 일어난 순간에 대한 정보가 없었다. 
  • 게임방 정보에 대한 로직은 변경하면 되지만, 유저에 대한 정보는 경기 후 업데이트가 필수적이었기 때문에, 게임방 안에서 유저가 바로 버그에 대한 제보를 하는 형식으로 이를 보완하면 어떨까는 제안이 나왔다.

  • 그래서 위의 그림과 같이 오류 보내기 버튼을 만들었다. 해당 버튼을 통해서 유저들이 게임방 내에서 오류를 제보하면, 서버에 제보 내용과 버그가 발생했던 당시의 유저와 게임방의 정보가 함께 저장된다.

3) PM2, Sentry를 통한 서버 로그 관리

  • 우리팀은 2)번의 방법으로는 버그를 잡기가 부족하고, 혹 제보를 안한다면 방법이 없다고 생각했다.
  • 당시 서버는 PM2로 무중단 서비스를 제공함과 동시에 PM2로 서버 로그를 한 파일에 저장하고 있었다. 그래서 우리는 PM2의 서버 로그를 효율적으로 관리하여, 2)번의 방법과 함께 사용하면 좋겠다고 생각했다.
  • 먼저 아래와 같이 PM2 Logrotate 모듈을 통해 서버 로그를 일자별로 관리하고, err로그와 out로그로 나누어서 저장하여 관리함으로, 로그로 에러를 파악하는데 효율을 높였다.

  • 더불어 프로젝트에 Sentry 설정을 하여 실시간으로 이메일로 에러 발생 정보를 받아 에러가 언제 일어났는지 정확히 파악할 수 있도록 셋팅했습니다.

 

 

3.  결과

  • 버그 리폿으로 약 20건 정도의 버그 제보가 들어왔고, 버그 리폿과 서버 로그를 통해서 상황을 최대한 재현하고 버그를 추적하여 계속해서 보완해나가고 있다.

*버그 및 에러 예시
1) 게임 진행 에러

- 에러 현상 : 게임방 입장시 화면이 렌더링되지 않거나, 돌이 안놔지는 오류
- 원인 : 유저별 게임 진행 환경의 차이로 인한 에러
- 해결 방법 : 게임방 페이지 로딩을 마지막 유저가 준비된 뒤에 렌더링하게함
2) 시간이 빨리가는 오류
- 에러 현상 : 갑자기 시간이 너무 빨리가는 오류
- 원인 : 소켓 통신시 2번 응답되면서 오류를 일으킴
- 해결 방법 : 소켓 통신이 1번만 되도록 제한
3) 게임 포인트 계산 오류
- 에러 현상 : 특정 유저들이 게임 포인트 계산이 되지 않는 오류
- 원인 : 게임방 입장시 socket 통신의 문제가 있는 경우 발생
- 해결 방법 : 모든 socket에서 state와 connect를 추적 관리하는 방식으로 해결 
등등.. 많이 있었지만 여기서 생략...^^
Comments