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