때때로 표준 계측으로는 성능 문제의 근본 원인을 추적하기에 충분하지 않습니다. 맞춤 측정항목은 누락된 부분을 추적하는 데 도움이 됩니다.
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를 제공하는 키입니다.
결과
이제 개별 쿼리 수/기간을 추적하고 대시보드를 배치하여 성능 그래프에서 스파이크를 유발한 데이터베이스를 확인할 수 있습니다.
이것은 사용자 정의 측정항목을 사용하여 당사(및 귀하의!) 애플리케이션의 전체 성능에 대한 더 많은 통찰력을 얻는 데 도움이 되는 많은 예 중 하나입니다.
맞춤 측정항목을 사용해 보고 싶거나 가치 있는 측정항목을 식별하고 추적하는 데 도움이 필요하면 저희에게 알려주세요.