안수찬 블로그

Sentry 를 이용한 Node.js 에러 모니터링

Introduction

안수찬 @dobestan

안수찬 @dobestan

서울대학교에서 컴퓨터공학을 전공하고, 오랜 기간 서비스 기획 및 개발을 해 왔습니다. 이러한 전문성을 인정받아 미래부 소프트웨어 마에스트로에 선정된 바 있습니다. 현재는 모바일 방송국, 퍼스트캔버스에서 컨텐츠로 새로운 가치를 그리고 있습니다. 나는 안수찬이다. 그러므로 나는 할 수 있다. me@ansuchan.com


nodejs

Sentry 를 이용한 Node.js 에러 모니터링

Posted by 안수찬 @dobestan on .
Featured

nodejs

Sentry 를 이용한 Node.js 에러 모니터링

Posted by 안수찬 @dobestan on .

제 블로그는 Ghost 를 이용해서 운영되고 있습니다. 저는 이 블로그 툴을 주변의 개발자 분들에게 강력하게 추천하고 있는데 그 이유는 다음과 같습니다:

  • Programmable 하다. ( 물론 wordpress 도 programmable 하고, PHP 를 안다면 수정할 수 있기는 합니다만... )
  • Markdown 이 기본적으로 지원된다.
  • (Github Pages 에 비해서 상대적으로) SEO(Search Engine Optimization; 검색최적화) 가 잘 된다.
  • (워드프레스에 비해서) 빠르고 가볍다.

GhostNode.js, Express.js, Ember.js, Handlebars.js 기반의 Blog Platform 입니다. 제가 자주 사용하는 기술 스택이다 보니 시간이 날 때 마다 소소한 기능들을 붙이고 몇 가지 실험들을 해보고 있습니다. 그러면서 분명히 제가 예상하지 못했던 이슈들도 발생을 하고 있는데, 이를 정확하게 Tracking 하고 이슈들을 해결하기 위한 방법이 필요했습니다. 이 포스트에서는 제가 블로그에 직접 적용을 한 "Node.js 로 운영되고 있는 서비스의 Error Monitoring" 과 관련된 내용을 다룹니다.

다양한 Error Tracking 솔루션들

GetSentry.com

Sentry's real-time error tracking gives you insight into production deployments and information to reproduce and fix crashes.

평소에 Error Monitoring 을 하면서 주로 써왔던 서비스를 그대로 사용했습니다. 백엔드 개발을 하면서 도입할 수 있는 Error Monitoring 솔루션들은 시중에 꽤 많이 나와 있습니다. 아니, 꽤 많은게 아니라, 정말 정말 있습니다. 제가 블로그에 연동이 필요했던 기능은 다음과 같습니다:

  • 쉬울 것 ( Easy )
  • 무료일 것 ( Free )
  • 다른 툴과의 통합이 쉽게 이루어질 것 ( 예, "Slack Integration", "Github Issue Integration", "Custom Webhooks" 등 )

사실 이 조건에 부합하는 솔루션들은 찾아보니 꽤 많았습니다. 제가 최종적으로 선택한 Sentry 도 있었지만, track.js, airbrake.io, raygun 등의 서비스도 있었습니다. 이 포스트에서는 Sentry 를 이용해서 Error Monitoring 기능을 붙여보고, Slack Integration 을 구축하는 방법에 대해서 까지 다룹니다.

Sentry

Sentry 는 에러 로깅/모니터링을 위한 웹 어플리케이션입니다. 관련해서는 다음의 글에도 간략하게 설명되어 있습니다:

Sentry with Node.js

제 블로그의 Error Tracking 목적으로는 self-hosted Sentry 를 굳이 사용할 필요가 없어서, getSentry.com 를 사용했습니다. 새로운 프로젝트에 대한 "팀"을 생성하고 이와 관련된 "프로젝트"를 생성을 하면 됩니다. 저 같은 경우에는 개인 프로젝트들을 Sentry 로 모두 관리하고 있어서 "dobestan" 이라고 하는 Organization 으로 운영을 하고 있습니다. 그 안에서 혼자서 관리하는 프로젝트는 "default" Team 안에 "blog" 프로젝트를 생성하였습니다.

GetSentry Dashboard
Sentry Dashboard

새로운 팀/프로젝트를 생성하면 이렇게 프로젝트에 발생한 Issue 들을 모아서 보여주게 됩니다. Error 가 발생하면 새로운 Issue 로 등록될 예정입니다.

이렇게 Sentry 에서 새로운 프로젝트를 생성을 하고 난 이후에는, Sentry Client 에서 에러를 보낼 수 있도록 설정을 해줘야 합니다. Sentry Client 로는 각각의 백엔드별로 구현된 Raven 을 이용해서 설정을 하게 됩니다. 관련해서는 공식 문서 를 살펴보시면 조금 더 자세하게 살펴보실 수 있습니다. 저 같은 경우에는 Node.js 를 사용하고 있어서 raven-node 로 진행을 하였습니다.

$ npm install --save raven
// sentry.js

module.exports = function() {  
  var raven = require('raven');
  var client = new raven.Client('DSN');

  client.patchGlobal();
}
// index.js
require("./sentry")();  

저 같은 경우에는 Ghost 블로그의 새 업데이트가 release 되면 바로 반영을 하는 편인데, 이 때 index.js 가 수정되는 일이 자주 있어서 sentry.js 를 별도의 파일로 분리해서 버전관리를 하고 있습니다. 물론 Express 프레임워크를 사용하고 계시다면 다음과 같이 Error Handling Middleware 에서 처리해줄수도 있습니다:

// index.js

app.use(raven.middleware.express.requestHandler("DSN"));

// Routers ...

app.use(function(err, req, res, next) { ... });  
app.use(raven.middleware.express.errorHandler("DSN"));  

이렇게 설정을 하고 강제로 에러를 발생시켜보면, 다음과 같이 결과가 바로 Sentry Dashboard 에 트래킹되는 것을 확인할 수 있습니다. 이러한 에러는 추후에 대쉬보드에서 Stack Trace 를 자세하게 살펴보거나, 분류해서 쉽게 처리할 수 있습니다.

Sentry Dashboard Result

강제로 Error 를 발생시켜서 테스트를 해 보았는데, 다음과 같이 에러가 발생한 시점의 정보들이 트래킹되고 대쉬보드에서 바로 확인할 수 있다.

Slack Integration

물론 기본적으로 Email Notification 이 활성화 되어 있어서 바로 이메일로 확인할 수 있기는 하지만, Slack 에서 모든 정보를 확인하고 싶기에 Sentry 와 Slack 을 연동해서 바로 에러 메시지를 확인할 수 있도록 설정했습니다. ( 현재 블로그를 운영함에 있어 github, travis 등 다른 Slack Integration 들은 모두 적용되어 있는 상태입니다. ) 다른 Slack Integration 과 유사하게

  1. Slack Apps 에서 Sentry Integration 설정을 하여 webhook url 을 발급받고,
  2. getSentry 에서 Slack Integration 발급받은 webhook url 을 등록해주시면 됩니다.

Sentry 의 경우에는 "Webhook" 형태로 Slack 과 연동할 수 있도록 되어 있습니다. 즉, 에러가 발생하면 Sentry 에서 Webhook ( HTTP Push API ) 형태로 Slack 에 데이터를 전송하고 데이터를 받은 Slack 이 받은 정보를 바탕으로 적절한 채널에 메시지로 뿌려주는 역할을 합니다.

Slack Integration Settings

Slack Apps 에 접속하여 Sentry 를 연동하여, 새로운 webhook 주소를 발급받습니다.

Slack Integration Settings

프로젝트 대쉬보드 > Settings > Integrations 항목에서 Slack 과 관련된 설정을 해주시면 됩니다.

정리하며

Slack Sentry Integration

이렇게 설정을 완료하고 나면, 에러가 발생한 시점에 바로 Slack Message 형태로 Notification 이 오는 것을 확인할 수 있습니다.

이렇게 Slack Integration 까지 완료해주면 어느정도 쉽게 에러를 트래킹하고 모니터링 할 수 있는 환경이 갖춰졌다고 생각합니다. 즉, 다음과 같은 프로세스가 자동화 됩니다.

  • Error 가 발생하면, Sentry 에 트래킹되며,
  • 에러에 따라서, Github Repository 의 Issue 에 등록되며,
  • 발생한 에러는 Slack 에서 확인할 수 있게 됩니다.

앞으로도 블로그를 조금씩 조금씩 더 나은 방향으로 개선하여, "지속적 통합(Continuous Integration) 을 넘어서서, 지속적 배포(Continuous Deployment) 까지 하는 것"을 목표로 하고 있습니다. 따라서 다음의 작업들이 진행될 예정입니다:

  • Travis CI 에서 테스트가 통과되면 자동으로 배포하기
    • 로컬에서 쉽게 블로그 수정하고 테스트 할 수 있도록 환경 갖추기
  • 현재는 직접 블로그 인스턴스에 접속해서 일부 작업을 하고 있는데, ansible 로 설정해서 앞으로는 서버 인스턴스에 직접 접속하는 일이 없도록 하기
  • 현재는 (이유없이) forever로 노드 프로세스를 돌리고 있는데, StrongLoop Process Manager, pm2 와 비교해서 제일 적합한 것으로 개선하기
  • 현재는 어플리케이션 스택 자체는 잘 구분되어 있어서 docker container 로 쉽게 변경할 수 있는데, 시간을 내서 얼른 반영하기
    • 이렇게 수정되면 또 배포 부분을 조금 더 쉽게 할 수 있을 것 같은데, 이것도 공부해서 반영하기
안수찬 @dobestan

안수찬 @dobestan

https://ansuchan.com/

서울대학교에서 컴퓨터공학을 전공하고, 오랜 기간 서비스 기획 및 개발을 해 왔습니다. 이러한 전문성을 인정받아 미래부 소프트웨어 마에스트로에 선정된 바 있습니다. 현재는 모바일 방송국, 퍼스트캔버스에서 컨텐츠로 새로운 가치를 그리고 있습니다. 나는 안수찬이다. 그러므로 나는 할 수 있다. me@ansuchan.com

View Comments...