Overview
En esta guía, puedes aprender cómo configurar y ajustar la supervisión en el controlador de 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.
La supervisión del driver Java de MongoDB te permite comprender el uso de recursos y el rendimiento del driver, y puede ayudarte a tomar decisiones informadas al diseñar y depurar tu aplicación.
En esta guía aprenderá a realizar las siguientes tareas:
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 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 listener (escucha) representa una respuesta a un determinado evento. Cada método recibe un argumento: un objeto que representa el evento al que responde el método.
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
Pool de conexiones eventos
Las siguientes secciones muestran cómo supervisar cada categoría de eventos.
Para obtener una lista completa de los eventos que puedes supervisar, consulta el paquete de eventos del driver Java de MongoDB.
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 obtener más información sobre los comandos de base de datos de MongoDB, consulta Comandos de Base de Datos en el manual de MongoDB Server.
Nota
Comandos internos
El driver no publica eventos para los comandos que llama internamente. Esto incluye los comandos de base de datos que el driver utiliza para supervisar su clúster y los comandos relacionados con el establecimiento de conexiones (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
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:
Cree una clase con funcionalidad de contador que implemente la interfaz
CommandListener.Agrega una instancia de la nueva clase que implementa
CommandListenera un objetoMongoClientSettings.Configura una instancia de
MongoClientcon el objetoMongoClientSettings.
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>(); 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); } 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}
Eventos de Descubrimiento y Supervisión de Servidores
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 driver define nueve eventos SDAM. El controlador divide estos nueve eventos entre tres interfaces diferentes de escucha, cada una de las cuales escucha tres de los nueve eventos. Aquí están las tres Interfaces y los eventos a los que escuchan:
ClusterListener: eventos relacionados con latopologíaServerListenereventos relacionados conmongodomongosprocesosServerMonitorListener: eventos relacionados con la señal "latido"
Para supervisar un tipo de evento SDAM, guarda una clase que implemente una de las tres interfaces anteriores y registra una instancia de esa clase con tu instancia de 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 en 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.
Ejemplo
El siguiente ejemplo muestra cómo crear una clase de listener que imprime un mensaje para informarle si el driver puede guardar 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; 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
Eventos del grupo 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 su driver mantiene con una implementación de MongoDB. Los grupos de conexiones ayudan a reducir la cantidad de handshakes de red que tu aplicación necesita realizar con una implementación de MongoDB y pueden ayudar a que tu aplicación funcione más rápido.
Para supervisar los eventos del pool de conexiones, escribe una clase que implemente la interfaz ConnectionPoolListener y registra una instancia de esa clase con tu instancia MongoClient.
Ejemplo
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 { public void connectionCheckedOut(final ConnectionCheckedOutEvent event) { System.out.printf("Fetching the connection with id %s...%n", event.getConnectionId().getLocalValue()); } 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...
Monitorear 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 JMX de Oracle.
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 conexionesRegistra 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 |
|---|---|
| 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 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 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, consulte los siguientes recursos de Oracle:
Ejemplo de JMX y JConsole
El siguiente ejemplo muestra cómo puedes supervisar los pools de conexiones del driver utilizando JMX y JConsole. JConsole es una herramienta de supervisión GUI compatible con JMX que se incluye con 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:
Seleccione el proceso Java que ejecuta el código de ejemplo anterior.
Haga clic Insecure Connection en el cuadro de diálogo de advertencia.
Haz 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, realice las siguientes tareas:
Salga de JConsole cerrando la ventana de JConsole.
Detén el programa Java que ejecuta el anterior snippet.
Para obtener más información sobre JMX y JConsole, consulta los siguientes recursos de Oracle:
Para obtener más información acerca de la clase JMXConnectionPoolListener, consulta 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 driver en una aplicación Spring nube, use Spring Cloud Sleuth para incluir datos de eventos de MongoDB en el sistema distribuido de seguimiento Zipkin.
Si no utiliza Spring Cloud o debe incluir los datos de eventos del controlador en un sistema de rastreo distribuido diferente a Zipkin, debe escribir un Listener de eventos de comando que gestione los spans para su sistema de rastreo distribuido preferido. Para ver una implementación de tal oyente, consulte la clase TraceMongoCommandListener en el código fuente de Spring Cloud Sleuth.
Para obtener más información sobre Spring Cloud Sleuth, consulta comenzar en la documentación de Spring Cloud Sleuth.
Para ver una descripción detallada de un sistema de rastreo distribuido, consulta Dapper de Google Research.
Documentación de la API
Para obtener más información sobre las clases y métodos mencionados en este documento, consulta la siguiente documentación de la API: