Skip to content
GwiyeomGo Tech Blog
About GwiyeomGo

Golang(Go) Stack trace 를 어떻게 남기지?

GOLANG, 20223 min read

배경

고사이렌을 통해서 장애가 발생하면 개발자들이 볼 수 있도록 업무가 생성된다 이때 stacktrace 를 보여주려고 했지만 실패햇었다 현재 err 를 쌓을 때 현재 코드에 문제가 있어서 못함

작업내용

github 의 라이브러리를 받아서 사용 =>api 의 에러 발생 시 stack 에 쌓이도록 수정

에러 발생시 stack 을 고사이렌에 보내도록 수정

20220725

stacktrace 가 남겨지도록 log 를 사용했다. https://www.popit.kr/golang-error-stack-trace와-로깅/ 글을 보고 새 방식 도입

  • 고사인렌 : Dooray API 를 통해 장애 알림 시스템 작업에서 고사이렌 코드에사 stacktrace 를 같이 출력되도록 수정하고
  • API 에서 라이브러리를 사용해서 log 를 쌓도록 수정했다 => 전체 변경은 시간이 많이 걸리기 때문에 기부 관련 API 만 수정 => 500 장애 발생시 stack trace

stacktrace 를 알 수 있도록 다른 errors 패키지를 사용하자

배경

https://www.popit.kr/golang-error-stack-trace와-로깅/ 글을 읽고 DevOps/242 고사이렌에 에러 stack 을 출력한다에서 고사이렌에 stacktrace 가 출력되도록 수정했습니다.

위 글에서도 언급된것 처럼 github.com/pkg/errors 를 사용해서 errors 처리를 해야 자동으로 에러 발생지점을 알 수 있습니다.

문제

sharing service 는 HandleErrorResponse 를 통해서 에러 코드와 메세지를 생성합니다. (직접 커스텀 에러 헨들러를 만들어서 사용) 해당 방식으로는 에러 발생지점을 추적할 수 없어서 수동으로 log.Traceln("") 를 모든 함수 코드에 넣어서 log 관리를 하고 있습니다.

func (CourierAdminController) GetCourier(ctx echo.Context) error {
log.Traceln("")
...
return ctx.JSON(http.StatusOK, courierSummary)
}

변경내용

오류보고/753 기부 API 500번 에러의 stacktrace 기록되도록 코드 수정 에서

  • DonationAdminController
  • DonationController 만 수정

아래 이미치 처럼 500 에러 발생시 발생 함수를 알 수 있습니다. img_1.png

모든 함수에log.Traceln("") 써준 코드를 지우고 500 번 에러가 발생할 때만 errors.Wrap(err, "") errors.New(msg) 를 사용하고 나머지 400 , 404 의 경우 기존 customErrors.ValidationError("매장코드를 확인하여주세요") 처럼 그대로 사용

사용법

  1. 2개 errors 패키지를 import 해야합니다. 그래서 기존 errors 는 customErrors 로 변경해서 import 합니다.
import (
customErrors "sharing-platform-service/common/errors"
"github.com/pkg/errors"
)
  1. Controller -> Service -> Repository 를 호출하는 구조에서는 가장 마지막 발생하는 error 에 errors.Wrap(err, "") 를 사용합니다.
    • repository 이나 entity 파일에 적용
© 2024 by GwiyeomGo Tech Blog. All rights reserved.