Docs Menu

モニタリング

このガイドでは、 Kotlin Syncドライバーでモニタリングを設定および構成する方法を学習できます。

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

Kotlin Syncドライバーを使用して、クラスター、ドライバー コマンド、および接続プールイベントを監視できます。これらの機能は、アプリケーションの設計およびデバッグ時に情報を得た決定を行うのに役立ちます。

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

Tip

このガイドでは、ドライバーのメタアクティビティに関する情報を使用する方法について説明します。データ トランザクションをレコード方法については、 「データ変更のモニタリング」ページを参照してください。

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

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

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

リスナークラスの各メソッドは特定のイベントへの応答を表し、そのイベントを表すイベントオブジェクトを引数として受け入れます。

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

  • コマンド イベント

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

  • 接続プール イベント

次のセクションでは、各イベントカテゴリをモニターする方法を示します。監視できるイベントの完全なリストについては、 Javaイベントパッケージを参照してください。

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

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

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

注意

内部コマンド

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

重要

編集済み出力

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

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

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

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

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

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

次のコードは、これらの手順を実装します。

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.event.*
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
class CommandCounter : CommandListener {
private val commands = mutableMapOf<String, Int>()
override fun commandSucceeded(event: CommandSucceededEvent) {
val commandName = event.commandName
val count = commands[commandName] ?: 0
commands[commandName] = count + 1
println(commands.toString())
}
override fun commandFailed(event: CommandFailedEvent) {
println("Failed execution of command '${event.commandName}' with id ${event.requestId}")
}
}
fun main() {
val uri = "<connection string uri>"
// Instantiate your new listener
val commandCounter = CommandCounter()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.addCommandListener(commandCounter)
.build()
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
// Run some commands to test the counter
collection.find().firstOrNull()
collection.find().firstOrNull()
mongoClient.close()
}
{find=1}
{find=2}
{find=2, endSessions=1}

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

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

ドライバーは 9 つの SDAM イベントを定義し、それぞれ 3 つの SDAM イベントをリッスンする次のリスナー インターフェースを提供します。

  • ClusterLister : トポロジー関連のイベントをリッスンします

  • ServerLister : または プロセスに関連するイベントをリッスンしますmongodmongos

  • ServerMonitorLister : ハートビート関連のイベントをリッスンします

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

各 SDAM イベントの詳細については、「 MongoDB SDAM モニタリング イベントの仕様 」を参照してください。

この例では、 MongoDBインスタンスの書込み (write) が利用可能かに関するメッセージを出力するリスナークラスを作成する方法を示します。

書込み (write) 状態を報告するイベントを作成するには、次のタスクを実行します。

  1. クラスター説明の変更を追跡するクラスを作成し、ClusterListener インターフェースを実装します。

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

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

次のコードは、これらの手順を実装します。

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.event.*
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
class IsWriteable : ClusterListener {
private var isWritable = false
override fun clusterDescriptionChanged(event: ClusterDescriptionChangedEvent) {
if (!isWritable) {
if (event.newDescription.hasWritableServer()) {
isWritable = true
println("Able to write to cluster")
}
} else {
if (!event.newDescription.hasWritableServer()) {
isWritable = false
println("Unable to write to cluster")
}
}
}
}
fun main() {
val uri = "<connection string uri>"
// Instantiate your new listener
val clusterListener = IsWriteable()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.applyToClusterSettings { builder ->
builder.addClusterListener(clusterListener)
}
.build()
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
// Run a command to trigger a ClusterDescriptionChangedEvent event
collection.find().firstOrNull()
mongoClient.close()
}
Able to write to server

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

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

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

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

接続のチェックアウトを報告するイベントを作成するには、次のタスクを実行します。

  1. チェックアウトを追跡するクラスを作成し、CommandListener インターフェースを実装します。

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

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

次のコードは、これらの手順を実装します。

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.event.*
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
class ConnectionPoolLibrarian : ConnectionPoolListener {
override fun connectionCheckedOut(event: ConnectionCheckedOutEvent) {
println("Let me get you the connection with id ${event.connectionId.localValue}...")
}
override fun connectionCheckOutFailed(event: ConnectionCheckOutFailedEvent) {
println("Something went wrong! Failed to checkout connection.")
}
}
fun main() {
val uri = "<connection string uri>"
// Instantiate your new listener
val cpListener = ConnectionPoolLibrarian()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.applyToConnectionPoolSettings({
it.addConnectionPoolListener(cpListener)
})
.build()
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
// Run some commands to test the counter
collection.find().firstOrNull()
mongoClient.close()
}
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 に移動して接続プールを調べることができます。

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
import com.mongodb.management.JMXConnectionPoolListener
fun main() {
val uri = "<connection string uri>"
// Instantiate your JMX listener
val connectionPoolListener = JMXConnectionPoolListener()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.applyToConnectionPoolSettings {
it.addConnectionPoolListener(connectionPoolListener)
}
.build()
try {
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
collection.find().firstOrNull()
collection.find().firstOrNull()
println("Navigate to JConsole to see your connection pools...")
// Pause execution
Thread.sleep(Long.MAX_VALUE)
mongoClient.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
Navigate to JConsole to see your connection pools...

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

jconsole

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

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

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

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

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

JCon Console で接続プールを検査 しなくなった 場合は、次の操作を行います。

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

  2. 上記のコード スニペットで実行中のプログラムを停止します。

JTX と JCon Console の詳細については、 Oracle の次のリソースを参照してください。

JMXConnectionPoolListenerクラスの詳細については、 JMAXConnectionPoolLister のAPIドキュメントを参照してください。

分散トレース システムを使用する場合は、ドライバーからのイベント データを含めることができます。 分散トレース システムは、サービス指向アーキテクチャ内のさまざまなサービス全体にリクエストが反映されるのを追跡するアプリケーションです。

ドライバーをspring Cloudアプリケーションで使用する場合は、spring Cloud Sleuth を使用して、 MongoDBイベントデータを Zipken 分散トレース システムに含めます。

spring Cloud を使用しない場合、または Zipken 以外の分散トレース システムにドライバーイベントデータを含める場合は、目的の分散トレース システム用に 範囲 を管理するコマンドイベントリスナーを書込み (write) する必要があります。

Tip

このセクションで説明する概念の詳細については、次のリソースを検討してください。