Docs Menu
Docs Home
/ /

Supervisar su implementación

En esta guía, puede aprender a configurar y configurar la supervisión en el controlador Java Reactive Streams.

La monitorización es el proceso de recopilación de 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.

Monitorear el controlador Java de MongoDB le permite comprender el uso y el rendimiento de los recursos del controlador, y puede ayudarlo a tomar decisiones informadas al diseñar y depurar su aplicación.

En esta guía aprenderá a realizar las siguientes tareas:

  • Supervisar diferentes tipos de eventos en el controlador Java de MongoDB

  • Supervisar eventos del grupo de conexiones con Java Management Extensions (JMX) y JConsole

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 de escucha representa una respuesta a un evento específico. Cada método recibe un argumento: un objeto que representa el evento al que responde.

El controlador Java de MongoDB organiza los eventos que define en tres categorías:

  • Eventos de comando

  • Eventos de descubrimiento y supervisión del servidor

  • Eventos del grupo de conexiones

Las siguientes secciones muestran cómo monitorear cada categoría de evento.

Para obtener una lista completa de los eventos que puedes supervisar, consulta el paquete de eventos del driver Java de MongoDB.

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 MongoDB,consulte 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.

El siguiente ejemplo muestra cómo crear un contador para los comandos de base de datos. El contador rastrea el número de veces que el controlador ejecuta con éxito cada comando de base de datos e imprime esta información cada vez que un comando de base de datos finaliza.

Para implementar el contador, realice los siguientes pasos:

  1. Cree una clase con funcionalidad de contador que implemente la interfaz CommandListener.

  2. Agrega una instancia de la nueva clase que implementa CommandListener a un objeto MongoClientSettings.

  3. Configure una instancia MongoClient con el objeto MongoClientSettings.

El siguiente código define la clase CommandCounter que implementa la interfaz CommandListener:

class CommandCounter implements CommandListener {
private final Map<String, Integer> commands = new HashMap<String, Integer>();
@Override
public synchronized void commandSucceeded(final CommandSucceededEvent event) {
String commandName = event.getCommandName();
int count = commands.getOrDefault(commandName, 0);
commands.put(commandName, count + 1);
System.out.println(commands);
}
@Override
public void commandFailed(final CommandFailedEvent event) {
System.out.printf("Failed execution of command '%s' with id %s%n",
event.getCommandName(),
event.getRequestId());
}
}

El siguiente código agrega una instancia de la clase CommandCounter a un objeto MongoClientSettings y configura una instancia MongoClient con el objeto MongoClientSettings. A continuación, ejecuta algunos comandos de base de datos para probar el contador.

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(URI)
.addCommandListener(new CommandCounter())
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase(DATABASE);
MongoCollection<Document> collection = database.getCollection(COLLECTION);
// Run some commands to test the counter
FindPublisher<Document> findPublisher1 = collection.find();
FindPublisher<Document> findPublisher2 = collection.find();
Flux.from(findPublisher1).blockLast();
Flux.from(findPublisher2).blockLast();
}
{find=1}
{find=2}
{find=2, endSessions=1}

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. El controlador divide estos nueve eventos entre tres interfaces de escucha independientes, cada una de las cuales escucha tres de los nueve eventos. A continuación, se muestran las tres interfaces y los eventos que escuchan:

  • ClusterListener: eventos relacionados con latopología

  • ServerListener: eventos relacionados con mongod o mongos procesos

  • ServerMonitorListener:eventos relacionados con los latidos del corazón

Para monitorear un tipo de evento SDAM, escriba 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 en el controlador, consulte la Especificación de registro y monitoreo SDAM de MongoDB.

Nota

Modo de equilibrio de carga

El driver no emite eventos relacionados con el latido cuando está en modo balanceado. Para más detalles sobre los eventos SDAM con balanceo de carga, consulta Especificación de soporte con balanceador de carga de MongoDB.

El siguiente ejemplo muestra cómo crear una clase de escucha que imprime un mensaje que le permite saber si el controlador puede escribir en su instancia de MongoDB.

El siguiente código define la clase IsWritable que implementa la interfaz ClusterListener:

class IsWritable implements ClusterListener {
private boolean isWritable;
@Override
public synchronized void clusterDescriptionChanged(final ClusterDescriptionChangedEvent event) {
if (!isWritable) {
if (event.getNewDescription().hasWritableServer()) {
isWritable = true;
System.out.println("Able to write to server");
}
} else if (!event.getNewDescription().hasWritableServer()) {
isWritable = false;
System.out.println("Unable to write to server");
}
}
}

El siguiente código agrega una instancia de la clase IsWritable a un objeto MongoClient. Luego, el código ejecuta una operación de búsqueda para probar la clase IsWritable.

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(URI)
.applyToClusterSettings(builder ->
builder.addClusterListener(new IsWritable()))
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase(DATABASE);
MongoCollection<Document> collection = database.getCollection(COLLECTION);
// Run a command to trigger a ClusterDescriptionChangedEvent
FindPublisher<Document> findPublisher = collection.find();
Flux.from(findPublisher).blockLast();
}
Able to write to server

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 su controlador mantiene con una implementación de MongoDB. Los grupos de conexiones ayudan a reducir el número de protocolos de enlace de red que su aplicación debe realizar con una implementación de MongoDB y pueden acelerar su ejecución.

Para monitorear eventos del grupo de conexiones, escriba una clase que implemente la interfaz ConnectionPoolListener y registre una instancia de esa clase con su instancia MongoClient.

El siguiente ejemplo muestra cómo crear una clase de oyente que imprime un mensaje cada vez que se saca una conexión de su pool de conexiones.

El siguiente código define la clase ConnectionPoolLibrarian que implementa la interfaz ConnectionPoolListener:

class ConnectionPoolLibrarian implements ConnectionPoolListener {
@Override
public void connectionCheckedOut(final ConnectionCheckedOutEvent event) {
System.out.printf("Fetching the connection with id %s...%n",
event.getConnectionId().getLocalValue());
}
@Override
public void connectionCheckOutFailed(final ConnectionCheckOutFailedEvent event) {
System.out.println("Something went wrong! Failed to checkout connection.");
}
}

El siguiente código agrega una instancia de la clase ConnectionPoolLibrarian a un objeto MongoClient. A continuación, ejecuta un comando de base de datos para probar el bibliotecario.

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(URI)
.applyToClusterSettings(builder ->
builder.addClusterListener(new IsWritable()))
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase(DATABASE);
MongoCollection<Document> collection = database.getCollection(COLLECTION);
// Run a command to trigger a ClusterDescriptionChangedEvent
FindPublisher<Document> findPublisher = collection.find();
Flux.from(findPublisher).blockLast();
}
Let me get you the connection with id 21...

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.

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:

  1. Crea instancias de MXBean para cada proceso mongod o mongos con el que el driver mantiene un pool de conexiones

  2. Registra estas instancias de MXBean en el servidor MBean de la plataforma

Los MXBeans registrados en el servidor MBean de la plataforma tienen las siguientes propiedades:

Propiedad
Descripción

clusterId

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 MongoClient conectadas a la misma implementación de MongoDB.

host

El nombre de host de la máquina que ejecuta el proceso mongod o mongos.

port

El puerto en el que está escuchando el proceso mongod o mongos.

minSize

El tamaño mínimo del grupo de conexiones, incluidas las conexiones inactivas y en uso.

maxSize

El tamaño máximo del grupo de conexiones, incluidas las conexiones inactivas y en uso.

size

El tamaño actual del grupo de conexiones, incluidas las conexiones inactivas y en uso.

checkedOutCount

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:

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

JMXConnectionPoolListener connectionPoolListener = new JMXConnectionPoolListener();
try (MongoClient mongoClient = MongoClients.create(URI)) {
System.out.println("Navigate to JConsole to see your connection pools...");
// Pauses the code execution so you can navigate to JConsole and inspect your connection pools
Thread.sleep(Long.MAX_VALUE);
}
Navigate to JConsole to see your connection pools...

Una vez que haya iniciado su servidor, abra JConsole ejecutando el siguiente comando en su terminal:

jconsole

Una vez abierto JConsole, realice las siguientes acciones en la GUI:

  1. Seleccione el proceso Java que ejecuta el código de ejemplo anterior.

  2. Haga clic Insecure Connection en el cuadro de diálogo de advertencia.

  3. Haga clic en la pestaña MBeans.

  4. 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, realice las siguientes tareas:

  1. Salga de JConsole cerrando la ventana de JConsole.

  2. Detenga el programa Java que ejecuta 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 API para JMXConnectionPoolListener.

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 necesita incluir datos de eventos del controlador en un sistema de seguimiento distribuido distinto de Zipkin, debe escribir un detector de eventos de comando que administre los intervalos para el sistema de seguimiento distribuido que desee. Para ver una implementación de dicho detector, consulte la clase TraceMongoCommandListener en el código fuente de Spring Cloud Sleuth.

Para obtener más información sobre Spring Cloud Sleuth, consulte Primeros pasos en la documentación de Spring Cloud Sleuth.

Para ver una descripción detallada de un sistema de rastreo distribuido, consulte Dapper de Google Research.

Para obtener más información sobre las clases y métodos mencionados en este documento, consulte la siguiente documentación de API:

Volver

Registro

En esta página