대부분의 경우 AppSignal에서 기본으로 제공하는 애플리케이션 모니터링 지표, 그래프, 시각화 기능만으로도 Ruby 앱 관리에 충분합니다. 하지만 무엇을 측정할지, 어떻게 표시할지, 중요한 정보를 어떤 방식으로 전달받을지 스스로 통제하고 싶은 사용자라면 이야기가 다릅니다.
AppSignal은 원하는 대로 앱 지표와 대시보드를 자유롭게 커스터마이징할 수 있습니다. 이 가이드에서는 AppSignal의 커스텀 지표에 대해 다음 내용을 살펴봅니다.
- 커스텀 지표란 무엇인가
- 설정할 수 있는 커스텀 지표의 종류
- 그래프 시각화를 커스터마이징하는 방법
- 효과적인 알림을 구성하는 방법
그리고 그 외에도 더 많은 내용을 다룹니다!
본격적으로 시작하기 전에, 따라 하려면 몇 가지 준비물이 필요합니다.
사전 준비 사항
- AppSignal 계정: 아직 계정이 없다면 30일 무료 체험판에 가입하세요.
- Ruby 애플리케이션: Rails, Sinatra 등 지원되는 Ruby 프레임워크 또는 순수 Ruby 기반의 앱이면 됩니다. 프로덕션 환경이든 개발 환경이든 상관없습니다. 직접 앱을 만들고 싶지 않다면, 이 튜토리얼에서 사용할 예제 Sinatra 앱 코드를 클론해서 사용하세요.
참고: 자신의 앱으로 이 튜토리얼을 진행한다면, 최신 버전의 AppSignal Ruby 젬(gem)이 설치되어 있어야 합니다. 이 글의 예제들은 모두 최신 젬을 사용하는 것을 전제로 작성되었습니다.
커스텀 지표란 무엇일까요?
앱의 에러율, 처리량(throughput), 성능을 측정하는 것 외에도, 자신의 앱에 특화된 데이터를 직접 측정하고 싶을 때가 있습니다. 예를 들어 특정 기간 동안 신규 가입자가 몇 명인지, 웹소켓 레이어는 잘 동작하는지 등을 확인하고 싶을 수 있습니다.
이런 맞춤형 요구사항은 AppSignal의 표준 측정 도구만으로는 해결하기 어렵습니다. 이때 필요한 것이 바로 커스텀 지표(custom metric)입니다. 커스텀 지표는 기본 지표와 함께 정의하여 앱이 실제로 어떻게 돌아가는지 더 깊은 맥락을 파악할 수 있게 해주는 추가 지표입니다.
이제 첫 번째 커스텀 지표를 설정하는 방법을 알아보겠습니다.
커스텀 지표 설정하기
애플리케이션 내 거의 모든 사용 사례에 대해 커스텀 지표를 설정할 수 있습니다. 전체 흐름을 이해하기 쉽도록 간단한 예제부터 시작해 보겠습니다.
첫 단계는 AppSignal에서 추적할 커스텀 지표를 정의하는 것입니다. 커스텀 지표는 다음 세 가지 유형으로 정의할 수 있습니다.
- Gauge (게이지)
- Counter (카운터)
- Distribution (분포)
Gauge(게이지) 커스텀 지표
AppSignal에서 게이지(gauge) 커스텀 지표는 시간이 지남에 따라 증가하거나 감소하는 값을 측정할 때 유용합니다.
예제 Sinatra 앱의 전체 게시글 수를 측정하는 간단한 게이지 지표를 만들어 보겠습니다.
Appsignal::Helpers::Metrics.set_gauge('all_posts', Post.count)
위 코드에서는 Appsignal::Helpers::Metrics 모듈의 set_gauge 메서드를 호출하며, 이 메서드는 세 개의 인자를 받습니다.
key: 커스텀 지표의 이름입니다. 예제에서는 all_posts를 사용했습니다.value: 측정하려는 값입니다. 위 예제에서는 전체 게시글 수가 해당됩니다.tags: 커스텀 지표에 추가할 수 있는 선택적 메타데이터로, 측정 데이터를 원하는 방식으로 라벨링하는 데 유용합니다. 예를 들어 아래와 같이posts_count지표에 환경(environment) 정보를 태그로 달 수 있습니다.
Appsignal::Helpers::Metrics.set_gauge('all_posts', Post.count, environment: 'production')
좋습니다. 첫 번째 커스텀 게이지 지표를 추가했습니다! 하지만 AppSignal로 돌아가 보면 새로 만든 커스텀 지표가 보이지 않을 겁니다. 대신 아래와 같은 기본 대시보드가 표시될 것입니다.

그렇다면 커스텀 지표를 화면에 표시하려면 무엇을 해야 할까요? 바로 대시보드를 추가해야 합니다. 먼저 새 대시보드를 생성합니다.

그다음 새 대시보드에 알아보기 쉬운 제목과 설명을 입력합니다.

커스텀 대시보드가 준비되었으면, 이제 커스텀 지표용 그래프를 추가해야 합니다.

이어서 새 그래프를 정의합니다.

새 그래프를 설정할 때 입력하는 필드는 다음과 같습니다.
- a. Title(제목) — 새 그래프를 설명하는 제목을 입력합니다.
- b. Description(설명) — 선택 사항이며, 그래프에 대한 설명을 입력할 수 있습니다.
- c. Metrics(지표) — 새 그래프가 측정하고 표시할 지표를 정의하는 곳입니다. 커스텀 지표의 이름, 즉
set_gauge메서드의 첫 번째 인자였던all_posts를 입력합니다. 이 영역에서 태그도 함께 정의할 수 있습니다. 예를 들어 environment 태그를 아래 화면처럼 포함시킬 수 있습니다. - d. Graph display(그래프 표시) — 새 그래프의 표시 유형을 선택하는 항목입니다.
- e. Legend label(범례 라벨) — 차트 범례에 표시될 라벨을 여기서 커스터마이징할 수 있습니다.
- f. Data format(데이터 형식) — 그래프에 사용할 데이터 형식을 정의합니다. 숫자(number), 백분율(percentage), 처리량(throughput, 분당/시간당 요청 수), 시간(duration, 밀리초), 파일 크기(file size, 바이트) 등 다양한 형식 중에서 선택할 수 있습니다.
새 그래프의 속성을 제대로 정의하면 커스텀 지표에 대한 그래프가 완성됩니다. 결과는 아래와 비슷하게 나타납니다.

계속해서 다음 커스텀 지표 유형인 카운터(counter)를 살펴보겠습니다.
Counter(카운터) 커스텀 지표
카운터 커스텀 지표는 특정 이벤트가 몇 번 발생했는지 측정할 때 적합합니다. 예제 애플리케이션에서는 홈(루트) 페이지가 방문될 때마다 카운터 지표로 기록해 볼 수 있습니다.
먼저 루트 메서드를 열어 아래 코드를 추가합니다.
Appsignal::Helpers::Metrics.increment_counter('visits_count', 1)
여기서는 AppSignal의 increment_counter 메서드를 호출하고 첫 번째 인자로 visits_count를 전달합니다. 두 번째 인자인 증가 단위는 정수 1입니다. 세 번째 인자로 tags 해시를 추가할 수도 있지만, 앞 섹션에서 이미 다루었으므로 여기서는 생략하겠습니다.
이제 게이지 지표에서 안내한 것과 동일한 단계를 따라 이 카운터 지표용 커스텀 그래프를 추가하면 아래와 같은 그래프를 얻을 수 있습니다.

이번에는 분포(distribution) 커스텀 지표로 넘어가 보겠습니다.
Distribution(분포) 커스텀 지표
AppSignal의 분포(distribution) 커스텀 지표는 단위 시간당 발생하는 값을 측정할 때 유용합니다. 예를 들어 PDF 리포트를 생성하는 데 걸리는 초 수, 백그라운드 잡(job) 실행에 소요되는 시간 등을 측정할 수 있습니다.
예제 애플리케이션에서 메인 파일을 수정해 공개 API 엔드포인트를 호출하는 코드를 추가해 보겠습니다. 그리고 커스텀 분포 지표를 사용해 이 API 호출이 밀리초 단위로 얼마나 걸리는지 측정합니다.
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# API 호출 로직
response = HTTP.get('https://api.example.com/books')
elapsed_ms = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
Appsignal::Helpers::Metrics.add_distribution_value('fetch_books_duration', elapsed_ms)
이제 AppSignal로 돌아가면 커스텀 분포 지표를 그래프로 확인할 수 있습니다.
팁: 커스텀 그래프 시각화는 게이지 섹션에서 안내한 단계를 그대로 따르면 됩니다.

지금까지 커스텀 지표를 만들고 그에 맞는 그래프 시각화를 구성하는 방법을 배웠습니다. 그런데 문득 눈치채셨겠지만, 앱 상태를 확인하려고 매번 AppSignal 대시보드에 일일이 접속하는 것은 그리 편리하지 않습니다. 커스텀 지표에 대한 알림을 바로 받을 수 있다면 훨씬 좋겠죠?
다음으로 커스텀 지표 알림을 설정하는 방법을 알아보겠습니다.
알림(Alert) 설정
기본적으로 에러나 성능 이벤트가 발생하면 AppSignal은 해당 이벤트에 대한 인시던트(incident)를 열고 관련 섹션에 배치합니다. 에러라면 에러 목록에서, 성능 관련 인시던트라면 성능 목록에서 확인할 수 있습니다.
또한 AppSignal은 이메일(기본 알림 채널)을 통해 인시던트 알림을 발송합니다. 그 외에도 다음과 같은 알림 채널을 설정할 수 있습니다.
- Discord
- Google Hangouts
- Intercom
- Microsoft Teams
- Slack
- Webhook
그리고 그 외에도 다양한 채널을 지원합니다.
하지만 커스텀 지표에 대한 알림 트리거를 설정하기 전에, 활용 가능한 다양한 알림 옵션을 먼저 파악해 두는 것이 중요합니다.
먼저 다음과 같은 조건으로 알림을 설정할 수 있습니다.
- Every time(매번) — 인시던트가 발생할 때마다 매번 알림을 보냅니다.
- First deploy(첫 배포 후) — 배포 후 인시던트가 처음 발생했을 때 알림을 보냅니다.
- First after close(종료 후 재발) — 이전 인시던트가 종료된 후 동일한 인시던트가 다시 발생할 때 알림을 보냅니다.
- Never notify(알림 없음) — 이름 그대로 알림은 보내지 않지만, 에러나 성능 인시던트는 여전히 AppSignal에서 추적됩니다.
- Every nth hour or day(N시간/일마다) — 한 시간 또는 하루 동안 받을 알림의 최대 횟수를 지정할 수 있습니다. 중요한 이벤트는 놓치지 않으면서도 과도한 알림으로 팀원들이 압도되지 않도록 균형을 잡는 데 딱 좋은 옵션입니다.
각 옵션에 대한 자세한 내용은 AppSignal의 알림 설정 공식 문서를 참고하시길 권합니다.
이제 앞서 만든 커스텀 지표 중 하나에 알림을 설정해 보겠습니다. 간단한 예제이지만, 여러분의 실제 사용 사례에 적용할 때 거쳐야 하는 단계를 그대로 보여줍니다.
커스텀 지표 알림 설정하기
이 예제에서는 앞부분에서 API 호출 소요 시간을 측정했던 분포 지표를 사용하겠습니다. 평균 소요 시간(duration)이 특정 값(밀리초)을 초과할 때마다 이메일 알림을 받고 싶다고 가정해 봅시다.
설정 단계는 아래와 같습니다.

먼저 왼쪽 메뉴에서 Triggers 링크를 클릭합니다.

트리거에 알맞은 이름을 붙이고, 이 알림의 대상이 되는 측정값을 선택합니다. 이 예제에서는 fetch_books_duration 분포 커스텀 지표를 사용합니다. 필요하다면 태그도 추가할 수 있습니다.
다음으로 비교 연산자와 임계값을 정의합니다. 예를 들어 소요 시간이 1600밀리초를 초과할 때마다 알림을 받고 싶다면, 비교 연산자로 more than(초과)을 선택하고 값으로 1600을 입력하면 됩니다.

마지막으로 알림 워밍업(warm-up)과 쿨다운(cooldown) 설정을 정의합니다. 알림에 대한 설명을 작성하고, 알림 메시지에 포함할 대시보드 링크(필요한 경우)를 추가한 뒤, 알림 방법(기본값은 이메일)을 선택합니다.

여기까지 완료하면, 설정한 조건에 부합하는 인시던트가 발생할 때마다 알림을 받게 됩니다.
이것으로 끝입니다!
마무리
이 글에서는 Ruby 애플리케이션을 위해 AppSignal에서 커스텀 지표를 설정하고, 여기에 맞는 대시보드와 그래프 시각화를 구성하는 방법을 배웠습니다.
AppSignal이 제공하는 커스텀 지표 기능은 세밀하게 조정할수록 훨씬 강력한 활용이 가능합니다. AppSignal의 커스텀 지표 공식 문서를 깊이 살펴보면서 더 많은 가능성을 찾아보세요.
그럼 다음 글에서 만나요. 즐거운 코딩 되세요!
P.S. Ruby Magic의 새 글을 발행 즉시 읽고 싶다면 Ruby Magic 뉴스레터를 구독하세요. 어떤 글도 놓치지 않을 수 있습니다!