프로덕션 환경에서 발생한 에러를 놓치는 순간, 사용자 이탈과 매출 손실로 직결됩니다. 실시간 에러 모니터링 시스템은 장애를 즉시 감지하고 대응할 수 있게 해주는 필수 인프라예요.
Sentry를 활용한 기본 모니터링 설정
Sentry는 가장 널리 사용되는 에러 트래킹 도구입니다. Node.js 환경에서 빠르게 설정할 수 있어요.
const Sentry = require('@sentry/node');
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV,
tracesSampleRate: 0.1, // 성능 모니터링 샘플링
});
// Express 에러 핸들러
app.use(Sentry.Handlers.errorHandler());
환경 변수로 DSN을 관리하고, 샘플링 비율을 조정해 비용을 최적화하세요. 프로덕션 환경에서는 모든 에러를 캡처하되, 성능 트레이싱은 10% 정도만 수집하는 것이 효율적이에요.
슬랙 알림과 연동하기
에러 발생 시 팀원들에게 즉시 알려야 빠른 대응이 가능합니다. Webhook을 활용한 슬랙 연동 방법이에요.
const axios = require('axios');
async function sendSlackAlert(error, context) {
await axios.post(process.env.SLACK_WEBHOOK_URL, {
text: `🚨 에러 발생: ${error.message}`,
attachments: [{
color: 'danger',
fields: [
{ title: 'Environment', value: process.env.NODE_ENV },
{ title: 'User ID', value: context.userId || 'Anonymous' },
{ title: 'Stack', value: error.stack.slice(0, 200) }
]
}]
});
}
중요도에 따라 알림 채널을 분리하면 좋아요. Critical 에러는 긴급 채널로, Warning은 일반 모니터링 채널로 보내는 방식이죠.
커스텀 에러 수집 및 집계
특정 비즈니스 로직에서 발생하는 에러는 별도로 추적하고 집계해야 합니다. Redis를 활용한 간단한 집계 시스템이에요.
class ErrorAggregator {
async trackError(errorType) {
const key = `error:${errorType}:${this.getHourKey()}`;
await redis.incr(key);
await redis.expire(key, 86400); // 24시간 보관
const count = await redis.get(key);
if (count > 100) await this.alertHighFrequency(errorType);
}
}
시간대별로 에러 빈도를 추적하면 패턴을 파악할 수 있어요. 특정 시간대에 에러가 급증하면 자동으로 알림을 보내도록 설정하세요.
에러 우선순위와 필터링 전략
모든 에러를 동일하게 처리하면 중요한 알림을 놓칠 수 있습니다. 우선순위 기반 필터링이 필수예요.
- Critical: 결제, 인증 실패 → 즉시 알림
- High: API 타임아웃, DB 연결 실패 → 5분 내 알림
- Medium: 외부 API 실패, 캐시 미스 → 집계 후 알림
- Low: 클라이언트 유효성 검증 실패 → 로그만 기록
알려진 에러(예: 봇 트래픽)는 필터링해서 노이즈를 줄이세요. beforeSend 훅을 사용하면 Sentry 전송 전에 필터링할 수 있어요.
주의사항
에러 로그에 민감한 정보(비밀번호, 토큰, 개인정보)가 포함되지 않도록 주의하세요. Sentry의 beforeSend 콜백에서 데이터를 스크러빙하거나, 환경 변수를 직접 로깅하지 않는 습관이 중요합니다.
결론
실시간 에러 모니터링은 단순히 Sentry를 설치하는 것을 넘어, 우선순위 설정과 적절한 알림 전략이 핵심이에요. 커스텀 집계 시스템을 추가하면 비즈니스 특성에 맞는 모니터링이 가능하고, 슬랙 연동으로 팀 전체가 빠르게 대응할 수 있습니다. 처음엔 기본 설정으로 시작해서 점진적으로 개선해나가세요.