モニタリング
項目一覧
Overview
このガイドでは、 Kotlin Syncドライバーでモニタリングを設定および構成する方法を学習できます。
モニタリングとは、アプリケーションまたはアプリケーション パフォーマンス管理ライブラリで使用するために実行中のプログラムが実行するアクティビティに関する情報を取得するプロセスです。
Kotlin Syncドライバーを使用して、クラスター、ドライバー コマンド、および接続プールイベントを監視できます。これらの機能は、アプリケーションの設計およびデバッグ時に情報を得た決定を行うのに役立ちます。
このガイドでは、次のタスクを実行する方法について説明しています。
イベントの監視
イベントをモニタリングするには、 MongoClient
インスタンスにリスナーを登録する必要があります。
イベントとは、実行中のプログラム内で発生するすべてのアクションです。 ドライバーには、ドライバーの実行中に発生するイベントのサブセットをリッスンする機能が含まれています。
リスナーは、特定のイベントが発生したときに何らかのアクションを実行するクラスです。 リスナーの API は、応答できるイベントを定義します。
リスナークラスの各メソッドは特定のイベントへの応答を表し、そのイベントを表すイベントオブジェクトを引数として受け入れます。
Kotlin Syncドライバーは、定義するイベントを次の 3 つのカテゴリに整理します。
コマンド イベント
サーバー検出と監視のイベント
接続プール イベント
次のセクションでは、各イベントカテゴリをモニターする方法を示します。監視できるイベントの完全なリストについては、 Javaイベントパッケージを参照してください。
コマンド イベント
コマンド イベントは、MongoDB database コマンドに関連するイベントです。 コマンド イベントを生成するデータベースコマンドの例には、 find
、 insert
、 delete
、 count
などがあります。
コマンド イベントを監視するには、 CommandListener
インターフェースを実装するクラスを作成し、そのクラスのインスタンスをMongoClient
インスタンスに登録します。
MongoDBデータベースコマンドの詳細については、 MongoDB Serverマニュアルのデータベースコマンド に関するMongoDBマニュアル エントリを参照してください。
注意
内部コマンド
ドライバーは、内部的に呼び出すコマンドのイベントを公開しません。これには、ドライバーがクラスターを監視するために使用するデータベースコマンドや、最初の hello
コマンドなど、接続確立に関連するコマンドが含まれます。
重要
編集済み出力
セキュリティ対策として、ドライバーは一部のコマンド イベントの内容を編集します。 これにより、これらのコマンド イベントに含まれる機密情報が保護されます。 編集されたコマンド イベントの完全なリストについては、 MongoDB コマンドのログとモニタリングの仕様 を参照してください。
例
この例では、データベースコマンドのカウンターを作成する方法を示します。カウンターは、ドライバーが各データベースコマンドを正常に実行した回数を追跡し、データベースコマンドが完了するたびにこの情報を出力します。
カウンターを作成するには、次の手順に従います。
CommandListener
インターフェースを実装するカウンター機能を持つクラスを作成します。新しいクラスのインスタンスを
MongoClientSettings
オブジェクトに追加します。MongoClientSettings
オブジェクトを使用してMongoClient
インスタンスを構成します。
次のコードは、これらの手順を実装します。
import com.mongodb.kotlin.client.MongoClient import org.bson.Document import com.mongodb.event.* import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString 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}") } } fun main() { val uri = "<connection string uri>" // Instantiate your new listener val commandCounter = CommandCounter() // Include the listener in your client settings val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .addCommandListener(commandCounter) .build() // Connect to your database val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Document>("movies") // Run some commands to test the counter collection.find().firstOrNull() collection.find().firstOrNull() mongoClient.close() }
{find=1} {find=2} {find=2, endSessions=1}
このセクションで説明されるクラスとメソッドについて詳しくは、次のAPIドキュメントを参照してください。
サーバー検出と監視イベント
サーバー検出と監視(SDAM)イベントは、ドライバーを接続した MongoDB インスタンスまたはクラスターの状態の変更に関連するイベントです。
ドライバーは 9 つの SDAM イベントを定義し、それぞれ 3 つの SDAM イベントをリッスンする次のリスナー インターフェースを提供します。
ClusterLister : トポロジー関連のイベントをリッスンします
ServerLister : または プロセスに関連するイベントをリッスンします
mongod
mongos
ServerMonitorLister : ハートビート関連のイベントをリッスンします
SDAMイベントのタイプをモニターするには、前述の 3 つのインターフェースのいずれかを実装するクラスを作成し、そのクラスのインスタンスを MongoClient
インスタンスに登録します。
各 SDAM イベントの詳細については、「 MongoDB SDAM モニタリング イベントの仕様 」を参照してください。
例
この例では、 MongoDBインスタンスの書込み (write) が利用可能かに関するメッセージを出力するリスナークラスを作成する方法を示します。
書込み (write) 状態を報告するイベントを作成するには、次のタスクを実行します。
クラスター説明の変更を追跡するクラスを作成し、
ClusterListener
インターフェースを実装します。新しいクラスのインスタンスを
MongoClientSettings
オブジェクトに追加します。MongoClientSettings
オブジェクトを使用してMongoClient
インスタンスを構成します。
次のコードは、これらの手順を実装します。
import com.mongodb.kotlin.client.MongoClient import org.bson.Document import com.mongodb.event.* import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString 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") } } } } fun main() { val uri = "<connection string uri>" // Instantiate your new listener val clusterListener = IsWriteable() // Include the listener in your client settings val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .applyToClusterSettings { builder -> builder.addClusterListener(clusterListener) } .build() // Connect to your database val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Document>("movies") // Run a command to trigger a ClusterDescriptionChangedEvent event collection.find().firstOrNull() mongoClient.close() }
Able to write to server
このセクションで説明されるクラスとメソッドについて詳しくは、次のAPIドキュメントを参照してください。
接続プール イベント
接続プールイベントは、ドライバーによって保持される接続プールに関連するイベントです。接続プールとは、ドライバーがMongoDBインスタンスと維持するオープン TCP 接続のセットです。接続プールは、 MongoDBインスタンスで実行されるアプリケーションのネットワーク ハンドシェイクの数を減らし、アプリケーションの実行を高速化するのに役立ちます。
接続プールのイベントを監視するには、ConnectionPoolListener
インターフェースを実装するクラスを作成し、そのクラスのインスタンスを MongoClient
インスタンスに登録します。
例
この例では、接続プールから接続をチェックアウトするたびにメッセージを出力するリスナー クラスを作成する方法を示します。
接続のチェックアウトを報告するイベントを作成するには、次のタスクを実行します。
チェックアウトを追跡するクラスを作成し、
CommandListener
インターフェースを実装します。新しいクラスのインスタンスを
MongoClientSettings
オブジェクトに追加します。MongoClientSettings
オブジェクトを使用してMongoClient
インスタンスを構成します。
次のコードは、これらの手順を実装します。
import com.mongodb.kotlin.client.MongoClient import org.bson.Document import com.mongodb.event.* import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString 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.") } } fun main() { val uri = "<connection string uri>" // Instantiate your new listener val cpListener = ConnectionPoolLibrarian() // Include the listener in your client settings val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .applyToConnectionPoolSettings({ it.addConnectionPoolListener(cpListener) }) .build() // Connect to your database val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Document>("movies") // Run some commands to test the counter collection.find().firstOrNull() mongoClient.close() }
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 には、次のプロパティがあります。
プロパティ | 説明 |
---|---|
| クライアントが生成した一意の識別子。 この識別子により、アプリケーションが同じ MongoDB 配置に接続されている複数の |
|
|
|
|
| アイドル状態の接続と使用中の接続を含む接続プールの最小サイズ。 |
| アイドル状態と使用中の接続を含む接続プールの最大サイズ。 |
| アイドル状態の接続と使用中の接続を含む接続プールの現在のサイズ。 |
| 使用中の接続の現在数。 |
ドライバーによって作成されたすべての 排除は、ドメイン"org.mongodb.driver"
の下にあります。
このサブセクションで説明するトピックの詳細については、 Oracle の次のリソースを参照してください。
JMAX と Jコンソールの例
この例では、 JMAX とJCon Console を使用してドライバーの接続プールを監視する方法を示します。 JCon Console は、Java プラットフォームに付属する JTX 準拠の GUI 監視ツールです。
Tip
公式の JTX および Jコンソール ドキュメントを参照してください
この例の JMAX と JConole の説明は、真実のソースではなく、説明のためのものです。 最新情報の保証については、次の公式Oracleリソースを参照してください。
次のコード スニペットは、 JMXConnectionPoolListener
をMongoClient
インスタンスに追加します。 その後、コードの実行が一時停止されるため、JCondle に移動して接続プールを調べることができます。
import com.mongodb.kotlin.client.MongoClient import org.bson.Document import com.mongodb.MongoClientSettings import com.mongodb.ConnectionString import com.mongodb.management.JMXConnectionPoolListener fun main() { val uri = "<connection string uri>" // Instantiate your JMX listener val connectionPoolListener = JMXConnectionPoolListener() // Include the listener in your client settings val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .applyToConnectionPoolSettings { it.addConnectionPoolListener(connectionPoolListener) } .build() try { // Connect to your database val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Document>("movies") collection.find().firstOrNull() collection.find().firstOrNull() println("Navigate to JConsole to see your connection pools...") // Pause execution Thread.sleep(Long.MAX_VALUE) mongoClient.close() } 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 で接続プールを検査 しなくなった 場合は、次の操作を行います。
JCondleウィンドウを閉じて JConole を終了します。
上記のコード スニペットで実行中のプログラムを停止します。
JTX と JCon Console の詳細については、 Oracle の次のリソースを参照してください。
JMXConnectionPoolListener
クラスの詳細については、 JMAXConnectionPoolLister のAPIドキュメントを参照してください。
分散トレース システムにドライバーを含める
分散トレース システムを使用する場合は、ドライバーからのイベント データを含めることができます。 分散トレース システムは、サービス指向アーキテクチャ内のさまざまなサービス全体にリクエストが反映されるのを追跡するアプリケーションです。
ドライバーをspring Cloudアプリケーションで使用する場合は、spring Cloud Sleuth を使用して、 MongoDBイベントデータを Zipken 分散トレース システムに含めます。
spring Cloud を使用しない場合、または Zipken 以外の分散トレース システムにドライバーイベントデータを含める場合は、目的の分散トレース システム用に 範囲 を管理するコマンドイベントリスナーを書込み (write) する必要があります。
Tip
このセクションで説明する概念の詳細については、次のリソースを検討してください。
- クラウドクラウド
- TLSMongoCommandLister
- : スパンを管理するイベントをリッスンする実装
Dapper : Google Research の分散トレース システムの詳細な説明