モニタリング
項目一覧
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 には、次のプロパティがあります。
プロパティ | 説明 |
---|---|
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 に移動して接続プールを調べることができます。
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
クラスの詳細については、 JMAXConnectionPoolLister の API ドキュメントを参照してください。
分散トレース システムにドライバーを含める
分散トレース システムを使用する場合は、ドライバーからのイベント データを含めることができます。 分散トレース システムは、サービス指向アーキテクチャ内のさまざまなサービス全体にリクエストが反映されるのを追跡するアプリケーションです。
spring Cloud でドライバーを使用する場合 アプリケーション、 Apple Cloud Sleuth を使用 : MongoDB イベント データを Zip に含めます。 分散トレース システム。
spring Cloud を使用していない場合、または Zipink 以外の分散トレース システムにドライバー イベント データを含める必要がある場合は、範囲を管理するコマンド イベント リスナーを記述する必要があります ご希望の分散トレース システム用に作成します。このようなリスナーの実装を確認するには、次を参照して ください 。 クラス(spring Cloud Sleuth ソースコード)の
spring Cloud Sleuth の詳細については、 「 使用開始 」を 参照してください。 を参照してください。
分散トレースシステムの詳細については、 Dapper を参照してください Google 調査 より提供。