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

커스텀 지표로 MongoDB 쿼리 부하 모니터링하기

때로는 표준 계측(instrumentation)만으로는 성능 문제의 근본 원인을 추적하기에 충분하지 않습니다. 이럴 때 커스텀 지표(Custom Metrics)가 빠져 있는 퍼즐 조각을 찾는 데 결정적인 역할을 합니다.

AppSignal의 성능 그래프 덕분에 코드베이스의 어느 부분이 성능 문제를 일으키는지는 정확히 파악할 수 있습니다. 아래 스크린샷에서 MongoDB로 인해 심각한 성능 저하가 발생했던 것을 확인할 수 있습니다.

하지만 이 그래프만으로는 여러 ReplicaSet에서 운영 중인 수많은 데이터베이스 중 어느 것이 이러한 성능 저하를 일으켰는지 알 수 없습니다. 커스텀 지표 플랫폼을 활용하면 이 질문에 단번에 답할 수 있습니다.

Mongo::Monitoring API 활용하기

새로운 2.x Ruby 드라이버부터 mongo 젬(gem)은 모니터링 API를 공식적으로 제공합니다. 우리는 이 API를 사용해 데이터베이스로 전송되는 모든 쿼리를 추적합니다.

다음은 필수 메서드 세 가지(started, succeeded, failed)를 구현하고 수집된 데이터를 AppSignal로 전송하는 구독자(Subscriber) 클래스입니다:

# config/initializers/mongo_command_subscriber.rb
class MongoComandSubscriber
  VALID_DATABASES = Mongoid.clients.map { |k,v| v['database']}
 
  def started(event)
  end
 
  def failed(event)
    finished(event)
  end
 
  def succeeded(event)
    finished(event)
  end
 
  def finished(event)
    database = event.database_name
    duration = event.duration
    return unless VALID_DATABASES.include?(database)
 
    Appsignal.increment_counter("query_count.#{database}", 1)
    Appsignal.add_distribution_value("query_duration.#{database}", duration)
  end
end
 
# Subscribe to all COMMAND queries with our subscriber class
Mongo::Monitoring::Global.subscribe(
  Mongo::Monitoring::COMMAND,
  MongoComandSubscriber.new
)

커스텀 지표 대시보드 구성

이제 지표를 AppSignal로 전송하고 있으므로, 이를 시각화할 대시보드를 만들어야 합니다. 쿼리 수(query count)와 평균 쿼리 소요 시간(average query duration)을 각각 보여주는 그래프 두 개를 만들어 보겠습니다:

- title: "MongoDB Query Load"
  graphs:
    - title: "Database Query count"
      kind: count
      filter: "query_count/*"
      format: number
    - title: "Database average query duration"
      kind: measurement
      filter: "query_duration/*"
      format: duration

filter 키에는 AppSignal로 전송한 모든 쿼리 소요 시간 값과 일치하는 정규식(Regex)을 지정합니다.

결과 확인

이제 데이터베이스별로 개별 쿼리 수와 소요 시간을 추적하고 있고, 대시보드도 마련되어 있기 때문에 성능 그래프에서 급증(spike)이 발생했을 때 어떤 데이터베이스가 원인인지 즉시 확인할 수 있습니다.

이것은 커스텀 지표를 활용하면 애플리케이션 전반의 성능을 더 깊이 통찰할 수 있음을 보여주는 수많은 사례 중 하나입니다. 여러분의 애플리케이션에도 분명 도움이 될 것입니다.

커스텀 지표를 직접 사용해 보고 싶거나, 유용한 지표를 선정하고 추적하는 과정에서 도움이 필요하다면 언제든지 알려주세요.