SpringBoot 프로젝트에 Sentry 에러 모니터링 도입하기
도입 배경
프로젝트를 진행하면서 에러가 발생했을 때 가장 아쉬웠던 부분이 바로 로그 보기였다.
특히 여러명이 작업하던 중 프론트엔드에서 로그를 봐달라는 요청이 들어오면 여러 로그들이 섞여있어 해당 로그를 찾는데 시간이 소요되었다.
또한 어느 정도 시간이 흐른뒤 로그를 보려면 로그 페이지에서 열심히 스크롤을 내리거나 grep 등의 쉘 명령어로 찾아야 했다.
이러한 상황을 겪고 로그 시스템 또는 에러 모니터링 시스템 구축의 필요성을 느끼게 되었고, 같은 백엔드 팀원과의 회의 끝에 에러 모니터링 시스템인 Sentry를 사용해보기로 결정하였다.
Sentry란?
: 애플리케인션의 오류 및 성능 문제를 추적하고 모니터링할 수 있도록 돕는 오픈 소스 오류 추적 및 모니터링 도구
: 애플리케이션에서 발생하는 오류를 실시간으로 감지하고 알림을 통해 문제를 신속히 해결할 수 있돌고 함
주요기능
- 오류 추적 : 애플리케이션에서 발생하는 예외나 에러를 자동으로 수집하고 상세한 정보를 제공
- 성능 모니터링 : 애플리케인션의 성능 데이터를 분석하여느리거나 비효율적인 부분을 식별
- 다양한 플랫폼 지원 : JavaScript, Python, Java, PHP, Ruby, .NET, Go, iOS, Android 등 대부분의 언어와 플랫폼을 지원
- 알림 시스템 : 문제 발생시 이메일, Slack 등 다양한 채널을 통해 알림을 보내도록 설정 가능
- 통합 기능 : GitHub, GitLab, Jira 등과 같은 협업 도구와 통합하여 문제 추적 및 해결 과정을 더 효과적으로 관리할 수 있음
SpringBoot 프로젝트에 Sentry 도입하기
Sentry의 무료 요금제로 진행하고 있는 SpringBoot 프로젝트에 통합해보자
1. Sentry 계정 생성
Application Performance Monitoring & Error Tracking Software | Sentry
우선 sentry에 접속하여 계정을 생성한다.
이제 프로젝트를 생성하기 위해 Start 버튼을 클릭한다.
연결할 프로젝트의 플랫폼을 선택한다. SpringBoot 프로젝트에 연결할 것이므로 SpringBoot를 선택한다.
다음으로 Spring Boot에서 Sentry를 연결하는 방법에 대한 설명 페이지로 연결된다.
Sentry에서 처음 연결하는 사람들을 위해 친절하게 설명하고 있으니 이대로 연결하거나 또는 아래의 내용을 참고해 연결해보자
위 화면에서 연동시 사용할 인증토큰과 DSN 값을 확인할 수 있다.
2. 스프링 부트 프로젝트에 Sentry 설치
먼저, 프로젝트의 build.gradle 파일에 플러그인을 설치하고 관련 설정을 추가한다.
plugins {
id "io.sentry.jvm.gradle" version "4.3.0"
}
sentry {
includeSourceContext = true
org = "catsriding"
projectName = "waves-server"
authToken = System.getenv("SENTRY_AUTH_TOKEN")
}
여기서 sentry에서 발급받은 인증 토큰이 사용되는데, 토큰 노출을 막기 위해 gradle.properties 파일을 생성해 인증 토큰을 등록해둔다.
이때 build.gradle이 있는 루트파일에 위치하도록 파일을 생성한다
SENTRY_AUTH_TOKEN = 여기에 인증토큰 입력
이후 깃허브에 올라가지 않도록 .gitignore 파일에 해당 파일을 등록해둔다.
3. Sentry 관련 설정
다음으로 application.yml 파일에 설정을 추가한다.
sentry:
dsn: ${https://examplePublicKey@o0.ingest.sentry.io/0}
# Set traces_sample_rate to 1.0 to capture 100%
# of transactions for tracing.
# We recommend adjusting this value in production.
tracesSampleRate: 1.0
위의 코드는 온보딩 페이지에서 제공하고 있는 코드로 여기에 여러 옵션들을 추가할 수 있다.
크게 3가지 설정을 뜯어보자
- dsn
- Data Source Name의 약자로, sentty로 오류 및 이벤트를 보내기 위한 프로젝트의 고유 식별자로 사용되는 값
- Sentry SDK는 이 DSN 값을 통해 정확한 Sentry 프로젝트로 오류를 보내게 된다.
- API 키 와 Sentry 서버의 주소, 프로젝트 ID로 구성되어 있다.
- traces-sample-rate
- Sentry에서 수집하는 트랜잭션 데이터의 비율을 설정
- 트랜잭션 데이터 중 얼마만큼을 Sentry 가 수집하여 분석할 건지 결정하는 설정
- ex.
- 1.0 : 샘플링 비율이 100%로 sentry가 발생하는 모든 트랜잭션 데이터를 수집하도록 설정한 것
- 0.1 : sentry가 발생하는 트랜잭션 데이터 중 10%만 수집
- exception-resolver-order
sentry:
exception-resolver-order: -2147483647
default로 unhandled exception 만 sentry로 보내지는데 이 속성을 통해 보내지는 값을 조절 할 수 있다.
ex. -2147483647 로 설정
: the value of org.springframework.core.Ordered#HIGHEST_PRECEDENCE
: @ExceptionHandler 애노테이션을 통해 handled 되는 예외도 전달됨
- 추가 옵션은 https://docs.sentry.io/platforms/java/configuration/options/ 공식 문서를 참고하여 설정할 수 있다.
- 또한 로깅 시스템과 통합하여 사용 가능하다. (ex. Logback, Log4j 2)
https://docs.sentry.io/platforms/java/guides/spring-boot/logging-frameworks/
4. 테스트
아래의 코드를 추가해 테스트 해보자
import io.sentry.Sentry;
try {
throw new Exception("This is a test.");
} catch (Exception e) {
Sentry.captureException(e);
}
코드 실행 후 sentry 페이지에서 에러가 잘 넘어오는 것을 확인했다면 성공!
cf) mvc 패턴으로 간단한 API로 테스트 하는 방법은 아래의 블로그를 참고
https://www.catsriding.com/posts/improving-spring-boot-application-monitoring-using-sentry
여기까지 했다면 Sentry연동은 성공한 것!
이제 옵션들과 사용법 등에 대해 공부해야겠다!
참고한 블로그
https://www.catsriding.com/posts/improving-spring-boot-application-monitoring-using-sentry
https://dico.me/article/spring-boot/416/ko