Overview
このガイドでは、 MongoDB Javaドライバーで監視を設定および構成する方法を学習できます。
モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報はアプリケーションパフォーマンス マネジメント ライブラリで使用できます。
Javaドライバーを監視すると、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計およびデバッグ時に情報に基づいた決定を行うことができます。
このガイドでは、次のタスクを実行する方法を説明します。
このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーでイベントをレコード方法については、 Javaドライバーの ログガイド を参照してください。
イベントの監視
イベントをモニタリングするには、 MongoClient
インスタンスにリスナーを登録する必要があります。
イベントとは、実行中のプログラム内で発生するすべてのアクションです。 ドライバーには、ドライバーの実行中に発生するイベントのサブセットをリッスンする機能が含まれています。
リスナーは、特定のイベントが発生したときに何らかのアクションを実行するクラスです。 リスナーの API は、応答できるイベントを定義します。
リスナー クラスの各メソッドは、特定のイベントに対する応答を表します。 各メソッドは 1 つの引数を受け取ります。これは、メソッドが応答するイベントを表すオブジェクトです。
MongoDB Java ドライバーは、定義するイベントを次の 3 つのカテゴリに整理します。
コマンド イベント
サーバー検出と監視イベント
接続プール イベント
次のセクションでは、各イベント カテゴリをモニターする方法を示します。
監視できるイベントの詳細については、イベントクラスのAPIドキュメントを参照してください。
コマンド イベント
コマンド イベントは、MongoDB database コマンドに関連するイベントです。 コマンド イベントを生成するデータベースコマンドの例には、 find
、 insert
、 delete
、 count
などがあります。
コマンド イベントを監視するには、 CommandListener
インターフェースを実装するクラスを記述し、そのクラスのインスタンスをMongoClient
インスタンスに登録します。
MongoDBデータベースコマンドの詳細については、サーバー マニュアルのデータベースコマンドガイドを参照してください。
注意
内部コマンド
Javaドライバーは、内部的に呼び出すコマンドのイベントを公開しません。これには、ドライバーがクラスターを監視するために使用するデータベースコマンドと、接続確立に関連するコマンド(最初の hello
コマンドなど)が含まれます。
重要
編集済み出力
例
この例では、データベースコマンドのカウンターを作成する方法を示します。 カウンターは、ドライバーが各データベースコマンドを正常に実行した回数を追跡し、データベースコマンドが完了するたびにこの情報を出力します。
カウンターを作成するには、次の手順を行います。
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
インスタンスを構成します。次に、コードはサンプルfind()
コマンドを実行してカウンターをテストします。
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); // Runs sample find() 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 つの個別のリスナー インターフェイスに分割します。以下は 3 つのインターフェースと、それらが listen するイベントです。
ClusterListener
:トポロジー関連のイベントServerListener
:mongod
またはmongos
プロセスに関連するイベントServerMonitorListener
: ハートビート関連のイベント
SDAM イベントのタイプを監視するには、前述の 3 つのインターフェースのいずれかを実装するクラスを記述し、そのクラスのインスタンスをMongoClient
インスタンスに登録します。
ドライバー内の各 SDAMイベントの詳細については、 Githubの th MongoDB SDAM ログとモニタリングの仕様 のサーバーAPIセクションを参照してください。
注意
負荷分散モード
ドライバーは、 負荷分散モードの場合、ハートビートに関連するイベントを発行しません。負荷分散による SDAM イベントの詳細については、 Githubの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); // Runs a sample find() command to trigger a ClusterDescriptionChangedEvent event collection.find().first();
上記のコード スニペットは、次のような確認メッセージを生成します。
Able to write to server
このセクションで説明されるクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
接続プール イベント
接続プールイベントは、ドライバーによって保持される接続プールに関連するイベントです。接続プールとは、ドライバーがMongoDBインスタンスと維持するオープン TCP 接続のセットです。接続プールは、 MongoDBインスタンスで実行する必要があるネットワーク ハンドアプリケーションの数を減らし、アプリケーションの実行を高速化するのに役立ちます。接続プールの詳細については、 Javaドライバーの接続プールガイドを参照してください。
接続プールのイベントを監視するには、 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); // Runs a sample find() command to trigger connection pool events collection.find().first();
上記のコード スニペットは、次のような出力を生成します。
Let me get you the connection with id 21...
このセクションで説明されるクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
JTX による接続プール イベントの監視
Java 管理拡張機能(JTX)を使用して接続プールのイベントを監視できます。 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 を参照してください。