Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

사용자 지정 지표로 MongoDB(쿼리) 로드 모니터링

때때로 표준 계측으로는 성능 문제의 근본 원인을 추적하기에 충분하지 않습니다. 맞춤 측정항목은 누락된 부분을 추적하는 데 도움이 됩니다.

AppSignal의 성능 그래프 덕분에 우리는 코드베이스의 어느 부분이 성능 문제를 일으키는지 정확히 알고 있습니다. 아래 스크린샷에서 MongoDB 때문에 심각한 속도 저하가 있음을 알 수 있습니다.

우리에게 알려주지 않는 것은 어떤 다른 ReplicaSet에서 실행되는 수많은 데이터베이스 중 이 속도 저하가 발생했습니다. Custom Metrics 플랫폼을 사용하면 이 질문에 한 눈에 답할 수 있습니다.

Mongo::모니터링

새로운 2.x Ruby 드라이버로 mongo gem은 모니터링 API를 노출합니다. 이를 사용하여 데이터베이스로 전송된 모든 쿼리를 추적합니다.

다음은 세 가지 필수 메서드(시작됨, 성공 및 실패)를 구현하고 AppSignal로 데이터를 보내는 구독자 클래스입니다.

# 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로 보내고 있으므로 메트릭을 시각화하는 대시보드를 만들어야 합니다. 쿼리 수에 대한 그래프와 평균 쿼리 기간에 대한 그래프 두 개를 생성해 보겠습니다.

- 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를 제공하는 키입니다.

결과

이제 개별 쿼리 수/기간을 추적하고 대시보드를 배치하여 성능 그래프에서 스파이크를 유발한 데이터베이스를 확인할 수 있습니다.

이것은 사용자 정의 측정항목을 사용하여 당사(및 귀하의!) 애플리케이션의 전체 성능에 대한 더 많은 통찰력을 얻는 데 도움이 되는 많은 예 중 하나입니다.

맞춤 측정항목을 사용해 보고 싶거나 가치 있는 측정항목을 식별하고 추적하는 데 도움이 필요하면 저희에게 알려주세요.