아하 REST API 서버 개발 (14)
진짜 진짜 정말 무지하게 오랜만이에요 여러분!
매일같이 머리속에는 강좌를 써야지 써야지를 백번도 더 생각하지만 서비스를 운영하며 매일같이 할 일이 태산같아 처리를 하느라 너무 늦었습니다.
자 우리는 이제까지 실제 서비스에서 쓸 수 있을 정도의 REST API
를 작성해왔고 또, 어느정도 구색까지 맞춘 구조를 설계하였습니다.
하지만 실제 서비스에서 에러가 발생하여 로그로 기록되는 것 외에 다른 조치가 없다면 빠른 대응을 할 수가 없습니다.
그래서 이번 시간에는 실시간으로 에러에 민첩하게 대응할 수 있는 기초 전략에 대해서 썰을 풀어보겠습니다.
Error Log Tracking Solution
실제 서비스를 운영하다보면 다음과 같은 필요가 생기기 시작합니다.
- 서버에서 기록된 로그를 보려면 직접 서버에
ssh
로 접속하여tail -f
혹은lnav
등으로 로그를 봐야합니다. - 만약 로드밸런서를 붙이게 되면 로그가 분산되기 시작하므로 어떤 인스턴스에서 발생한 에러인지를 직접 찾아야합니다
- 무엇보다 실시간 알림 받기 위해서는 다양한 로그 레벨을 설정하여 알림 설정을 따로 구현해야 합니다.
이를 해결하기 위해서는 저렴하지만 위의 필요를 충족시켜줘야 할 패키지 혹은 솔루션을 찾게 되는데요.
여러 솔루션들이 있지만 가장 커뮤니티가 크고 검증되었으며 현재도 많은 서비스들을 지원하고 있는 대표적인 두가지 솔루션이 바로 Sentry
와 Rollbar
입니다.
어떠한 것들을 사용해도 비슷한 효과를 누릴 수 있으나, 저희 서비스에는 Sentry
가 적용되어 있기 때문에 Sentry
에 대해서 설명드릴 수 있도록 하겠습니다.
Sentry
는 python
으로 작성된 로그 취합, 분석 및 트래킹 시스템으로 github
에 오픈 소스로 공개 되어있으며 클라우드 서비스도 아래의 링크에서 제공받을 수 있습니다.
Sentry
무료 버전은 10,000개의 이벤트를 제공하고 일주일 분량을 백업본을 제공합니다.
비교적 간단한 서비스에서는 사용자가 수 천 ~ 수 만명까지도 무료로 충분히 사용하실 수 있으니 혜자스러움의 끝을 달리는 좋은 서비스입니다.
Sentry
자 그럼 일단 Sentry
에 가입하신 후 Express
프레임워크를 선택해 주십시오.
그러면 친절하게도 굉장히 친절한 가이드가 나오는데 해당 내용을 숙지하시고 아래와 같이 소스코드를 작성해 보자구요~
src/.env
SENTRY_DSN= 여러분의 DSN 을 추가해주세요
src/app.js
자 Sentry
를 이식하였으니 이제 실제로 Sentry
가 잘 작동하는지를 테스트 해 볼 시간입니다.
일단 테스트를 위해서 error.route.js
를 아래와 같이 작성해 보도록 합시다.
src/routes/error.route.js
그리고 Postman
으로 GET 127.0.0.1/v1/error
을 날려보시면 아래와 같이 Sentry
에 에러가 송출되고, 메일로 알림까지 받을 수 있는 것을 확인할 수 있습니다.
그런데 한가지 생각해봐야 할 것이 있습니다.
Sentry
는 물론 굉장히 혜자스러운 솔루션임에는 변함이 없으나, 무한정으로 무료로 사용하는 솔루션은 분명 아닙니다.
그러면 배포까지 많으면 수백 번을 테스트해야 하는 개발 환경에서 그때마다 수도 없이 많은 에러를 모두 Sentry
로 보내버리게 되면, 무료 카운팅을 실제로 사용할 수 없게 되어버립니다.
또한, 개발 환경에서는 바로 콘솔에 찍히는 에러 스택을 보며 디버깅을 하면 되니 배포 환경에서만 작동하도록 처리해주어도 충분합니다.
src/app.js
if (process.env.NODE_ENV === 'production') {
// 에러 핸들링 전 Sentry 로 캡쳐
const sentry = require('@sentry/node')
sentry.init({ dsn: process.env.SENTRY_DSN }) app.use(sentry.Handlers.errorHandler())
}
자 이제 배포 환경에서 에러가 발생하면 이메일로 노티가 오도록 설정하였습니다.
하지만 정신없이 서비스에 집중하다보면 이메일만으로는 충분하지 않을 수 있습니다.
그래서 Slack
등과 같은 메시징 솔루션으로 알림을 줄 수 있는 시스템을 백업차원에서 만드시는 것을 추천드립니다.
Slack Webhook
Node
에서 Slack
웹훅을 사용하시기 위해서는 아래의 패키지를 사용하시면 편하게 연동하실 수 있습니다.
자 그럼 언제나 그렇듯이 패키지를 설치하는 것으로부터 시작해 봅시다.
npm install @slack/client
패키지를 설치하신 후에 Slack
에서 Incoming Webhook
s 를 설정해 주시면 아래와 같은 Webhook
링크를 받으실 수 있습니다.
https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXX...
그럼 .env
안에 Webhook
을 추가해주도록 합시다.
.env
SLACK_WEBHOOK=https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXX...
그후에는 역시 app.js
에 아래와 같이 작성해줍시다.
자 이런식으로 작성을 하시게 되면 서버에서 예기치 못한 에러가 발생하였을 경우, 최소한 서버 자체에 Log
를 남기고, Slack
으로 에러가 발생했다고 안내하며 Sentry
가 일주일동안 Log
를 기록하고 이메일로도 안내하게 됩니다.
이정도면 어느정도의 트래픽에 도달하기 전까지는 충분히 실시간으로 에러를 대응할 수 있는 기본 시스템을 갖춰진 것 같습니다.
이제 어느정도 배포를 위한 서버를 기초작업은 정말 마무리가 된 것 같습니다.
남은것은 pm2
를 이용해서 서버에 직접 배포하는 부분과 docker
를 입혀서 이미지를 올리는 것 정도가 남은 것 같습니다.
언제가될지는 몰라도 꼭 남은 강좌 들고 다시 찾아뵙겠습니다.
감사합니다.
블록체인의 핵인싸 모스랜드가 아하에서 궁금증을 풀어드리고 있습니다.
일요일까지 질문하시고 10,000AHT 받아가세요^^
회원가입도 해주시면 강좌가 더 빨리 돌아온다는 사실!!!