Sentry
Sentry 기능 정리
2025.12.27
- sentry
- issue tracking
- monitoring
목차
배경
실제로 어떤 서비스를 운영하다 보면 런타임 에러가 발생할 수 있다. 이런 에러를 트래킹하고 모니터링하는 것은 서비스의 안정성을 보장하기 위해 필수적이다. 에러 트래킹 도구로 많이 사용하고 있는 Sentry에 대해 자세히 알아보고 싶어 정리하는 시간을 가졌다.
설치법
https://docs.sentry.io/platforms/javascript/guides/nextjs/ 를 보면 알 수 있다. (nextjs 사용한다고 가정)
npx @sentry/wizard@latest -i nextjs 를 통해 깔기전에 아래와 같인 전제조건이 필요하다
- A Next.js application (nextjs 어플리케이션)
- A Sentry account and project (계정과 프로젝트 세팅)
FEATURES
Sentry에서 제공하는 여러가지 기능에 대해 알아보았다.
1.Capturing Errors - 오류포착
Sentry SDK를 설치하고 나면 우리 에플리케이션의 런타임 시 발생하는 에러는 자동으로 캡쳐되어 보고된다.
즉, 에러를 캡쳐하는 별도의 코드가 필요없다는 이야기이다. 보고된 에러들은 우리 대시보드에서 확인 할 수 있다.
Capturing Errors
SDK를 어플리케이션에 설치해도 우리는 직접적으로 에러를 아래 코드처럼 직접 캡쳐하여 보고 할 수 있다.
그리고 우리는 Error 객체 말고도 non-Error 객체나 string을 전달 할 수도 있다.
대신 당연한 이야기이지만 에러가 아닌 객체나 string을 전달하면 stack trace 정보는 누락될 수 있다.
import * as Sentry from '@sentry/nextjs'
try {
aFunctionThatMightFail()
} catch (err) {
Sentry.captureException(err)
}Capturing Errors in error.js Files
Next.js에는 error.js 라는 특별한 기능을 하는 파일이 있다.
이 파일은 프로젝트 내에서 예외가 발생하면 자동으로 호출되면서 fallback UI역할을 한다.
이 파일은 에러 핸들링을 위해서 존재하며 Sentry가 하는 error 핸들링보다 더 우선순위를 갖는다.
즉, error.js 에 의해 핸들링되는 error는 error.js 파일 내부에서 수동으로 에러를 capture해서 리포팅 해야한다.
( 이 부분은 프로젝트 활용 시 주의해야 할 것 같다.)
"use client";
import { useEffect } from "react";
import * as Sentry from "@sentry/nextjs";
export default function ErrorPage({
error,
}: {
error: Error & { digest?: string };
}) {
useEffect(() => {
// Log the error to Sentry
Sentry.captureException(error);
}, [error]);
return (
<div>
<h2>Something went wrong!</h2>
</div>
);
}Capturing Messages
아래와 같이 특정 메시지를 캡쳐하고 위험도를 설정하여 리포팅할 수 있다.
위험도는 아래와 같이 설정할 수 있다.("fatal" | "error" | "warning" | "log" | "debug" | "info" (default))
Sentry.captureMessage('Something went wrong')
// optionally specify the severity level:
// "fatal" | "error" | "warning" | "log" | "debug" | "info" (default)
Sentry.captureMessage('Something went wrong', 'warning')2.Source Maps - 소스 맵
런타임시 발생하는 에러가 리포팅 되면 우리는 스택트레이스를 통해 에러가 발생된 코드를 확인할 수 있다.
그런데 소스맵이 없다면 그 에러가 발생한 코드를 봐도 minified 되어 있기에 읽기가 불편하다.
참고로 소스맵에는 번들 파일의 특정 줄/컬럼 <-> 원본 파일 몇 번째 줄, 파일 경로, 변수/함수명 같은 정보들이 있기에 번들링 되기 전 소스를 파악할 수 있다.
@sentry/nextjs SDK를 설치하면 이런 소스맵은 자동으로 생성되기에 이런 불편함을 해소 할 수 있다.
참고로 소스 맵은 프로덕션 빌드 중에만 생성된다, 즉 next build에서만 생성되고, 개발빌드 (next dev) 에서는 업로드용 소스 맵이 생성되지 않는다고 한다.
필자는 처음에 그런줄도 모르고 왜 Stack trace 정보가 minified 되어있어서 꽤 해메었다.
필자가 직접 테스트해본 결과 소스맵 생성에 있어서 auth token 설정이 필요해 보인다.
처음 sentry 설치시 npx @sentry/wizard@latest -i nextjs 를 통해 설치하면 자동으로 소스맵 생성을 위한 auth token 설정이 된다.(sentry 계정이 존재한다는 가정하에)
만약 auth token 을 발급받지 못했다면 센트리에 접속하여 로그인 하고 좌측패널 Settings -> Developer Settings -> Organization Tokens 에 접속해서 Create New Token 버튼을 클릭하여 생성할 수 있다.
이렇게 생성된 생성된 auth token 을 환경변수에 넣어두고 아래와 같이 next.config.js 에 설정해주면 된다.
// next.config.js
const { withSentryConfig } = require("@sentry/nextjs");
module.exports = withSentryConfig(
{
// your existing Next.js config
},
{
...
authToken: process.env.SENTRY_AUTH_TOKEN,
},
);3.Logs (!New) - 로그
런타임시 발생하는 이슈들을 리포팅하는 것 외에도 텍스트 기반 로그 정보를 의도적으로 전송할 수 있다.
그리고 그런 텍스트 기반 로그들을 텍스트 문자열로 검색하거나 개별 속성을 사용하여 검색 할 수 있다.
이 기능은 9.41.0 Sentry SDK 버전 이상부터 사용할 수 있고 이를 사용하기 위해서는 enableLogs 옵션을 true로 설정해야 한다.
사용법
아래와 같이 다른 레벨의 로그를 전송할 수 있다. 6가지가 있다고 한다. ( trace, debug, info, warn, error, 및 fatal)
Sentry.logger.error(Sentry.logger.fmt`Uh oh, something broke, here's the error: '${error}'`)
Sentry.logger.info(Sentry.logger.fmt`'${user.username}' added '${product.name}' to cart.`)여기서 보면 fmt를 이용하여 로그를 남기면 속성을 삽입하는 형태로 보고 대시보드 로그 UI에서 검색할 수 있고 별도의 열이 추가된다고 한다. 즉, 저 fmt를 이용하지 않고 그냥 literal형태로 남기면 말한 기능들은 안되는 것 같다.
Sentry.logger.trace('Starting database connection', { database: 'users' })
Sentry.logger.debug('Cache miss for user', { userId: 123 })
Sentry.logger.info('Updated profile', { profileId: 345 })
Sentry.logger.warn('Rate limit reached for endpoint', {
endpoint: '/api/results/',
isEnterprise: false,
})
Sentry.logger.error('Failed to process payment', {
orderId: 'order_123',
amount: 99.99,
})
Sentry.logger.fatal('Database connection pool exhausted', {
database: 'users',
activeConnections: 100,
})그런데 굳이 fmt를 안써도 이렇게 파라미터로 넘겨주면 fmt를 이용하여 로그를 남긴것과 같은 효과를 줄 수 있다고 한다. 결국 선택인 것 같다. 위와 같은 형태는 error message내에 속성들이 포함되진 않는다.
Sentry.getGlobalScope().setAttributes({
is_admin: true,
auth_provider: 'sentry',
})
Sentry.withScope((scope) => {
scope.setAttribute('step', 'authentication')
// scope attributes `is_admin`, `auth_provider` and `step` are added
Sentry.logger.info(`user ${user.id} logged in`, { activeSince: 100 })
Sentry.logger.info(`updated ${user.id} last activity`)
})
// scope attributes `is_admin` and `auth_provider` are added
Sentry.logger.warn('stale website version, reloading page')10.32.0 이상 부터는 위와 같이 스코프 API를 이용하여 특정 스코프내에서 전역적으로 모든 로그에 특정 속성을 설정할 수 있다고 한다.
여기까지 주요 사용법이다. 이 외에도 여러가지 로깅관련 추가 기능들이 있는데 필요할때 https://docs.sentry.io/platforms/javascript/guides/nextjs/logs/ 를 참고하면 될 것 같다.
4.Session Replay - 세션 다시보기
세션 리플레이 기능은 오류가 발생했을 때의 사용자 행동을 비디오처럼 재현해주는 기능인데 요금을 많이 먹는다. 딱히, 현재하는 프로젝트에서는 사용하지 않을 것 같아 자세히 보지는 않았다. 나중에 필요할때 아래를 참고하면 될 것 같다. https://docs.sentry.io/platforms/javascript/guides/nextjs/session-replay/
5.Tracing - 추적
트레이싱 기능은 에러 트래킹 보단 성능적인 모니터링을 위한 기능으로 보인다.
예를 들어 트랜잭션 단위 실행시간 측정 ( DB 쿼리, 페이지 로드, API호출 등 ) 등을 측정할 수 있을 것으로 보인다.
모든 트랜잭션을 다 측정하기엔 너무 많기에 sample rate를 조정할 수 있다고 한다.
추후 프로젝트를 고도화 할 때 사용해보면 좋을 것 같다. (https://docs.sentry.io/platforms/javascript/guides/nextjs/tracing/)
6.Metrics (Beta) - 메트릭
이 기능 역시 이슈 트래킹 보단 성능 모니터링을 위한 기능으로 보인다. 내용을 확인하면 아래와 같은 기능들로 구성되어 있고 여러 준비된 계측 api를 이용하여 애플리케이션의 성능을 수치적으로 측정할 수 있다. 아직은 베타 버전이라고 한다.
Counter - 버튼이 몇번 눌렀는지와 같은 정보 카운팅
Sentry.metrics.count('button_click', 1)Gauge - 현재 메모리 사용량과 같은 정보 측정
Sentry.metrics.gauge('queue_depth', 42)Distribution - 특정 request 단위 성능 측정
Sentry.metrics.distribution('response_time', 187.5)이 기능 역시 현재 프로젝트에서는 사용되진 않을 것 같고 나중에 필요할때 아래를 참고하면 될 것 같다.
https://docs.sentry.io/platforms/javascript/guides/nextjs/metrics/
7.Profiling - 프로파일링 (브라우저 프로파일링)
우리는 웹 성능을 확인하거나 디버깅할 때 브라우저 개발자 도구를 열고 프로파일링을 할 수 있는데 여기서 말하는 프로파일링도 동일한 의미로 사용된 것이다. 센트리에서 실제 사용자 데이터를 수집하여 사용자환경으로 프로파일링 기능을 제공할수 있다고 한다. 즉, 사용자 환경에서의 성능 모니터링을 할 수 있다는 이야기이다. 참고로 브라우저 프로파일링 API는 현재 크로미움 기반 브라우저에서만 구현되어 있기 크로미움 기반 브라우저 사용자들의 데이터만 수집할 수 있다고 한다. 데이터 수집 샘플링 비율은 설정가능하다고 한다. 나중에 필요할때 아래를 참고하면 될 것 같다. https://docs.sentry.io/platforms/javascript/guides/nextjs/profiling/
8.Crons
주기적으로 실행되는 작업을 모니터링 할 수 있는 기능이다. 예를들어 db 백업, 데이터 동기화 작업 등을 모니터링 할 수 있는 기능으로 이런 주기적인 작업들이 실패하면 원인에 대해 알람을 받을 수 있다.
9.User Feedback
내가 배포한 서비스에서 사용자가 직접 리포트를 낼 수 있는 기능이다. 이 기능을 사용하기 위해서는 위젯을 깔아야 하고 꼭 에러가 발생하지 않아도 사용자가 애플리케이션에 대한 피드백을 보낼 수 있는 것으로 보인다.
느낀점
처음에 Sentry가 이슈 트래킹 도구로만 사용되는 줄 알았는데 알고보니 모니터링 도구로도 사용될 수 있다는 것을 알게 되었다. 아직 실제 서비스에 붙여서 운영해본적이 없는데 얼른 적용해서 에러 트래킹과 모니터링을 해보고 싶다.
참고
- https://tech.kakaopay.com/post/frontend-sentry-monitoring/
- https://techblog.woowahan.com/21604/
- https://www.postype.com/@team/post/18407805
- https://engineering.linecorp.com/ko/blog/log-collection-system-sentry-on-premise
- https://docs.sentry.io/platforms/javascript/guides/nextjs/
번외
에러 트래킹 vs 모니터링
에러 트래킹(Error Tracking)과 모니터링(Monitoring)은 비슷해 보이지만 다른 개념이다.
에러 트래킹 (Error Tracking)
- 목적: 특정 에러가 발생했을 때 이를 추적하고 기록하는 것에 초점
- 범위: 에러 발생 시점, 스택 트레이스, 사용자 컨텍스트 등 에러 자체에 대한 정보
- 예시:
- JavaScript 런타임 에러 발생 시 자동으로 캡처
- 에러 발생 빈도 추적
- 에러별 그룹핑 및 중복 제거
모니터링 (Monitoring)
- 목적: 애플리케이션의 전반적인 상태를 지속적으로 관찰
- 범위: 성능 메트릭, 리소스 사용량, API 응답 시간등
- 예시:
- 서버 CPU/메모리 사용률
- API 엔드포인트 응답 시간
- 사용자 세션 추적
- 트랜잭션 성능 분석
관계
에러 트래킹은 모니터링의 한 부분이다. 모니터링이 더 넓은 개념이며, 에러 트래킹은 그 중에서도 에러에 특화된 부분이다.
Sentry는 주로 에러 트래킹 도구로 알려져 있지만, 최근에는 Performance Monitoring 기능도 추가되어 전반적인 모니터링도 가능하다.