カスタムメトリクスを使用して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つです。
カスタムメトリクスを試してみたい場合、または貴重なメトリクスの特定と追跡についてサポートが必要な場合は、お知らせください。
-
LIMITを使用してMongoDBをクエリする方法は?
制限付きでMongoDBにクエリを実行するには、LIMIT()メソッドを使用します。ドキュメントを使用してコレクションを作成しましょう- > db.demo58.insertOne({"Name":"David"}); { "acknowledged" : true, "insertedId" : ObjectId("5e285f8fcfb11e5c34d8991f") } > db.demo58.insertOne({"
-
大文字と小文字を区別しない検索を使用したMongoDBクエリ?
大文字と小文字を区別しない検索の場合は、find()メソッドで正規表現を使用します。以下は構文です- db.demo572.find({"yourFieldName" : { '$regex':/^yourValue$/i}}); 上記の構文を理解するために、ドキュメントを使用してコレクションを作成しましょう- > db.demo572.insertOne({"CountryName":"US"});{ "acknowledged" : true, "in