Docs Menu
Docs Home
/ / /
Java 同期
/

モニタリング

項目一覧

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

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

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

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

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

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

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

このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。 ドライバーでイベントを記録する方法について詳しくは、ログ記録に関するガイドをお読みください。

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

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

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

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

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

  • コマンド イベント

  • サーバー検出と監視イベント

  • 接続プール イベント

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

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

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

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

MongoDB データベースコマンドの詳細については、 データベースコマンドに関する MongoDB マニュアルのエントリを参照してください。

注意

内部コマンド

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

重要

編集済み出力

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

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

カウンターを作成するには、次の手順を行います。

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

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

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

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

class CommandCounter implements CommandListener {
private Map<String, Integer> commands = new HashMap<String, Integer>();
@Override
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());
}
@Override
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;
@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クラスをテストします。

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 {
@Override
public void connectionCheckedOut(final ConnectionCheckedOutEvent event) {
System.out.println(String.format("Let me get you the connection with id %s...",
event.getConnectionId().getLocalValue()));
}
@Override
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 ドキュメントを参照してください。

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

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

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

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

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

  2. これらの XT インスタンスをプラットフォーム M Manager サーバーに登録します。

プラットフォーム 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();
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 で次のアクションを実行します。

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

  2. 警告ダイアログ ボックスで [ Insecure Connectionを押します。

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

  4. "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 調査 より提供。

戻る

ログ記録