Overview
En esta guía, se puede aprender cómo configurar y ajustar la supervisión en el driver de sincronización de Kotlin.
La supervisión es el proceso de obtener información sobre las actividades que realiza un programa en ejecución para su uso en una aplicación o en una librería de gestión de rendimiento de aplicaciones.
Puedes usar el controlador Kotlin Sync para monitorizar los eventos de clúster, comandos del controlador y del pool de conexiones. Estas funcionalidades te ayudan a tomar decisiones informadas al diseñar y depurar tu aplicación.
Esta guía muestra cómo realizar las siguientes tareas:
Supervisa eventos específicos usando el driver de sincronización Kotlin
Supervisar eventos de pools de conexiones con Java Gestión Extensions (JMX) y JConsole
Tip
Esta guía muestra cómo utilizar información sobre la metaactividad del driver. Para aprender cómo registrar transacciones de datos, consulta el Página de supervisión de cambios en los datos.
Supervisar eventos
Para supervisar un evento, debes registrar un escuchador en tu MongoClient
instancia.
Un evento es cualquier acción que ocurre en un programa en ejecución. El controlador incluye funcionalidad para escuchar un subconjunto de los eventos que ocurren cuando el controlador está en funcionamiento.
Un listener es una clase que realiza alguna acción cuando ocurren ciertos eventos. La API de un listener define los eventos a los que puede responder.
Cada método de una clase oyente representa una respuesta a un determinado evento, y acepta como argumento un objeto de evento que representa dicho evento.
El driver Kotlin sincronizar organiza los eventos que define en tres categorías:
Eventos de comando
Eventos de descubrimiento y supervisión de servidores
Eventos del pool de conexiones
Las siguientes secciones muestran cómo supervisar cada categoría de evento. Para obtener una lista completa de los eventos que puede supervisar, consulta el paquete Java de eventos.
Eventos de comando
Un evento de comando es un evento relacionado con un comando de base de datos MongoDB. Algunos ejemplos de comandos de base de datos que producen eventos de comando son find, insert, delete y count.
Para supervisar los eventos de comando, crea una clase que implemente la interfaz CommandListener y registra una instancia de esa clase en tu instancia de MongoClient.
Para más información sobre los comandos de base de datos de MongoDB, consulta la entrada del manual de MongoDB sobre comandos de base de datos en el manual de MongoDB Server.
Nota
órdenes internas
El driver no publica eventos de los comandos que llama internamente. Esto incluye comandos de base de datos que el driver utiliza para supervisar tu clúster y comandos relacionados con el establecimiento de conexión, como el comando inicial hello.
Importante
Salida redactada
Como medida de seguridad, el controlador oculta el contenido de algunos eventos de comando. Esto protege la información sensible contenida en estos eventos de órdenes. Para obtener una lista completa de los eventos de comandos editados, consulta la Especificación de registro y supervisión de comandos de MongoDB.
Ejemplo
Este ejemplo muestra cómo crear un contador para los comandos de base de datos. El contador driver la cantidad de veces que el driver ejecuta correctamente cada comando de base de datos e imprime esta información cada vez que se termina un comando de base de datos.
Para crear un contador, sigue estos pasos:
Crea una clase con funcionalidad de contador que implemente la interfaz
CommandListener.Agrega una instancia de la nueva clase a un objeto
MongoClientSettings.Configura tu instancia
MongoClientcon el objetoMongoClientSettings.
El siguiente código implementa estos pasos:
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}
Para obtener más información sobre las clases y los métodos mencionados en esta sección, consulte la siguiente documentación de la API:
Eventos de Descubrimiento y Supervisión de Servidores
Un evento de descubrimiento y supervisión del servidor (SDAM) es aquel relacionado con un cambio en el estado de la instancia o clúster de MongoDB al que has conectado el driver.
El controlador define nueve eventos SDAM y proporciona las siguientes interfaces de escucha, que escuchan tres eventos SDAM cada una:
ClusterListener : Escucha eventos relacionados con la topología
ServerListener : Escucha eventos relacionados con los procesos
mongodomongosServerMonitorListener : Escucha los eventos relacionados con el latido del corazón
Para supervisar un tipo de evento SDAM, crea una clase que implemente una de las tres interfaces anteriores y registra una instancia de esa clase en tu instancia de MongoClient.
Para una descripción detallada de cada evento SDAM, consulte la especificación de eventos de supervisión SDAM de MongoDB.
Ejemplo
Este ejemplo muestra cómo crear una clase listener que imprimirá un mensaje sobre la disponibilidad de escritura de tu instancia MongoDB.
Para crear un evento que reporte el estado de guardado, realiza las siguientes tareas:
Crear una clase que rastree los cambios en la descripción del clúster e implemente la interfaz
ClusterListener.Agrega una instancia de la nueva clase a un objeto
MongoClientSettings.Configura tu instancia
MongoClientcon el objetoMongoClientSettings.
El siguiente código implementa estos pasos:
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
Para obtener más información sobre las clases y los métodos mencionados en esta sección, consulte la siguiente documentación de la API:
Eventos del pool de conexiones
Un evento del pool de conexiones es un evento relacionado con un pool de conexiones mantenido por el driver. Un pool de conexiones es un conjunto de conexiones TCP abiertas que tu controlador mantiene con una instancia de MongoDB. Las agrupaciones de conexiones ayudan a reducir la cantidad de intercambios de red que realiza tu aplicación con una instancia de MongoDB y pueden ayudar a que tu aplicación funcione más rápido.
Para supervisar los eventos del grupo de conexiones, cree una clase que implemente la interfaz ConnectionPoolListener y registre una instancia de esa clase con su instancia MongoClient.
Ejemplo
Este ejemplo muestra cómo crear una clase de escucha que imprima un mensaje cada vez que saque una conexión de su pool de conexiones.
Para crear un evento que reporte la salida de conexiones, lleva a cabo las siguientes tareas:
Crea una clase que rastree los retiros y que implemente la interfaz
CommandListener.Agrega una instancia de la nueva clase a un objeto
MongoClientSettings.Configura tu instancia
MongoClientcon el objetoMongoClientSettings.
El siguiente código implementa estos pasos:
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...
Para obtener más información sobre las clases y los métodos mencionados en esta sección, consulte la siguiente documentación de la API:
Monitoriza los eventos del pool de conexiones con JMX
Puedes supervisar eventos de pools de conexiones usando Java gestión Extensions (JMX). JMX proporciona herramientas para supervisar aplicaciones y dispositivos.
Para obtener más información sobre JMX, consulte la documentación oficial de Oracle JMX.
Soporte JMX
Para habilitar la supervisión del pool de conexiones JMX, agrega una instancia de la clase JMXConnectionPoolListener a tu objeto MongoClient.
La clase JMXConnectionPoolListener realiza las siguientes acciones:
Crea instancias de MXBean para cada proceso
mongodomongoscon el que el driver mantiene un pool de conexiones.Registra estas instancias de MXBean en el servidor MBean de la plataforma.
MXBeans registrados en el servidor MBean de la plataforma tienen las siguientes propiedades:
Propiedad | Descripción |
|---|---|
| Un identificador único generado por el cliente. Este identificador garantiza que cada MXBean que crea el driver tenga un nombre único cuando una aplicación tenga varias instancias de |
| El nombre de host de la máquina que ejecuta el proceso |
| El puerto en el que el proceso |
| El tamaño mínimo del pool de conexiones, incluyendo las conexiones inactivas y en uso. |
| El tamaño máximo del pool de conexiones, incluidas las conexiones ociosas y en uso. |
| El tamaño actual del pool de conexiones, incluidas las conexiones inactivas y en uso. |
| El recuento actual de conexiones que están en uso. |
Todas las instancias de MXBean creadas por el driver están bajo el dominio "org.mongodb.driver".
Para obtener más información sobre los temas tratados en esta subsección, consulta los siguientes recursos de Oracle:
Ejemplo de JMX y JConsole
Este ejemplo muestra cómo puedes supervisar las pools de conexiones del driver usando JMX y JConsole. JConsole es una herramienta de supervisión con interfaz gráfica de usuario compatible con JMX que viene con la Plataforma Java.
Tip
Consulta la documentación oficial de JMX y JConsole
Las descripciones de JMX y JConsole en este ejemplo son ilustrativas y no una fuente de verdad. Para obtener información actualizada garantizada, consulta los siguientes recursos oficiales de Oracle:
El siguiente snippet añade un JMXConnectionPoolListener a una instancia de MongoClient. El código entonces pausa la ejecución para que puedas navegar a JConsole e inspeccionar tus grupos de conexiones.
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...
Una vez que hayas iniciado el servidor, abre JConsole en tu terminal usando el siguiente comando:
jconsole
Una vez que JConsole esté abierto, realice las siguientes acciones en la GUI:
Selecciona el proceso que está ejecutando el código del ejemplo anterior.
Presiona Insecure Connection en el cuadro de diálogo de advertencia.
Haz clic en la pestaña MBeans.
Inspecciona tus eventos de pool de conexiones en el dominio
"org.mongodb.driver".
Cuando ya no quieras inspeccionar tus pool de conexiones en JConsole, haz lo siguiente:
Salga de JConsole cerrando la ventana de JConsole.
Detener el programa que se ejecuta mediante el snippet de código anterior.
Para obtener más información sobre JMX y JConsole, consulta los siguientes recursos de Oracle:
Para obtener más información sobre la JMXConnectionPoolListener clase, consulte la documentación de la API de JMXConnectionPoolListener.
Incluye el driver en tu sistema de trazabilidad distribuida
Si utilizas un sistema de seguimiento distribuido, puedes incluir datos de eventos del controlador. Un sistema de rastreo distribuido es una aplicación que rastrea las solicitudes a medida que se propagan a través de diferentes servicios en una arquitectura orientada a servicios.
Si utiliza el controlador en una aplicación Spring Cloud, use Spring Cloud Sleuth para incluir datos de eventos de MongoDB en el sistema de trazabilidad distribuida Zipkin.
Si no utilizas Spring Cloud o deseas incluir datos de eventos del controlador en un sistema de rastreo distribuido que no sea Zipkin, deberás escribir un oyente de eventos de comandos que administre los spans para tu sistema de rastreo distribuido deseado.
Tip
Para obtener más información sobre los conceptos tratados en esta sección, revisión los siguientes recursos:
- Spring Nube
- TraceMongoCommandListener
- : Una implementación de escucha de eventos que administra tramos
Dapper : Una descripción detallada de un sistema de rastreo distribuido de Google Research