カスタムメトリクスでMongoDBのクエリ負荷を監視する方法
パフォーマンス問題の根本原因を突き止めるには、標準の計測機能だけでは不十分な場合があります。そんなときに役立つのがカスタムメトリクスです。標準機能では捉えきれない「欠けたピース」を補完できます。
AppSignalのパフォーマンスグラフを活用すれば、コードベースのどの部分がパフォーマンス問題を引き起こしているのかを正確に把握できます。以下のスクリーンショットでは、MongoDBが原因で深刻な速度低下が発生していた様子が確認できます。
しかし、これだけでは、異なるReplicaSet上で稼働する数多くのデータベースのうち、どのデータベースがこの速度低下を引き起こしたのかまでは特定できません。そこでカスタムメトリクスプラットフォームを活用すれば、この疑問にひと目で答えられるようになります。
Mongo::Monitoringとは
新しい2.x系のRubyドライバーでは、mongo gemがモニタリングAPIを公開しています。このAPIを利用することで、データベースへ送信されるすべてのクエリを追跡できます。
以下は、必須となる3つのメソッド(started、succeeded、failed)を実装し、収集したデータを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
# COMMANDクエリすべてに対してサブスクライバークラスを登録
Mongo::Monitoring::Global.subscribe(
Mongo::Monitoring::COMMAND,
MongoComandSubscriber.new
)カスタムメトリクスのダッシュボード作成
メトリクスをAppSignalへ送信できるようになったら、次はそれを可視化するためのダッシュボードを作成しましょう。ここでは「クエリ数」と「平均クエリ実行時間」の2つのグラフを用意します。
- 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: durationfilterキーには正規表現を指定します。これにより、AppSignalへ送信したすべてのクエリ実行時間メトリクスにマッチさせることができます。
計測結果
データベースごとのクエリ数と実行時間を個別に追跡し、ダッシュボードも整備できれば、パフォーマンスグラフに急増(スパイク)が現れたとき、どのデータベースが原因だったのかをひと目で確認できるようになります。
これは、カスタムメトリクスを活用することで、アプリケーション全体のパフォーマンスへの理解を深められる多くの事例のほんの一例です。
カスタムメトリクスを試してみたい方や、価値あるメトリクスの特定・追跡についてサポートが必要な方は、お気軽にお問い合わせください。
-
【MongoDB】limit()メソッドでクエリ結果の件数を制限する方法
MongoDBで取得するドキュメントの件数を制限したい場合には、limit()メソッドを使用します。この記事では、実際にコレクションを作成しながら、limit()の基本的な使い方を具体例とともに解説します。 1. コレクションの作成とドキュメントの挿入 まず、insertOne()メソッドを使って、サンプル用コレクション「demo58」に4件のドキュメントを挿入してみましょう。 > db.demo58.insertOne({"Name":"David"}); { "acknowledged" : true, &quo
-
MongoDBで大文字と小文字を区別せずに検索する方法($regexの使い方)
MongoDBで大文字と小文字を区別しない(ケースインセンシティブな)検索を実行したい場合は、find()メソッドの中で正規表現($regex)を使用します。基本となる構文は以下の通りです。db.demo572.find({yourFieldName : { $regex : /^yourValue$/i}});正規表現のポイントこの構文で重要なのは、パターンの末尾に付ける「i」オプションです。このフラグを指定することで、マッチング時に大文字と小文字の違いが無視されます。また、^(先頭)と$(末尾)で値を囲むことで、部分一致ではなく完全一致の検索になります。それでは、実際にサンプルコレクション