Overview
このガイドでは、MongoDB Java ドライバーで監視を設定および構成する方法を学習できます。
モニタリングとは、アプリケーションまたはアプリケーション パフォーマンス管理ライブラリで使用するために実行中のプログラムが実行するアクティビティに関する情報を取得するプロセスです。
MongoDB Java ドライバーをモニターすると、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計とデバッグに際に情報に基づいた決定を行うのに役立ちます。
このガイドでは、次のタスクを実行する方法を説明します。
このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーでイベントをレコード方法について詳しくは、「 ログ記録ガイド 」を参照してください。
イベントの監視
イベントをモニタリングするには、 MongoClientインスタンスにリスナーを登録する必要があります。
イベントとは、実行中のプログラム内で発生するすべてのアクションです。 ドライバーには、ドライバーの実行中に発生するイベントのサブセットをリッスンする機能が含まれています。
リスナーは、特定のイベントが発生したときに何らかのアクションを実行するクラスです。 リスナーの API は、応答できるイベントを定義します。
リスナー クラスの各メソッドは、特定のイベントに対する応答を表します。 各メソッドは 1 つの引数を受け取ります。これは、メソッドが応答するイベントを表すオブジェクトです。
MongoDB Java ドライバーは、定義するイベントを次の 3 つのカテゴリに整理します。
コマンド イベント
サーバー検出と監視イベント
接続プール イベント
次のセクションでは、各イベント カテゴリをモニターする方法を示します。
監視できるイベントの完全なリストについては、 MongoDB Javaドライバーのイベントパッケージを参照してください。
コマンド イベント
コマンド イベントは、MongoDB database コマンドに関連するイベントです。 コマンド イベントを生成するデータベースコマンドの例には、 find 、 insert 、 delete 、 countなどがあります。
コマンド イベントを監視するには、 CommandListenerインターフェースを実装するクラスを記述し、そのクラスのインスタンスをMongoClientインスタンスに登録します。
MongoDB データベースコマンドの詳細については、 データベースコマンドに関する MongoDB マニュアルのエントリを参照してください。
注意
内部コマンド
ドライバーは、内部的に呼び出すコマンドのイベントを公開しません。 これには、ドライバーがクラスターを監視するために使用するデータベースコマンドと、接続確立に関連するコマンド(最初のhelloコマンドなど)が含まれます。
重要
編集済み出力
セキュリティ対策として、ドライバーは一部のコマンド イベントの内容を編集します。これにより、これらのコマンド イベントに含まれる機密情報が保護されます。編集されたコマンド イベントの完全なリストについては、 MongoDBコマンドのログとモニタリングの仕様 を参照してください。
例
この例では、データベースコマンドのカウンターを作成する方法を示します。 カウンターは、ドライバーが各データベースコマンドを正常に実行した回数を追跡し、データベースコマンドが完了するたびにこの情報を出力します。
カウンターを作成するには、次の手順を行います。
CommandListenerインターフェースを実装するカウンター機能を持つクラスを作成します。CommandListenerを実装する新しいクラスのインスタンスをMongoClientSettingsオブジェクトに追加します。MongoClientSettingsオブジェクトを使用してMongoClientインスタンスを構成します。
次のコードでは、 CommandListenerインターフェースを実装するCommandCounterクラスを定義します。
class CommandCounter implements CommandListener { private Map<String, Integer> commands = new HashMap<String, Integer>(); public synchronized void commandSucceeded(final CommandSucceededEvent event) { String commandName = event.getCommandName(); int count = commands.containsKey(commandName) ? commands.get(commandName) : 0; commands.put(commandName, count + 1); System.out.println(commands.toString()); } public void commandFailed(final CommandFailedEvent event) { System.out.println(String.format("Failed execution of command '%s' with id %s", event.getCommandName(), event.getRequestId())); } }
次のコードは、 CommandCounterクラスのインスタンスをMongoClientSettingsオブジェクトに追加し、 MongoClientSettingsオブジェクトを持つMongoClientインスタンスを構成します。 次に、コードはいくつかのデータベースコマンドを実行してカウンターをテストします。
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .addCommandListener(new CommandCounter()) .build(); MongoClient mongoClient = MongoClients.create(settings); MongoDatabase database = mongoClient.getDatabase(DATABASE); MongoCollection<Document> collection = database.getCollection(COLLECTION); // Run some commands to test the timer collection.find().first(); collection.find().first(); mongoClient.close();
上記のコード スニペットは、次のような出力を生成します。
{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 ログ記録とモニタリングの仕様 を参照してください。
注意
負荷分散モード
ドライバーは、 負荷分散モードの場合、ハートビートに関連するイベントを発行しません。負荷分散による SDAM イベントの詳細については、 MongoDBロード バランサーのサポート仕様 を参照してください。
例
この例では、ドライバーが MongoDB インスタンスに書込み (write) ができるかどうかを示すメッセージを出力するリスナー クラスを作成する方法を示します。
次のコードでは、 ClusterListenerインターフェースを実装するIsWritableクラスを定義します。
class IsWriteable implements ClusterListener { private boolean isWritable; public synchronized void clusterDescriptionChanged(final ClusterDescriptionChangedEvent event) { if (!isWritable) { if (event.getNewDescription().hasWritableServer()) { isWritable = true; System.out.println("Able to write to server"); } } else { if (!event.getNewDescription().hasWritableServer()) { isWritable = false; System.out.println("Unable to write to server"); } } } }
次のコードは、 IsWritableクラスのインスタンスをMongoClientオブジェクトに追加します。 次に、コードは検索操作を実行してIsWritableクラスをテストします。
IsWriteable clusterListener = new IsWriteable(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToClusterSettings(builder -> builder.addClusterListener(clusterListener)) .build(); MongoClient mongoClient = MongoClients.create(settings); MongoDatabase database = mongoClient.getDatabase(DATABASE); MongoCollection<Document> collection = database.getCollection(COLLECTION); // Run a command to trigger a ClusterDescriptionChangedEvent event collection.find().first();
上記のコード スニペットは、次のような出力を生成します。
Able to write to server
このセクションで説明されるクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
接続プール イベント
接続プール イベントは、ドライバーによって保持される接続プールに関連するイベントです。 接続プールは、ドライバーが MongoDB インスタンスと維持するオープン TCP 接続のセットです。 接続プールは、アプリケーションが MongoDB インスタンスで実行する必要があるネットワーク ハンドシェイクの数を減らし、アプリケーションの実行を高速化するのに役立ちます。
接続プールのイベントを監視するには、 ConnectionPoolListenerインターフェースを実装するクラスを記述し、そのクラスのインスタンスをMongoClientインスタンスに登録します。
例
この例では、接続プールから接続をチェックアウトするたびにメッセージを出力するリスナー クラスを作成する方法を示します。
次のコードでは、 ConnectionPoolListenerインターフェースを実装するConnectionPoolLibrarianクラスを定義します。
class ConnectionPoolLibrarian implements ConnectionPoolListener { public void connectionCheckedOut(final ConnectionCheckedOutEvent event) { System.out.println(String.format("Let me get you the connection with id %s...", event.getConnectionId().getLocalValue())); } public void connectionCheckOutFailed(final ConnectionCheckOutFailedEvent event) { System.out.println("Something went wrong! Failed to checkout connection."); } }
次のコードは、 ConnectionPoolLibrarianクラスのインスタンスをMongoClientオブジェクトに追加します。 次に、コードはデータベースコマンドを実行してライブラリーをテストします。
ConnectionPoolLibrarian cpListener = new ConnectionPoolLibrarian(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(cpListener)) .build(); MongoClient mongoClient = MongoClients.create(settings); MongoDatabase database = mongoClient.getDatabase(DATABASE); MongoCollection<Document> collection = database.getCollection(COLLECTION); // Run a command to trigger connection pool events collection.find().first();
上記のコード スニペットは、次のような出力を生成します。
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 に移動して接続プールを調べることができます。
JMXConnectionPoolListener connectionPoolListener = new JMXConnectionPoolListener(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(connectionPoolListener)) .build(); // Creates a MongoClient instance that enables connection pool event monitoring with the JMX tool MongoClient mongoClient = MongoClients.create(settings); try { System.out.println("Navigate to JConsole to see your connection pools..."); // Pauses the code execution so you can navigate to JConsole and inspect your connection pools Thread.sleep(Long.MAX_VALUE); // Prints exception details if any exceptions occur during the code execution } catch (Exception e) { e.printStackTrace(); }
上記のコード スニペットは、次のような出力を生成します。
Navigate to JConsole to see your connection pools...
サーバーを起動したら、次のコマンドを使用してターミナルで Jコンソールを開きます。
jconsole
JConole が開いたら、GUI で次のアクションを実行します。
上記のサンプル コードを実行している Java プロセスを選択します。
警告ダイアログ ボックスで [ Insecure Connectionを押します。
[ MBeans ] タブをクリックします。
"org.mongodb.driver"ドメインの下の接続プール イベントを調べます。
JCon Console で接続プールを検査 しなくなった 場合は、次の操作を行います。
JCon Console ウィンドウを閉じて JConole を終了します
上記のコード スニペットを実行している Java プログラムを停止します
JTX と JCon Console の詳細については、 Oracle の次のリソースを参照してください。
JMXConnectionPoolListenerクラスの詳細については、 JMXConnectionPoolListener のAPIドキュメントを参照してください。
分散トレース システムにドライバーを含める
分散トレース システムを使用する場合は、ドライバーからのイベント データを含めることができます。 分散トレース システムは、サービス指向アーキテクチャ内のさまざまなサービス全体にリクエストが反映されるのを追跡するアプリケーションです。
ドライバーをspring Cloudアプリケーションで使用する場合は、spring Cloud Sleuth を使用して、 MongoDBイベントデータを Zipken 分散トレース システムに含めます。
spring Cloud を使用していない場合、または Zipken 以外の分散トレース システムにドライバーイベントデータを含める必要がある場合は、目的の分散トレース システム用に範囲を管理するコマンドイベントリスナーを記述する必要があります。このようなリスナーの実装を確認するには、spring Cloud Sleuthソースコードの TaceMongoCommandLister クラスを参照してください。
spring Cloud Sleuth の詳細については、spring Cloud Sleuth ドキュメントの 使用開始 を参照してください。
分散トレース システムの詳細な説明については、 Google Research の Dapper を参照してください。