Overview
En esta guía, puede aprender a configurar la supervisión en el controlador de sincronización de Kotlin.
La monitorizació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 biblioteca de gestión del rendimiento de aplicaciones.
Puedes usar el controlador Kotlin Sync para supervisar eventos del clúster, comandos del controlador y grupos de conexiones. Estas funciones te ayudan a tomar decisiones informadas al diseñar y depurar tu aplicación.
Esta guía muestra cómo realizar las siguientes tareas:
Supervisar eventos específicos mediante el controlador Kotlin Sync
Supervisar eventos del grupo de conexiones con Java Management Extensions (JMX) y JConsole
Tip
Esta guía muestra cómo usar la información sobre la metaactividad del conductor. Para aprender a registrar transacciones de datos, consulte Página deseguimiento de cambios en los datos.
Monitorear eventos
Para monitorear un evento, debes registrar un oyente en tu MongoClient
instancia.
Un evento es cualquier acción que ocurre en un programa en ejecución. El controlador incluye la funcionalidad de escuchar un subconjunto de los eventos que ocurren durante su ejecución.
Un oyente es una clase que realiza una acción cuando ocurren ciertos eventos. Su API 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 el evento.
El controlador Kotlin Sync organiza los eventos que define en tres categorías:
Eventos de comando
Eventos de detección y monitorización de servidores
Eventos del pool de conexiones
Las siguientes secciones muestran cómo monitorizar cada categoría de evento. Para obtener una lista completa de los eventos que puede monitorizar, consulte el paquete de eventos de Java.
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 monitorear eventos de comando, cree una clase que implemente la interfaz CommandListener y registre una instancia de esa clase con su instancia MongoClient.
Para obtener más información sobre los comandos de base de datos de MongoDB, consulte la entrada del manual de MongoDB sobre comandos de base de datos en el manual del servidor MongoDB.
Nota
Comandos internos
El controlador no publica eventos para los comandos que llama internamente. Esto incluye los comandos de base de datos que utiliza para supervisar el clúster y los comandos relacionados con el establecimiento de la conexión, como el comando inicial hello.
Importante
Salida redactada
Como medida de seguridad, el controlador censura el contenido de algunos eventos de comando. Esto protege la información confidencial contenida en estos eventos. Para obtener una lista completa de los eventos de comando censurados, consulte la especificación de registro y monitorización de comandos de MongoDB.
Ejemplo
Este ejemplo muestra cómo crear un contador para comandos de base de datos. El contador registra el número de veces que el controlador ejecuta correctamente cada comando de base de datos e imprime esta información cada vez que finaliza un comando.
Para hacer un contador, siga estos pasos:
Cree una clase con funcionalidad de contador que implemente la interfaz
CommandListener.Agrega una instancia de la nueva clase a un objeto
MongoClientSettings.Configure su 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 métodos mencionados en esta sección, consulte la siguiente documentación de API:
Eventos de detección y supervisión del servidor
Un evento de descubrimiento y monitoreo de servidor (SDAM) es un evento relacionado con un cambio en el estado de la instancia o el clúster de MongoDB al que ha conectado el controlador.
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
mongodmongosprocesos oServerMonitorListener: escucha eventos relacionados con el latido
Para monitorear un tipo de evento SDAM, cree una clase que implemente una de las tres interfaces anteriores y registre una instancia de esa clase con su instancia MongoClient.
Para obtener una descripción detallada de cada evento SDAM, consulte la especificación de eventos de monitoreo 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 informe el estado de escritura, realice las siguientes tareas:
Cree una clase que realice un seguimiento de 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.Configure su 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 métodos mencionados en esta sección, consulte la siguiente documentación de API:
Eventos del grupo de conexiones
Un evento de grupo de conexiones es un evento relacionado con un grupo de conexiones que mantiene el controlador. Un grupo de conexiones es un conjunto de conexiones TCP abiertas que el controlador mantiene con una instancia de MongoDB. Los grupos de conexiones ayudan a reducir el número de protocolos de enlace de red que la aplicación realiza con una instancia de MongoDB y pueden acelerar su ejecución.
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 imprime un mensaje cada vez que se extrae una conexión de su grupo de conexiones.
Para crear un evento que informe sobre las comprobaciones de conexión, realice las siguientes tareas:
Cree una clase que realice un seguimiento de los pagos e implemente la interfaz
CommandListener.Agrega una instancia de la nueva clase a un objeto
MongoClientSettings.Configure su 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 métodos mencionados en esta sección, consulte la siguiente documentación de API:
Monitorear eventos del pool de conexiones con JMX
Puede supervisar los eventos del grupo de conexiones mediante Java Management 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 grupo de conexiones JMX, agregue una instancia de la clase JMXConnectionPoolListener a su objeto MongoClient.
La clase JMXConnectionPoolListener realiza las siguientes acciones:
Crea instancias MXBean para cada proceso
mongodomongoscon el que el controlador mantiene un grupo de conexiones.Registra estas instancias MXBean con el servidor MBean de la plataforma.
Los 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 controlador tenga un nombre único cuando una aplicación tiene varias instancias |
| El nombre de host de la máquina que ejecuta el proceso |
| El puerto en el que está escuchando el proceso |
| El tamaño mínimo del grupo de conexiones, incluidas las conexiones inactivas y en uso. |
| El tamaño máximo del grupo de conexiones, incluidas las conexiones inactivas y en uso. |
| El tamaño actual del grupo de conexiones, incluidas las conexiones inactivas y en uso. |
| El recuento actual de conexiones que están en uso. |
Todas las instancias MXBean creadas por el controlador están bajo el dominio "org.mongodb.driver".
Para obtener más información sobre los temas tratados en esta subsección, consulte los siguientes recursos de Oracle:
Ejemplo de JMX y JConsole
Este ejemplo muestra cómo supervisar los grupos de conexiones del controlador mediante JMX y JConsole. JConsole es una herramienta de monitorización de interfaz gráfica de usuario (GUI) compatible con JMX que se incluye en la plataforma Java.
Tip
Consulte la documentación oficial de JMX y JConsole
Las descripciones de JMX y JConsole en este ejemplo son ilustrativas, no una fuente de información veraz. Para garantizar la información actualizada, consulte los siguientes recursos oficiales de Oracle:
El siguiente fragmento de código añade una instancia JMXConnectionPoolListener a una instancia MongoClient. El código pausa la ejecución para que puedas acceder 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 haya iniciado su servidor, abra JConsole en su terminal usando el siguiente comando:
jconsole
Una vez abierto JConsole, realice las siguientes acciones en la GUI:
Seleccione el proceso que ejecuta el código de ejemplo anterior.
Presiona Insecure Connection en el cuadro de diálogo de advertencia.
Haga clic en la pestaña MBeans.
Inspeccione los eventos de su grupo de conexiones bajo el dominio
"org.mongodb.driver".
Cuando ya no desee inspeccionar sus grupos de conexiones en JConsole, haga lo siguiente:
Salga de JConsole cerrando la ventana de JConsole.
Detenga el programa que se está ejecutando mediante el fragmento de código anterior.
Para obtener más información sobre JMX y JConsole, consulte los siguientes recursos de Oracle:
Para obtener más información sobre la JMXConnectionPoolListener clase, consulte la documentación de la API para JMXConnectionPoolListener.
Incluya el controlador en su sistema de seguimiento distribuido
Si utiliza un sistema de seguimiento distribuido, puede incluir datos de eventos del controlador. Un sistema de seguimiento distribuido es una aplicación que rastrea las solicitudes a medida que se propagan por los diferentes servicios en una arquitectura orientada a servicios.
Si usa el controlador en una aplicación Spring Cloud, use Spring Cloud Sleuth para incluir datos de eventos de MongoDB en el sistema de seguimiento distribuido Zipkin.
Si no utiliza Spring Cloud o desea incluir datos de eventos del controlador en un sistema de seguimiento distribuido que no sea Zipkin, debe escribir un detector de eventos de comando que administre los intervalos para el sistema de seguimiento distribuido deseado.
Tip
Para obtener más información sobre los conceptos analizados en esta sección, revise los siguientes recursos:
- Nube de primavera
- Escucha de comandos TraceMongo
- :Una implementación de un sistema de escucha de eventos que gestiona intervalos
Dapper: una descripción detallada de un sistema de rastreo distribuido de Google Research