Skip to content

[Kotlin Sync] Monitoring > Cluster Monitoring #65

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions source/includes/monitoring_JMX.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import com.mongodb.kotlin.client.MongoClient
import org.bson.json.JsonWriterSettings
import com.mongodb.event.*
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))
.addCommandListener(connectionPoolListener)
.build()

// Pause execution
try {
println("Navigate to JConsole to see your connection pools...")
Thread.sleep(Long.MAX_VALUE)
} catch (e: Exception) {
e.printStackTrace()
}

mongoClient.close()
}
45 changes: 45 additions & 0 deletions source/includes/monitoring_counter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import com.mongodb.kotlin.client.MongoClient
import org.bson.json.JsonWriterSettings
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()
}
38 changes: 38 additions & 0 deletions source/includes/monitoring_librarian.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import com.mongodb.kotlin.client.MongoClient
import org.bson.json.JsonWriterSettings
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))
.addCommandListener(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()
}
49 changes: 49 additions & 0 deletions source/includes/monitoring_writable.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import com.mongodb.kotlin.client.MongoClient
import org.bson.json.JsonWriterSettings
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()
}
1 change: 1 addition & 0 deletions source/index.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
Specialized Data Formats </data-formats>
Builders </builders>
Run a Command </run-command>
Monitoring </monitoring>
Security </security>
In-Use Encryption </security/encrypt-fields>
Compatibility </compatibility>
Expand Down
Loading
Loading