Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

カスタムメトリクスを使用してMongoDB(クエリ)の負荷を監視する

パフォーマンスの問題の根本的な原因を追跡するには、標準の機器では不十分な場合があります。カスタムメトリックは、不足している部分を追跡するのに役立ちます。

AppSignalのパフォーマンスグラフのおかげで、コードベースのどの部分がパフォーマンスの問題を引き起こしているかを正確に把握できます。以下のスクリーンショットでは、MongoDBが原因で大幅な速度低下が発生したことがわかります。

それが教えてくれないのはどれ さまざまなReplicaSetで実行されている多数のデータベースの中で、この速度低下が発生しました。カスタムメトリクスプラットフォームを使用すると、この質問に一目で答えることができます。

Mongo ::Monitoring

新しい2.xRubyドライバーでは、mongo gemはモニタリングAPIを公開します。これを使用して、データベースに送信されたすべてのクエリを追跡します。

必要な3つのメソッド(開始、成功、失敗)を実装し、データを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に送信しているので、メトリックを視覚化するためのダッシュボードを作成する必要があります。 2つのグラフを作成しましょう。1つはクエリ数用で、もう1つは平均クエリ期間用です。

- 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に送信したクエリ期間に一致する正規表現を提供するためのキー。

結果

これで、個々のクエリの数/期間を追跡し、ダッシュボードを配置して、パフォーマンスグラフの急上昇の原因となったデータベースを確認できます。

これは、カスタムメトリックを使用することで、アプリケーションの全体的なパフォーマンスについてより多くの洞察を得るのに役立つ多くの例の1つです。

カスタムメトリクスを試してみたい場合、または貴重なメトリクスの特定と追跡についてサポートが必要な場合は、お知らせください。


  1. LIMITを使用してMongoDBをクエリする方法は?

    制限付きでMongoDBにクエリを実行するには、LIMIT()メソッドを使用します。ドキュメントを使用してコレクションを作成しましょう- > db.demo58.insertOne({"Name":"David"}); {    "acknowledged" : true,    "insertedId" : ObjectId("5e285f8fcfb11e5c34d8991f") } > db.demo58.insertOne({"

  2. 大文字と小文字を区別しない検索を使用したMongoDBクエリ?

    大文字と小文字を区別しない検索の場合は、find()メソッドで正規表現を使用します。以下は構文です- db.demo572.find({"yourFieldName" : { '$regex':/^yourValue$/i}}); 上記の構文を理解するために、ドキュメントを使用してコレクションを作成しましょう- > db.demo572.insertOne({"CountryName":"US"});{    "acknowledged" : true, "in