Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

Supervisar eventos de aplicaciones

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.

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.

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)

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.

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úster

  • ServerListenerEscucha eventos relacionados con cambios individuales en el servidor

  • ServerMonitorListener: 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.

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úster

  • clusterClosed()Imprime un mensaje cuando el controlador se desconecta de un clúster

  • clusterDescriptionChanged(): 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

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 hello al servidor. Esta acción se llama latido del corazón.

Se publica cuando el latido tiene éxito.

Se publica cuando falla el latido.

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.

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...

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.

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: