Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー

配置のモニタリング

項目一覧

  • Overview
  • イベントの監視
  • コマンド イベント
  • サーバー検出と監視イベント
  • 接続プール イベント
  • JTX による接続プール イベントの監視
  • JTX サポート
  • JMAX と Jコンソールの例
  • 分散トレース システムにドライバーを含める
  • API ドキュメント

このガイドでは、Java Reactive Streams ドライバーで監視を設定および構成する方法を学習できます。

モニタリングとは、アプリケーションまたはアプリケーション パフォーマンス管理ライブラリで使用するために実行中のプログラムが実行するアクティビティに関する情報を収集するプロセスです。

MongoDB Java ドライバーをモニターすると、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計とデバッグに際に情報に基づいた決定を行うのに役立ちます。

このガイドでは、次のタスクを実行する方法を学習します。

  • MongoDB Java ドライバー でさまざまなタイプのイベントを監視する

  • Java 管理拡張機能(JTX)と JConole による接続プール イベントの監視

イベントをモニタリングするには、 MongoClientインスタンスにリスナーを登録する必要があります。

イベントとは、実行中のプログラム内で発生するすべてのアクションです。 ドライバーには、ドライバーの実行中に発生するイベントのサブセットをリッスンする機能が含まれています。

リスナーは、特定のイベントが発生したときに何らかのアクションを実行するクラスです。 リスナーの API は、応答できるイベントを定義します。

リスナー クラスの各メソッドは、特定のイベントに対する応答を表します。 各メソッドは 1 つの引数を受け取ります。これは、メソッドが応答するイベントを表すオブジェクトです。

MongoDB Java ドライバーは、定義するイベントを次の 3 つのカテゴリに整理します。

  • コマンド イベント

  • サーバー検出とモニタリング イベント

  • 接続プール イベント

次のセクションでは、各イベント カテゴリをモニターする方法を示します。

監視できるイベントの完全なリストについて は、MongoDB Java ドライバーのイベント パッケージを参照してください。

コマンド イベントは、MongoDB database コマンドに関連するイベントです。 コマンド イベントを生成するデータベースコマンドの例には、 findinsertdeletecountなどがあります。

コマンド イベントを監視するには、 CommandListenerインターフェースを実装するクラスを作成し、そのクラスのインスタンスをMongoClientインスタンスに登録します。

MongoDB database コマンドの詳細については、MongoDB サーバー マニュアルの「データベースコマンド」を参照してください。

注意

内部コマンド

ドライバーは、内部的に呼び出すコマンドのイベントを公開しません。 これには、ドライバーがクラスターを監視するために使用するデータベースコマンドと、接続確立に関連するコマンド(最初のhelloコマンドなど)が含まれます。

重要

編集済み出力

セキュリティ対策として、ドライバーは一部のコマンド イベントの内容を編集します。 これにより、これらのコマンド イベントに含まれる機密情報が保護されます。 編集されたコマンド イベントの完全なリストについては、 MongoDB コマンドのログとモニタリングの仕様 を参照してください。

次の例は、データベースコマンドのカウンターの作成方法を示しています。カウンターは、ドライバーが各データベースコマンドを正常に実行した回数を追跡し、データベースコマンドが完了するたびにこの情報を出力します。

カウンターを実装するには、次の手順を実行します。

  1. CommandListenerインターフェースを実装するカウンター機能を持つクラスを作成します。

  2. CommandListenerを実装する新しいクラスのインスタンスをMongoClientSettingsオブジェクトに追加します。

  3. MongoClientSettingsオブジェクトを使用してMongoClientインスタンスを構成します。

次のコードでは、 CommandListenerインターフェースを実装するCommandCounterクラスを定義します。

class CommandCounter implements CommandListener {
private final Map<String, Integer> commands = new HashMap<String, Integer>();
@Override
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);
}
@Override
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();
}

サーバー検出と監視(SDAM)イベントは、ドライバーを接続した MongoDB インスタンスまたはクラスターの状態の変更に関連するイベントです。

ドライバーは 9 つの SDAM イベントを定義します。 ドライバーはこれら 9 つのイベントを 3 つの個別のリスナー インターフェースに分割し、それぞれが 9 つのイベントのうち 3 つをリッスンします。 以下は 3 つのインターフェースと、それらが listen するイベントです。

  • ClusterListener: topology-related events

  • ServerListener: mongodまたはmongosプロセスに関連するイベント

  • ServerMonitorListener: heartbeat-related events

SDAM イベントのタイプを監視するには、前述の 3 つのインターフェースのいずれかを実装するクラスを記述し、そのクラスのインスタンスをMongoClientインスタンスに登録します。

ドライバー内の各 SDAM イベントの詳細については、「 MongoDB SDAM ログ記録とモニタリングの仕様 」を参照してください。

注意

負荷分散モード

ドライバーは、負荷分散モードではハートビートに関連するイベントを発行しません。 負荷分散による SDAM イベントの詳細については、「 MongoDB ロード バランサーのサポート仕様 」を参照してください。

次の例は、ドライバーが MongoDB インスタンスに書込み (write) ができるかどうかを示すメッセージを出力するリスナー クラスの作成方法を示しています。

次のコードでは、 ClusterListenerインターフェースを実装するIsWritableクラスを定義します。

class IsWritable implements ClusterListener {
private boolean isWritable;
@Override
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();
}

接続プール イベントは、ドライバーによって保持される接続プールに関連するイベントです。接続プールは、ドライバーが MongoDB 配置で維持するオープン TCP 接続のセットです。接続プールは、MongoDB の配置でアプリケーションが実行する必要があるネットワーク ハンドシェイクの数を減らし、アプリケーションの実行を高速化するのに役立ちます。

接続プールのイベントを監視するには、 ConnectionPoolListenerインターフェースを実装するクラスを記述し、そのクラスのインスタンスをMongoClientインスタンスに登録します。

次の例は、接続プールから接続をチェックアウトするたびにメッセージを出力するリスナー クラスの作成方法を示しています。

次のコードでは、 ConnectionPoolListenerインターフェースを実装するConnectionPoolLibrarianクラスを定義します。

class ConnectionPoolLibrarian implements ConnectionPoolListener {
@Override
public void connectionCheckedOut(final ConnectionCheckedOutEvent event) {
System.out.printf("Fetching the connection with id %s...%n",
event.getConnectionId().getLocalValue());
}
@Override
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();
}

Java 管理拡張機能(JTX)を使用して接続プールのイベントを監視できます。 JTX は、アプリケーションとデバイスを監視するためのツールを提供します。

JTX の詳細については 、 Oracle JTX の公式ドキュメントを参照してください。

JMAX 接続プールのモニタリングを有効にするには、 JMXConnectionPoolListenerクラスのインスタンスをMongoClientオブジェクトに追加します。

JMXConnectionPoolListenerクラスは、次のアクションを実行します。

  1. ドライバーが接続プールを維持する各mongodまたはmongosプロセスごとに macOS インスタンスを作成します

  2. これらの 排除します :

プラットフォーム MBuilder に登録された macOS には、次のプロパティがあります。

プロパティ
説明
clusterId
クライアントが生成した一意の識別子。 この識別子により、アプリケーションが同じ MongoDB 配置に接続されている複数のMongoClientインスタンスがある場合に、ドライバーが作成する各 macOS インスタンスが一意の名前を持つことが保証されます。
host
mongodまたはmongosプロセスを実行しているマシンのホスト名。
port
mongodまたはmongosプロセスがリッスンしているポート。
minSize
アイドル状態の接続と使用中の接続を含む接続プールの最小サイズ。
maxSize
アイドル状態と使用中の接続を含む接続プールの最大サイズ。
size
アイドル状態の接続と使用中の接続を含む接続プールの現在のサイズ。
checkedOutCount
使用中の接続の現在数。

ドライバーによって作成されたすべての 排除は、ドメイン"org.mongodb.driver"の下にあります。

このサブセクションで説明するトピックの詳細については、 Oracle の次のリソースを参照してください。

次の例は、 JMAX とJCon Console を使用してドライバーの接続プールを監視する方法を示しています。 JCon Console は、Java プラットフォームに付属する JTX 準拠の GUI 監視ツールです。

Tip

公式の JTX および Jコンソール ドキュメントを参照してください

この例の JMAX と JConole の説明は、真実のソースではなく、説明のためのものです。最新情報の保証については、次の公式 Oracle リソースを参照してください。

次のコード スニペットは、 JMXConnectionPoolListenerMongoClientインスタンスに追加します。 その後、コードの実行が一時停止されるため、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);
}

サーバーを起動したら、ターミナルで次のコマンドを実行して Jコンソールを開きます。

jconsole

JConole が開いたら、GUI で次のアクションを実行します。

  1. 上記のサンプル コードを実行している Java プロセスを選択します。

  2. Click Insecure Connection in the warning dialog box.

  3. [ MBeans ] タブをクリックします。

  4. "org.mongodb.driver"ドメインの下の接続プール イベントを調べます。

JCondle で接続プールを検査する必要がなくなった場合は、次のタスクを実行します。

  1. JCon Console ウィンドウを閉じて、JConole を終了します。

  2. 上記のコード スニペットを実行している 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 調査 より提供。

このドキュメントで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。

戻る

ログ記録