モニタリング
項目一覧
Overview
このガイドでは、MongoDB Kotlin ドライバーで監視を設定および構成する方法を学習できます。
モニタリングとは、アプリケーションまたはアプリケーション パフォーマンス管理ライブラリで使用するために実行中のプログラムが実行するアクティビティに関する情報を取得するプロセスです。
MongoDB Kotlin ドライバーをモニターすると、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計とデバッグに際に情報に基づいた決定を行うのに役立ちます。
このガイドでは、次のタスクを実行する方法を説明します。
このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。 ドライバーでイベントを記録する方法について詳しくは、ログ記録に関するガイドをお読みください。
イベントの監視
イベントをモニタリングするには、 MongoClient
インスタンスにリスナーを登録する必要があります。
イベントとは、実行中のプログラム内で発生するすべてのアクションです。 ドライバーには、ドライバーの実行中に発生するイベントのサブセットをリッスンする機能が含まれています。
リスナーは、特定のイベントが発生したときに何らかのアクションを実行するクラスです。 リスナーの API は、応答できるイベントを定義します。
リスナー クラスの各メソッドは、特定のイベントに対する応答を表します。 各メソッドは 1 つの引数を受け取ります。これは、メソッドが応答するイベントを表すオブジェクトです。
MongoDB Kotlin ドライバーは、定義するイベントを次の 3 つのカテゴリに整理します。
コマンド イベント
サーバー検出と監視イベント
接続プール イベント
次のセクションでは、各イベント カテゴリをモニターする方法を示します。
監視できるイベントの完全なリストについては、 MongoDB Kotlinドライバーのイベントパッケージを参照してください。
コマンド イベント
コマンド イベントは、MongoDB database コマンドに関連するイベントです。 コマンド イベントを生成するデータベースコマンドの例には、 find
、 insert
、 delete
、 count
などがあります。
コマンド イベントを監視するには、 CommandListener
インターフェースを実装するクラスを記述し、そのクラスのインスタンスをMongoClient
インスタンスに登録します。
MongoDB データベースコマンドの詳細については、 データベースコマンドに関する MongoDB マニュアルのエントリを参照してください。
注意
内部コマンド
ドライバーは、内部的に呼び出すコマンドのイベントを公開しません。 これには、ドライバーがクラスターを監視するために使用するデータベースコマンドと、接続確立に関連するコマンド(最初のhello
コマンドなど)が含まれます。
重要
編集済み出力
セキュリティ対策として、ドライバーは一部のコマンド イベントの内容を編集します。 これにより、これらのコマンド イベントに含まれる機密情報が保護されます。 編集されたコマンド イベントの完全なリストについては、 MongoDB コマンドのログとモニタリングの仕様 を参照してください。
例
この例では、データベースコマンドのカウンターを作成する方法を示します。 カウンターは、ドライバーが各データベースコマンドを正常に実行した回数を追跡し、データベースコマンドが完了するたびにこの情報を出力します。
カウンターを作成するには、次の手順を行います。
CommandListener
インターフェースを実装するカウンター機能を持つクラスを作成します。CommandListener
を実装する新しいクラスのインスタンスをMongoClientSettings
オブジェクトに追加します。MongoClientSettings
オブジェクトを使用してMongoClient
インスタンスを構成します。
次のコードでは、 CommandListener
インターフェースを実装するCommandCounter
クラスを定義します。
class CommandCounter : CommandListener { private val commands = mutableMapOf<String, Int>() override fun commandSucceeded(event: CommandSucceededEvent) { val commandName = event.commandName val count = commands[commandName] ?: 0 commands[commandName] = count + 1 println(commands.toString()) } override fun commandFailed(event: CommandFailedEvent) { println("Failed execution of command '${event.commandName}' with id ${event.requestId}") } }
次のコードは、 CommandCounter
クラスのインスタンスをMongoClientSettings
オブジェクトに追加し、 MongoClientSettings
オブジェクトを持つMongoClient
インスタンスを構成します。 次に、コードはいくつかのデータベースコマンドを実行してカウンターをテストします。
val commandCounter = CommandCounter() val settings = MongoClientSettings.builder() .applyConnectionString(URI) .addCommandListener(commandCounter) .build() val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase(DATABASE) val collection = database.getCollection<Document>(COLLECTION) // Run some commands to test the counter collection.find().firstOrNull() collection.find().firstOrNull()
{find=1} {find=2} {find=2, endSessions=1}
このセクションで説明されるクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
サーバー検出と監視イベント
サーバー検出と監視(SDAM)イベントは、ドライバーを接続した MongoDB インスタンスまたはクラスターの状態の変更に関連するイベントです。
ドライバーは 9 つの SDAM イベントを定義します。 ドライバーはこれら 9 つのイベントを 3 つの個別のリスナー インターフェースに分割し、それぞれが 9 つのイベントのうち 3 つをリッスンします。 以下は 3 つのインターフェースと、それらが listen するイベントです。
ClusterListener
: トポロジー関連のイベントServerListener
:mongod
またはmongos
プロセスに関連するイベントServerMonitorListener
: ハートビート関連のイベント
SDAM イベントのタイプを監視するには、前述の 3 つのインターフェースのいずれかを実装するクラスを記述し、そのクラスのインスタンスをMongoClient
インスタンスに登録します。
各 SDAM イベントの詳細については、「 MongoDB SDAM モニタリング イベントの仕様 」を参照してください。
例
この例では、ドライバーが MongoDB インスタンスに書込み (write) ができるかどうかを示すメッセージを出力するリスナー クラスを作成する方法を示します。
次のコードでは、 ClusterListener
インターフェースを実装するIsWritable
クラスを定義します。
class IsWriteable : ClusterListener { private var isWritable = false override fun clusterDescriptionChanged(event: ClusterDescriptionChangedEvent) { if (!isWritable) { if (event.newDescription.hasWritableServer()) { isWritable = true println("Able to write to cluster") } } else { if (!event.newDescription.hasWritableServer()) { isWritable = false println("Unable to write to cluster") } } } }
次のコードは、 IsWritable
クラスのインスタンスをMongoClient
オブジェクトに追加します。 次に、コードは検索操作を実行してIsWritable
クラスをテストします。
val clusterListener = IsWriteable() val settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToClusterSettings { builder -> builder.addClusterListener(clusterListener) } .build() val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase(DATABASE) val collection = database.getCollection<Document>(COLLECTION) // Run a command to trigger a ClusterDescriptionChangedEvent event collection.find().firstOrNull()
Able to write to server
このセクションで説明されるクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
接続プール イベント
接続プール イベントは、ドライバーによって保持される接続プールに関連するイベントです。 接続プールは、ドライバーが MongoDB インスタンスと維持するオープン TCP 接続のセットです。 接続プールは、アプリケーションが MongoDB インスタンスで実行する必要があるネットワーク ハンドシェイクの数を減らし、アプリケーションの実行を高速化するのに役立ちます。
接続プールのイベントを監視するには、 ConnectionPoolListener
インターフェースを実装するクラスを記述し、そのクラスのインスタンスをMongoClient
インスタンスに登録します。
例
この例では、接続プールから接続をチェックアウトするたびにメッセージを出力するリスナー クラスを作成する方法を示します。
次のコードでは、 ConnectionPoolListener
インターフェースを実装するConnectionPoolLibrarian
クラスを定義します。
class ConnectionPoolLibrarian : ConnectionPoolListener { override fun connectionCheckedOut(event: ConnectionCheckedOutEvent) { println("Let me get you the connection with id ${event.connectionId.localValue}...") } override fun connectionCheckOutFailed(event: ConnectionCheckOutFailedEvent) { println("Something went wrong! Failed to checkout connection.") } }
次のコードは、 ConnectionPoolLibrarian
クラスのインスタンスをMongoClient
オブジェクトに追加します。 次に、コードはデータベースコマンドを実行してライブラリーをテストします。
val cpListener = ConnectionPoolLibrarian() val settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToConnectionPoolSettings { builder -> builder.addConnectionPoolListener(cpListener) } .build() val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase(DATABASE) val collection = database.getCollection<Document>(COLLECTION) // Run a command to trigger connection pool events collection.find().firstOrNull()
Let me get you the connection with id 21...
このセクションで説明されるクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
JTX による接続プール イベントの監視
Java 管理拡張機能(JTX)を使用して接続プールのイベントを監視できます。 JTX は、アプリケーションとデバイスを監視するためのツールを提供します。
JTX の詳細について は、 Oracle JTX の公式ドキュメントを参照してください。
JTX サポート
JMAX 接続プールのモニタリングを有効にするには、 JMXConnectionPoolListener
クラスのインスタンスをMongoClient
オブジェクトに追加します。
JMXConnectionPoolListener
クラスは、次のアクションを実行します。
ドライバーが接続プールを維持する各
mongod
またはmongos
プロセスに対して macOS インスタンスを作成します。これらの XT インスタンスをプラットフォーム M Manager サーバーに登録します。
プラットフォーム MBuilder に登録された macOS には、次のプロパティがあります。
プロパティ | 説明 |
---|---|
clusterId | クライアントが生成した一意の識別子。 この識別子により、アプリケーションが同じ MongoDB 配置に接続されている複数の MongoClient インスタンスがある場合に、ドライバーが作成する各 macOS インスタンスが一意の名前を持つことが保証されます。 |
host | mongod またはmongos プロセスを実行しているマシンのホスト名。 |
port | mongod またはmongos プロセスがリッスンしているポート。 |
minSize | アイドル状態の接続と使用中の接続を含む接続プールの最小サイズ。 |
maxSize | アイドル状態と使用中の接続を含む接続プールの最大サイズ。 |
size | アイドル状態の接続と使用中の接続を含む接続プールの現在のサイズ。 |
checkedOutCount | 使用中の接続の現在数。 |
ドライバーによって作成されたすべての 排除は、ドメイン"org.mongodb.driver"
の下にあります。
このサブセクションで説明するトピックの詳細については、 Oracle の次のリソースを参照してください。
JMAX と Jコンソールの例
この例では、 JMAX とJCon Console を使用してドライバーの接続プールを監視する方法を示します。 JCon Console は、Java プラットフォームに付属する JTX 準拠の GUI 監視ツールです。
Tip
公式の JTX および Jコンソール ドキュメントを参照してください
この例の JMAX と JConole の説明は、真実のソースではなく、説明のためのものです。 最新情報の保証については、次の公式 Oracle リソースを参照してください。
次のコード スニペットは、 JMXConnectionPoolListener
をMongoClient
インスタンスに追加します。 その後、コードの実行が一時停止されるため、JCondle に移動して接続プールを調べることができます。
val connectionPoolListener = JMXConnectionPoolListener() val settings = MongoClientSettings.builder() .applyConnectionString(uri) .applyToConnectionPoolSettings { it.addConnectionPoolListener(connectionPoolListener) } .build() val mongoClient: MongoClient = MongoClient.create(settings) try { println("Navigate to JConsole to see your connection pools...") Thread.sleep(Long.MAX_VALUE) } catch (e: Exception) { e.printStackTrace() }
Navigate to JConsole to see your connection pools...
サーバーを起動したら、次のコマンドを使用してターミナルで Jコンソールを開きます。
jconsole
JConole が開いたら、GUI で次のアクションを実行します。
上記のサンプル コードを実行しているプロセスを選択します。
警告ダイアログ ボックスで [ Insecure Connectionを押します。
[ MBeans ] タブをクリックします。
"org.mongodb.driver"
ドメインの下の接続プール イベントを調べます。
JCon Console で接続プールを検査 しなくなった 場合は、次の操作を行います。
JCon Console ウィンドウを閉じて JConole を終了します
上記のコード スニペットを実行しているプログラムを停止します
JTX と JCon Console の詳細については、 Oracle の次のリソースを参照してください。
JMXConnectionPoolListener
クラスの詳細については、 JMAXConnectionPoolLister の API ドキュメントを参照してください。
分散トレース システムにドライバーを含める
分散トレース システムを使用する場合は、ドライバーからのイベント データを含めることができます。 分散トレース システムは、サービス指向アーキテクチャ内のさまざまなサービス全体にリクエストが反映されるのを追跡するアプリケーションです。
spring Cloud でドライバーを使用する場合 アプリケーション、 Apple Cloud Sleuth を使用 : MongoDB イベント データを Zip に含めます。 分散トレース システム。
spring Cloud を使用していない場合、または Zipink 以外の分散トレース システムにドライバー イベント データを含める必要がある場合は、範囲を管理するコマンド イベント リスナーを記述する必要があります ご希望の分散トレース システム用に作成します。このようなリスナーの実装を確認するには、 TaceMongoCommandLister の Java ソースコードを参照してください。 クラス(spring Cloud Sleuth ソースコード)の
spring Cloud Sleuth の詳細については、 「 使用開始 」を 参照してください。 を参照してください。
分散トレースシステムの詳細については、 Dapper を参照してください Google 調査 より提供。