Overview
En esta guía, puedes aprender a usar el driver de Scala para supervisar los eventos que se producen durante el funcionamiento del driver. La supervisión implica recopilar información sobre las actividades de un programa en ejecución, la cual se puede usar con una aplicación o una librería de gestión del rendimiento de aplicaciones.
Puede supervisar los eventos de la aplicación para comprender el uso de recursos y el rendimiento del driver, lo que le ayuda a tomar decisiones informadas al diseñar y depurar su aplicación.
El driver de Scala organiza los eventos que puede supervisar en las siguientes categorías:
Eventos de comando: Eventos relacionados con comandos de base de datos MongoDB
Evento de descubrimiento y supervisión del servidor (SDAM): evento relacionado con los cambios en el estado de la instancia o clúster de MongoDB al que está conectado
Eventos del pool de conexiones: eventos relacionados con el pool de conexiones que el driver mantiene con una instancia de MongoDB
Las siguientes secciones describen cada categoría de evento y muestran cómo supervisar los eventos. Para aprender cómo registrar eventos de driver en un registro, consulta la guía Registro.
Supervisar eventos del comando
Un evento de comando es un evento relacionado con un comando de base de datos MongoDB. Los ejemplos de comandos de base de datos que producen eventos de comando incluyen find, insert, delete y count.
El driver de Scala no publica eventos de los comandos que llama internamente. Esto incluye comandos que el driver utiliza para supervisar tu clúster y comandos relacionados con el establecimiento de conexión, como el comando inicial hello.
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.
Importante
Salida redactada
Como medida de seguridad, el driver oculta el contenido de algunos eventos de comando para proteger la información confidencial. Para obtener una lista completa de los eventos de comando ocultos, consulte la sección Seguridad de la especificación de supervisión y registro de comandos de MongoDB.
Para obtener más información sobre los comandos de base de datos de MongoDB, consulta comandos de base de datos.
Ejemplo
En el siguiente ejemplo se define la clase CommandCounter, que implementa la interfaz CommandListener. La clase rastrea la cantidad de veces que el driver ejecuta correctamente cada comando de base de datos e imprime esta información cada vez que finaliza un comando.
case class CommandCounter() extends CommandListener { private val commands = scala.collection.mutable.Map[String, Int]() override def commandStarted(event: CommandStartedEvent): Unit = {} override def commandSucceeded( event: CommandSucceededEvent ): Unit = { val commandName = event.getCommandName commands(commandName) = commands.getOrElse(commandName, 0) + 1 println(commands.toMap) } override def commandFailed(event: CommandFailedEvent): Unit = {} }
El siguiente código agrega una instancia de la clase CommandCounter a un objeto MongoClientSettings y configura una instancia MongoClient utilizando la configuración:
val settings: MongoClientSettings = MongoClientSettings .builder() .addCommandListener(CommandCounter()) .applyConnectionString(ConnectionString("<connection string>")) .build() val mongoClient: MongoClient = MongoClient(settings)
Al ejecutar la aplicación, el resultado se asemeja al siguiente:
Map(find -> 1) Map(find -> 2) Map(find -> 2, endSessions -> 1)
Descripciones de eventos
En la siguiente tabla se describen los eventos de comando que publica el driver de Scala y la interfaz de escucha que los gestiona:
Tipo de evento | Interfaz de escucha | Descripción |
|---|---|---|
Se publica cuando se inicia un comando de base de datos. | ||
Se publica cuando un comando de base de datos se ejecuta correctamente. | ||
Se publica cuando falla un comando de base de datos. |
Supervisar eventos de SDAM
Un evento de descubrimiento y supervisión del servidor (SDAM) es un evento relacionado con un cambio en el estado de la instancia o clúster de MongoDB al que estás conectado.
El driver de Scala define nueve eventos SDAM y proporciona las siguientes interfaces de oyente, que escuchan tres eventos SDAM cada una:
ClusterListener: Escucha eventos relacionados con cambios de topología, o cambios en el estado y estructura del clústerServerListenerEscucha eventos relacionados con cambios individuales en el servidorServerMonitorListener: Escucha eventos de latido, que informan sobre el estado de la comunicación entre los nodos del set de réplicas
Puede utilizar la información de los eventos de SDAM para comprender los cambios en el clúster, evaluar la salud del clúster o planificar la capacidad.
Ejemplo
El siguiente ejemplo define la clase TestClusterListener, que implementa la interfaz ClusterListener. La clase contiene métodos que imprimen mensajes en respuesta a los siguientes eventos relacionados con la topología:
clusterOpening(): Imprime un mensaje cuando el controlador se conecta por primera vez a un clústerclusterClosed()Imprime un mensaje cuando el controlador se desconecta de un clústerclusterDescriptionChanged(): Imprime un mensaje sobre cambios en la disponibilidad de lectura y escritura del clúster
case class TestClusterListener(readPreference: ReadPreference) extends ClusterListener { var isWritable: Boolean = false var isReadable: Boolean = false override def clusterOpening(event: ClusterOpeningEvent): Unit = println(s"Cluster with ID ${event.getClusterId} opening") override def clusterClosed(event: ClusterClosedEvent): Unit = println(s"Cluster with ID ${event.getClusterId} closed") override def clusterDescriptionChanged(event: ClusterDescriptionChangedEvent): Unit = { if (!isWritable) { if (event.getNewDescription.hasWritableServer) { isWritable = true println("Writable server available") } } else { if (!event.getNewDescription.hasWritableServer) { isWritable = false println("No writable server available") } } if (!isReadable) { if (event.getNewDescription.hasReadableServer(readPreference)) { isReadable = true println("Readable server available") } } else { if (!event.getNewDescription.hasReadableServer(readPreference)) { isReadable = false println("No readable server available") } } } }
El siguiente código agrega una instancia de la clase TestClusterListener a un objeto MongoClientSettings y configura una instancia MongoClient utilizando la configuración:
val uri: ConnectionString = ConnectionString("<connection string>") val settings: MongoClientSettings = MongoClientSettings .builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.addClusterListener(TestClusterListener(ReadPreference.secondary()))) .applyConnectionString(uri) .build() val client: MongoClient = MongoClient(settings)
Al ejecutar la aplicación, el resultado se asemeja al siguiente:
Cluster with ID ClusterId{value='...', description='...'} opening Writable server available Readable server available Cluster with ID ClusterId{value='...', description='...'} closed
Descripciones de eventos
La siguiente tabla describe cada evento SDAM, la interfaz de escucha que lo gestiona y cuándo lo publica el driver:
Tipo de evento | Interfaz de escucha | Descripción |
|---|---|---|
Se publica cuando cambia la descripción de la topología, como cuando se elige un nuevo primario. | ||
Publicado cuando el driver se conecta por primera vez al clúster. | ||
Se publica cuando el driver se desconecta del clúster. | ||
Se publica cuando cambia la descripción del servidor. | ||
Se publica cuando se añade un nuevo servidor a la topología. | ||
Publicado cuando se elimina un servidor existente de la topología. | ||
Se publica cuando el monitor del servidor envía un comando | ||
Se publica cuando el latido tiene éxito. | ||
Se publica cuando falla el latido. |
Supervisa los eventos del grupo de conexiones
Un evento de pool de conexiones es un evento relacionado con el pool de conexiones que el driver mantiene con una instancia de MongoDB. Un pool de conexiones es un conjunto de conexiones TCP abiertas que su driver mantiene con una instancia de MongoDB. Los pools de conexiones reducen el número de handshakes de red que su aplicación necesita realizar y pueden ayudar a que su 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.
Tip
Pools de conexiones
Para obtener más información sobre los pool de conexiones, consulta la guía pool de conexiones.
Ejemplo
En el siguiente ejemplo se define la clase ConnectionPoolLibrarian, que implementa la interfaz ConnectionPoolListener. La clase imprime un mensaje cada vez que el driver extrae una conexión del pool de conexiones.
case class ConnectionPoolLibrarian() extends ConnectionPoolListener { override def connectionCheckedOut( event: ConnectionCheckedOutEvent ): Unit = println( s"Let me get you the connection with id " + s"${event.getConnectionId.getLocalValue}..." ) override def connectionCheckOutFailed( event: ConnectionCheckOutFailedEvent ): Unit = {} }
El siguiente código agrega una instancia de la clase ConnectionPoolLibrarian a un objeto MongoClientSettings y configura una instancia MongoClient utilizando la configuración:
val settings: MongoClientSettings = MongoClientSettings .builder() .applyToConnectionPoolSettings( (builder: ConnectionPoolSettings.Builder) => builder.addConnectionPoolListener( ConnectionPoolLibrarian() ) ) .applyConnectionString(ConnectionString("<connection string>")) .build() val mongoClient: MongoClient = MongoClient(settings)
Al ejecutar la aplicación, el resultado se asemeja al siguiente:
Let me get you the connection with id 1...
Descripciones de eventos
La siguiente tabla describe los eventos del pool de conexiones que publica el driver de Scala y la interfaz de oyente que los gestiona:
Tipo de evento | Interfaz de escucha | Descripción |
|---|---|---|
Publicado cuando se crea el pool de conexiones. | ||
Publicado cuando el pool de conexiones está listo para su uso. | ||
Publicado cuando se cierra el pool de conexiones. | ||
Publicado cuando se crea una conexión en el pool. | ||
Se publica cuando una conexión completa su protocolo de enlace y está lista para su uso. | ||
Publicado cuando se cierra una conexión. | ||
Publicado cuando el driver comienza a retirar una conexión. | ||
Publicado cuando el driver comprueba correctamente una conexión. | ||
Publicado cuando el driver no puede retirar una conexión. | ||
Publicado cuando el driver vuelve a comprobar una conexión en el pool. | ||
Publicado cuando se limpia el pool de conexiones. |
Documentación de la API
Para obtener más información sobre los métodos y tipos tratados en esta guía, consulta la siguiente documentación de la API: