엔지니어링

Elastic APM Ruby 에이전트를 사용하여 Ruby 앱을 계측하는 방법

성능 메트릭을 Ruby 앱에서 APM 서버로 전송하는 것은 elastic-apm Rubygem을 설치하는 것만큼 쉽습니다. 대부분의 통합은 플러그 앤 플레이로 수행되며, Rails 및 Rack이 기본 지원됩니다.

그러나 데이터에 더 많은 정보를 추가하고 자체 사용자 정의 계측을 설정할 수 있는 방법이 몇 가지 있습니다.

이미 계측된 데이터에 더 많은 정보 추가

Elastic APM에는 이미 수집하고 있는 데이터에 더 많은 정보를 추가할 수 있는 몇 가지 개념이 있습니다.

예를 들어 앱이 companies라는 개념을 중심으로 구축된 경우, 모든 트랜잭션과 오류에 current_company.short_name을 할당할 수 있습니다. 태그는 간단한 키-값 쌍이며 Elasticsearch에서 색인됩니다. 따라서 필터링 및 쿼리가 가능하므로 원하는 방식으로 메트릭을 활용할 수 있습니다.

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company, current_company.short_name
  end
end

이렇게 하면 특정 성능 문제나 예외가 일부 고객에게만 영향을 미치는지 더 쉽게 확인할 수 있습니다.

Opbeans 회사의 요청만 나열

사용자는 또 다른 광범위한 개념이며, Elastic APM에서는 이러한 개념도 활용할 수 있습니다.

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company_id, current_company.id
    ElasticAPM.set_user current_user
  end
end

에이전트에는 전달된 모든 항목의 id, emailusername 필드가 포함됩니다. 물론, 필드를 무엇이든 앱에서 불리는 이름으로 사용자 정의할 수 있습니다.

SpanHelpers 모듈

기간을 추적하려고 특정 메서드를 주시하고 있다면, SpanHelpers 모듈을 사용해 보시기 바랍니다. 이 모듈은 span_methodspan_class_method라는 두 가지 메서드를 제공합니다.

class ThingsController < ApplicationController
  include ElasticAPM::SpanHelpers

  # ...

  def do_the_work
    # ...
  end
  span_method :do_the_work

  def self.do_other_work
    # ... 
  end
  span_class_method :do_other_work

  # ... alternative syntax for newer versions of Ruby

  span_method \
  def do_the_work
    # ...
  end
end

Elastic APM Ruby 에이전트 SpanHelpers 설명서를 참조하십시오.

측정하고자 하는 것이 간단한 메서드 호출이라면 이 접근 방식이 적합합니다. 더 세분화된 제어를 원한다면 일반 사용 API를 사용하는 것이 좋습니다.

트랜잭션 및 범위를 수동으로 생성

에이전트에서는 트랜잭션과 범위를 수동으로 생성할 수 있도록 퍼블릭 API를 제공합니다. 에이전트 자체는 이 API를 내부적으로 사용하여 지원되는 라이브러리의 대부분을 계측합니다.

가장 먼저 필요한 것은 _트랜잭션_입니다. Rails 앱의 요청이나 미들웨어를 사용하는 Rack 앱, 지원되는 작업 실행기의 백그라운드 작업 안에 있는 경우 이미 트랜잭션 안에 있을 가능성이 높습니다.

그렇지 않다면 다음과 같은 트랜잭션을 생성합니다.

ElasticAPM.start # if it isn't started already

begin
  transaction = ElasticAPM.start_transaction 'Optional name', 'optional.type'
  # 트랜잭션이 종료되었는지 확인하는 것은 여러분의 책임입니다.
  # 확실히 하기 위해 begin과 ensure로 래핑합니다.
ensure
  ElasticAPM.end_transaction
end

아니면 나중에 종료되도록 보장하는 동일한 기능의 블록 버전을 사용할 수도 있습니다.

ElasticAPM.with_transaction do |transaction|
  # 필요한 경우 트랜잭션 내부를 변경할 수 있습니다. 예:
  transaction.name = method_that_returns_the_name

  # 에이전트가 시작되지 않으면 `transaction`은 nil이지만 블록은 여전히 평가됨에 유의하십시오.
end

트랜잭션 내부에서 _spans_는 앱이 수행하는 개별 작업입니다. 자동으로 계측된 라이브러리를 사용하는 경우, 이를 트랜잭션으로 래핑하기만 하면 됩니다.

추가 범위가 필요한 경우, API가 트랜잭션을 대조합니다.

begin
  span = ElasticAPM.start_span 'Required name', 'optional.type'
ensure
  ElasticAPM.end_span
end

# 또는 블록 형식
ElasticAPM.with_span 'Hard work' do |span|
  # ...
end

왜 이렇게 오래 걸리죠... 오

퍼블릭 API는 APM Ruby 에이전트 설명서를 참조하십시오.

쉽게 시작하고 쉽게 확장

Elastic에서는 Ruby APM 에이전트의 초기 기본 설정을 최대한 쉽게 할 수 있도록 최선을 다했습니다. 여러분이 위에 설명한 기능이 필요하지 않거나 이를 원하지 않더라도 여전히 유용한 정보를 많이 얻으실 수 있을 것입니다.

그러나 앱을 직접 낱낱이 파헤쳐보고 싶으시다면, Elastic APM이 이에 적합한 도구를 제공합니다.

사용해 보기

Ruby가 얼마나 잘 작동하고 있나요? Ruby에서 가장 시간이 오래 걸리는 부분이 어디일까요? 사용자 경험을 향상하려면 다음 버전에서 어디에 집중해야 할까요? Elastic APM 및 Ruby 에이전트는 이 모든 질문 그리고 그 외 더 많은 질문에 대한 답을 찾는 데 도움이 됩니다. 앱을 계측하고, Elastic Stack을 다운로드하여 로컬로 실행하거나, APM 서버가 포함된 무료 체험판을 통해 Elastic CloudElasticsearch Service로 추적을 전송하세요. 언제나처럼 궁금한 점, 아이디어, 의견 또는 우려 사항이 있으시면 토론 포럼에 글을 남겨주세요.