그동안 개발 환경에서 EC2 서버에 문제가 생기거나, 혹은 code deploy를 통한 배포 자동화 과정에서 문제가 발생할 때 바로 상황을 파악하지 못했던 적이 종종 있다. 어떤 방식으로든 개발자에게 알림이 가게끔 환경을 구축했다면 좋았겠지만, 사실 개발 단계에서는 실시간으로 알림을 받아 볼 필요성을 크게 느끼지 못했다. 그렇지만 프로덕션 환경에서는 이 문제를 분명 개선할 필요가 있었다.
우리에게 필요한 건 자동화된 모니터링 도구였다. 더 이상 배포가 잘 되었는지, 서버가 잘 돌아가고 있는지, 장애가 난 포인트는 없는지 등을 직접 확인하지 않아도 되게끔 만드는 것이 제일 중요했다. '무소식이 희소식이겠거니 ~' 하면서 있다가 모니터링 도구가 실시간으로 문제를 알려주면 우리는 빠르게 문제를 해결해서 사용자들이 안정적으로 서비스를 이용할 수 있도록 환경을 마련해야 했다!
이를 도와주는 자동화된 모니터링 도구로는 sentry, data dog, prometheus, cloud watch 등으로 매우 다양한데, 우린 그 중에서도 new relic
을 사용하기로 했다. 사실 뉴렐릭은 sentry, cloud watch, prometheus 등에 비해서 레퍼런스가 굉장히 적기도 했고 올해 5월인가에는 뉴렐릭 한국 지사가 철수하기도 하는 등 '도입하지 않을' 이유가 더욱 많아보였다. 그럼에도 소수의 레퍼런스 자료에서(여기어때 기술블로그) 뉴렐릭의 만족도가 커 보여 한번쯤은 경험해보고 싶다는 생각이 들었고, 또 무엇보다 현재 활동 중인 소프트웨어 마에스트로의 담당 멘토님께서 뉴렐릭을 써볼 것을 강추❗️하셨기 때문에 그냥 믿고 써봐야겠다 싶었다.
모니터링에는 pull과 push 방식이 있다
뉴렐릭 연동 과정에 대한 마땅한 참고자료가 없었고 공식문서도 개인적으로는 이해하기에 부족한 점이 있었기 때문에 의존성만 설치하면 끝나는건지, 아님 배포 서버에서 뭔가를 더 설정해줘야 하는건지 기본적인 설정법조차 와닿지 않았다.
이제와서 돌아보니 이 '모니터링 방식'에 대한 개념이 부족해서 이리저리 헤맨 것 같다. 간단하게 설명하면 pull 방식의 경우 모니터링 도구가 메트릭을 자동으로 수집(pull)해서 에러 상황을 분석해주고, push 방식의 경우 코드 상에서 직접 특정 포인트에서 데이터가 수집되도록 설정해 보내야(push)한다. sentry가 대표적인 push 방식으로 동작하며 new relic의 경우 pull 방식으로 동작한다.
new relic이 pull 방식으로 동작하기 위해서는 애플리케이션을 실행할 때 new relic agent가 애플리케이션에 통합하도록 설정해주는 과정이 필요하다. 또한 애플리케이션이 실행 중일 때 뉴렐릭 에이전트도 같이 돌아가는 것이기 때문에, 새 버전을 배포하는 과정에서 기존에 돌아가던 애플리케이션을 kill 해버리면 뉴렐릭 에이전트도 더 이상 모니터링을 하지 못하게 된다. 따라서 새 버전을 배포할 때마다 new relic agent를 애플리케이션에 통합되도록 해줘야 한다.
뉴렐릭은 상용 서비스로 돈을 내고 사용하게 되는데 사용량에 따라 가격이 매겨지고 이게 상당히 비싼 것으로 알려져있다. 공식 사이트에서는 사용한 만큼 비용을 지불하는 걸 큰 장점처럼 어필하고 있긴 한데, 사용자 입장에선 이게 더 폭력적으로(😅) 다가오긴 한다.
프라이싱 모델은 아래와 같이 구성되어있다. 무료버전으로 사용해도 괜찮을 것 같다는 생각이 들었는데, 럭키🍀하게도 학생의 경우 무료로 더 많은 혜택을 받을 수 있게끔 되어있었다. 애플리케이션 모니터링 + 인프라 모니터링 등 30개 기능을 이용할 수 있고, 매월 500GB의 데이터를 사용할 수 있고, 플랫폼 사용자도 3명까지 등록할 수 있다!!
다행히(?) 아직 대학생 신분이라 학생용 뉴렐릭 계정을 만들었다.
자바
로 개발중이라 모니터링 대상 언어는 자바로 선택했다.tasks.register('downloadNewrelic', Download) {
mkdir 'newrelic'
src 'https://download.newrelic.com/newrelic/java-agent/newrelic-agent/current/newrelic-java.zip'
dest file('newrelic')
}
tasks.register('unzipNewrelic', Copy) {
from zipTree(file('newrelic/newrelic-java.zip'))
into rootDir
}
lisence_key
가 그대로 노출되어 있다는 건데, 이걸 환경변수로 등록해주는게 좋다.nohup java -jar $JAR
(보완)nohup java -javaagent:$NEW_RELIC_JAR_FILE -jar $JAR
여기까지 진행하면 이제 아래와 같이 모니터링 내용을 확인할 수 있다. 사실 좋은 도구가 있어도 해석하는 능력이 없으면 무용지물인데 지금 좀 그런 기분이 든다.. 😓 이제는 어떻게 데이터를 해석할건지에 대한 공부를 해보고, 어떤 경우에 알림을 받을건지 정책을 정하기 위해서 또 이리저리 알아봐야 할 것 같다 ~!