Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby 애플리케이션 모니터링, 가장 쉽게 시작하는 방법: 자동 계측(Auto-Instrumentation)

애플리케이션 성능에 대한 체계적인 모니터링 환경을 구축하는 일은 결코 간단한 작업이 아닙니다. 일반적으로는 먼저 무엇을 모니터링할지 정하고, 코드에 직접 계측(instrumentation) 코드를 추가한 뒤, 마지막으로 수집된 방대한 데이터를 분석해야 하기 때문입니다.

하지만 몇 가지 기본 설정만 갖추고 Ruby를 기본적으로 지원하는 APM(Application Performance Monitoring) 도구를 사용하면, 이 과정은 그 어느 때보다 쉬워집니다. 이 글에서는 그 방법을 단계별로 소개합니다.

자동 계측 — 손대지 않는 APM 설정

코드 중 어떤 부분이 성능 문제를 일으키는지 파악하려면 해당 코드에 계측을 추가해야 합니다. 그래야 전체 동작 흐름을 세분화하고, 어느 구간이 가장 느린지 측정할 수 있습니다.

AppSignal의 자동 계측 기능은 이런 수작업을 최소화해 줍니다. CLI에서 몇 가지 명령어만 실행하면 설정이 끝납니다.

AppSignal의 모니터링 에이전트는 인프라의 다양한 구성 요소를 자동으로 감지하고 계측합니다. 덕분에 AppSignal은 데이터를 수집·처리·모니터링하여 여러분에게 꼭 필요한 그래프와 대시보드를 제공할 수 있습니다.

예를 들어 Ruby의 graphql 젬(gem)을 사용하는 경우, AppSignal은 들어오는 모든 GraphQL 요청을 자동으로 계측하여 요청 내 모든 이벤트를 세분화해서 보여줍니다.

기본 지원되는 계측 목록

AppSignal이 지원하는 도구 목록은 상당히 방대합니다:

유형도구
프레임워크Rails
Rails 기능Action Mailer
Rails 기능Action Cable
Rails 기능Active Record
Rails 기능Active Job
Rails 기능Caching
Active Record 경유 지원PostgreSQL, MySQL, SQLite 등
Heroku 통합Heroku PostgreSQL
프레임워크Padrino
프레임워크Sinatra
젬(Gem)Rack
젬(Gem)WebMachine
웹 서버Puma
웹 서버Unicorn
ORMDataMapper
ORMSequel
ORMMongoDB
APIGrape
APIGraphQL
표준 라이브러리Net::HTTP
백그라운드 작업Que
백그라운드 작업Sidekiq
백그라운드 작업Delayed Job
백그라운드 작업Resque
백그라운드 작업Shoryuken
젬(Gem)Rake

앞서 말씀드렸듯 지원 목록이 매우 길기 때문에, 이 글에서는 모든 도구를 하나씩 다루지는 않겠습니다.

웹 프레임워크와 API

AppSignal은 Ruby on Rails, Padrino, Sinatra의 웹 요청 계측을 별도 설정 없이 기본적으로 지원합니다. Grape 또는 graphql 젬으로 만든 API 역시 지원 대상입니다.

Ruby on Rails

Rails용 AppSignal 통합은 요청에서 발생하는 예외와 성능을 추적하는 방식으로 동작합니다. 컨트롤러에서 요청 처리 중 에러가 발생하면 AppSignal이 이를 리포트하고, 성능 이슈는 요청 소요 시간을 기준으로 측정되어 애플리케이션의 어느 부분이 가장 오래 걸렸는지 보여주는 이벤트 타임라인을 생성합니다.

심지어 로드밸런서나 웹 서버를 거쳐 HTTP 요청이 Rails 앱에 도달하기까지 걸린 시간도 추적할 수 있습니다. 기본적으로 활성화되어 있지 않다면 요청 대기 시간(request queue time) 추적 헤더만 설정하면, AppSignal이 자동으로 큐 시간을 그래프로 표시해 줍니다.

GraphQL

AppSignal은 Ruby의 graphql 젬을 지원합니다. 들어오는 모든 GraphQL 요청을 계측하여 요청 내 모든 이벤트를 세분화된 형태로 보여주며, 쿼리 파싱과 검증, 리졸버(resolver) 실행까지 얼마나 걸렸는지 확인할 수 있습니다. 물론 웹 프레임워크와 데이터베이스 호출에서 발생한 이벤트도 이 breakdown에 포함됩니다.

실행 시간이 유독 긴 GraphQL 쿼리를 디버깅해야 하는데 병목 지점을 알기 어려울 때 특히 유용합니다. 여기에 이상 징후 트리거(anomaly trigger)까지 활용하면 쿼리 시간이 특정 임계값을 초과했을 때 알림을 받을 수 있습니다.

Sinatra, Padrino, Grape

Sinatra, Padrino, Grape는 Ruby의 웹/API 프레임워크로, 독립 실행형 애플리케이션이 될 수도 있고 더 큰 Rails 앱에 마운트될 수도 있습니다. 웹 서버에 앱을 마운트하는 방식에 따라 Sinatra, Padrino, Grape는 설치 절차가 조금씩 다릅니다.

설정이 완료되면 Sinatra, Padrino, Grape로 들어오는 모든 요청이 자동으로 계측됩니다. 트래픽이 API에 도달하면 에러와 성능 측정치가 리포트되며, 모든 (API) 엔드포인트는 AppSignal에서 개별 액션으로 구분되므로 어떤 엔드포인트에서 어떤 에러가 발생했는지 쉽게 찾을 수 있습니다. Rails 앱과 마찬가지로 성능 breakdown을 통해 어떤 데이터베이스 쿼리나 애플리케이션 영역이 상대적으로 느렸는지 파악할 수 있습니다.

데이터베이스

Active Record 및 기타 ORM

요청 처리 중 데이터베이스 조회에 얼마나 많은 시간이 소요되었는지 확인하려면 인시던트 상세 페이지를 열면 됩니다. 페이지 상단에는 해당 요청에서 기록된 이벤트 유형이 그룹별로 분류되어 있으며, 여기서 어떤 유형의 연산에 총 얼마나 많은 시간이 소요되었는지 한눈에 확인할 수 있습니다.

샘플의 성능을 더 자세히 살펴보려면 페이지 아래쪽으로 스크롤하세요. 요청 내 모든 이벤트가 발생 순서대로 나열된 타임라인을 통해 실행된 각 쿼리의 목록과 어느 쿼리가 가장 오래 걸렸는지 확인할 수 있습니다.

데이터베이스 호출에 대한 트레이싱도 제공되므로, 성능 저하(혹은 뛰어난 최적화)의 원인이 되는 쿼리가 무엇인지 정확히 알아낼 수 있습니다 😉

N+1 쿼리

요청 처리 중 N+1 쿼리가 발생해 속도가 느려지는 것이 걱정되신가요? AppSignal이 N+1 쿼리를 감지하면, 해당 이벤트 타임라인에 경고가 표시됩니다.

Redis

Redis 통합을 사용하면 Redis 호출이 이벤트 타임라인(Event Timeline)에 표시됩니다.

또한 Redis로 전송된 명령어의 이름과 쿼리가 전송된 Redis 인스턴스의 주소까지 확인할 수 있습니다.

Redis 캐시로의 장시간 호출을 디버깅해야 하는 분들에게 좋은 소식입니다. 실행 시간이 비정상적으로 긴 요청에 대해 이상 징후 트리거를 설정해 알림을 받을 수도 있습니다!

백그라운드 작업

Sidekiq, Delayed::Job, Resque, Shoryuken, Que로 백그라운드 작업이 큐에 등록될 때마다 AppSignal이 에러와 성능 측정치를 자동으로 리포트합니다. 모든 Active Job 어댑터도 지원되며, Sidekiq나 Delayed::Job 같은 일부 백그라운드 작업 라이브러리는 라이브러리 자체에서 더 많은 메타데이터를 제공합니다.

Action Mailer로 이메일 발송하기

Action Mailer를 사용하는 Rails 메일러가 deliver_later로 설정되어 있다면 Active Job을 통해 처리되므로, 동일한 수준의 계측 혜택을 그대로 누릴 수 있습니다.

웹소켓(Websockets)

Rails 앱에서 Action Cable을 사용 중이신가요? AppSignal은 메시지와 구독(subscription)에 대한 에러 및 성능 측정치를 자동으로 리포트합니다. 모든 메시지가 개별적으로 계측되기 때문에 장시간 유지되는 채널이라도 모든 활동이 리포트됩니다. 액션별로 그룹화되어 각 액션의 성능을 명확하게 파악할 수 있습니다.

👋 이 글이 마음에 드셨다면, Ruby(Rails) 성능 관련 다른 글들도 우리의 'Ruby 성능 모니터링 체크리스트'에서 확인해 보세요.

AppSignal을 직접 경험해 보세요: 쉽고 달콤한 모니터링 🍪

지난 7년간 수천 명의 개발자가 코드를 자동으로 계측하도록 도왔습니다. 여러분도 직접 사용해 보시길 바랍니다. 사용해 보시면 언제든 문의 주세요. 네덜란드의 달콤한 간식 스트루프와플(stroopwafels) 한 상자도 함께 보내 드립니다.

PS. 훌륭한 오픈소스(OSS) 프로젝트로 세상에 기여하고 계신다면, 무료 AppSignal 계정으로 보답하겠습니다. 소중한 메인테이너분들께 널리 알려 주세요!