Overview
En esta guía, puede aprender cómo configurar y configurar la supervisión en el controlador Ruby de MongoDB.
La monitorización implica la recopilación de información sobre las actividades de un programa en ejecución, que puede utilizar con una biblioteca de gestión del rendimiento de la aplicación.
Monitorear el controlador Ruby le permite comprender el uso y el rendimiento de sus recursos. Esta información le ayudará a tomar decisiones informadas al diseñar y depurar su aplicación.
En esta guía podrás aprender a realizar las siguientes tareas:
Esta guía muestra cómo usar la información sobre la actividad del controlador en el código. Para aprender a registrar eventos en el controlador, consulte el controlador Ruby. Guía de registro.
Monitorear eventos de comando
Un evento de comando es un evento relacionado con un comando de base de datos MongoDB. Puede acceder a uno o más eventos de monitorización de comandos mediante el controlador suscribiéndose a ellos en su aplicación.
Para obtener más información sobre los comandos de base de datos MongoDB, consulte la guía de comandos de base de datos en el manual del servidor MongoDB.
Suscríbete a los eventos de Command
Puede acceder a detalles sobre los eventos de comando suscribiéndose a ellos en su aplicación. Puede suscribirse a eventos a nivel global, que supervisa a todos los clientes de un clúster, o a nivel de cliente. Este ejemplo muestra las siguientes acciones:
Instancía una
CommandLogSubscriberUtiliza el método
Mongo::Monitoring::Global.subscribepara suscribirse a eventos de comando a nivel globalUtiliza el método
Mongo::Client.subscribepara suscribirse a eventos de comando en el nivel de cliente
require 'mongo' # Creates a subscriber for command monitoring subscriber = Mongo::Monitoring::CommandLogSubscriber.new # Globally subscribes to command monitoring events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::COMMAND, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to command monitoring events at the client level client.subscribe( Mongo::Monitoring::COMMAND, subscriber)
Descripciones de eventos
Puede suscribirse a cualquiera de los siguientes eventos de monitoreo de comandos:
Nombre del evento | Descripción |
|---|---|
Se crea cuando se inicia un comando. | |
Se crea cuando un comando tiene éxito. | |
Se crea cuando falla un comando. |
Supervisar eventos de detección y supervisión del servidor (SDAM)
El controlador Ruby crea eventos de topología, también conocidos como eventos SDAM, cuando se produce un cambio en el estado de la instancia o el clúster al que se conectó. Por ejemplo, el controlador crea un evento al establecer una nueva conexión o si el clúster elige un nuevo nodo principal.
Para obtener más información sobre los eventos de topología, consulte la guía de replicación en el Manual del servidor.
Las siguientes secciones demuestran cómo registrar cambios de topología en su aplicación y exploran la información proporcionada en estos eventos.
Suscríbete a los eventos de SDAM
Puede usar el método subscribe del controlador Ruby para suscribirse a eventos. Pase un tema de monitorización, que define el tipo de evento de monitorización, y un objeto suscriptor como argumentos al método subscribe. Puede suscribirse a eventos a nivel global, que monitoriza todos los clientes de un clúster, o a nivel de cliente.
Este ejemplo demuestra las siguientes acciones:
Crea una instancia de un suscriptor
ServerOpeningLogSubscriberUtiliza el método
Mongo::Monitoring::Global.subscribepara suscribirse aServerOpeningeventos a nivel globalUtiliza el método
Mongo::Client.subscribepara suscribirse aServerOpeningeventos en el nivel de cliente
require 'mongo' subscriber = Mongo::Monitoring::ServerOpeningLogSubscriber.new # Globally subscribes to ServerOpening events by using the SERVER_OPENING monitoring topic Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to ServerOpening events at the client level by using the SERVER_OPENING monitoring topic client.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)
La siguiente tabla proporciona los suscriptores disponibles y su tema de monitoreo:
Nombre del suscriptor | Supervisión de tema | Descripción |
|---|---|---|
| Se suscribe a | |
| Se suscribe a | |
| Se suscribe a | |
| Se suscribe a | |
| Se suscribe a | |
| Se suscribe a |
Puede encontrar una tabla de descripciones de eventos SDAM en la sección Descripciones de eventos de esta página.
Supervisión SDAM personalizada
Puede crear un suscriptor SDAM personalizado para acceder a detalles sobre eventos de servidor y topología. Cree una clase independiente para cada tipo de evento, ya que los datos disponibles varían.
Para todos los eventos, el suscriptor llama al método succeeded y pasa el evento como argumento. Un suscriptor de registro SDAM simple podría tener el siguiente código:
class SDAMLogSubscriber include Mongo::Loggable def succeeded(event) log_debug(format_event(event)) end private def logger Mongo::Logger.logger end def format_message(message) format("SDAM | %s", message) end end class TopologyOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' initializing." end end class ServerOpeningLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} initializing." end end class ServerDescriptionChangedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server description for #{event.address} changed from " + "'#{event.previous_description.server_type}' to '#{event.new_description.server_type}'." end end class TopologyChangedLogSubscriber < SDAMLogSubscriber private def format_event(event) if event.previous_topology != event.new_topology "Topology type '#{event.previous_topology.display_name}' changed to " + "type '#{event.new_topology.display_name}'." else "There was a change in the members of the '#{event.new_topology.display_name}' " + "topology." end end end class ServerClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Server #{event.address} connection closed." end end class TopologyClosedLogSubscriber < SDAMLogSubscriber private def format_event(event) "Topology type '#{event.topology.display_name}' closed." end end
Para suscribirse a eventos, cree el suscriptor adecuado y suscríbase al tema de monitorización correcto. El siguiente código muestra cómo suscribirse globalmente a eventos de SDAM:
topology_opening_subscriber = TopologyOpeningLogSubscriber.new server_opening_subscriber = ServerOpeningLogSubscriber.new server_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.new topology_changed_subscriber = TopologyChangedLogSubscriber.new server_closed_subscriber = ServerClosedLogSubscriber.new topology_closed_subscriber = TopologyClosedLogSubscriber.new Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, topology_opening_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_OPENING, server_opening_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, server_description_changed_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, topology_changed_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_CLOSED, server_closed_subscriber) Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::TOPOLOGY_CLOSED, topology_closed_subscriber)
El siguiente código muestra cómo suscribirse a eventos SDAM para un solo cliente utilizando la opción de cliente sdam-proc:
topology_opening_subscriber = TopologyOpeningLogSubscriber.new server_opening_subscriber = ServerOpeningLogSubscriber.new server_description_changed_subscriber = ServerDescriptionChangedLogSubscriber.new topology_changed_subscriber = TopologyChangedLogSubscriber.new server_closed_subscriber = ServerClosedLogSubscriber.new topology_closed_subscriber = TopologyClosedLogSubscriber.new sdam_proc = Proc.new do |client| client.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, topology_opening_subscriber) client.subscribe(Mongo::Monitoring::SERVER_OPENING, server_opening_subscriber) client.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, server_description_changed_subscriber) client.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, topology_changed_subscriber) client.subscribe(Mongo::Monitoring::SERVER_CLOSED, server_closed_subscriber) client.subscribe(Mongo::Monitoring::TOPOLOGY_CLOSED, topology_closed_subscriber) end client = Mongo::Client.new(['127.0.0.1:27017'], database: 'test', sdam_proc: sdam_proc)
Nota
La opción de cliente :sdam_proc solo se aplica al cliente especificado. Al modificar ciertas opciones de cliente mediante la llamada Client#with, el controlador puede crear un nuevo clúster con un conjunto predeterminado de suscriptores de eventos. En tal caso, no se llama a la opción :sdam_proc proporcionada y la aplicación podría perder eventos.
Cuando ejecuta la aplicación, su suscriptor registra el evento SDAM y genera mensajes como el siguiente:
D, [2018-10-09T13:58:03.489461 #22079] DEBUG -- : SDAM | Topology type 'Unknown' initializing. D, [2018-10-09T13:58:03.489699 #22079] DEBUG -- : SDAM | Server 127.0.0.1:27100 initializing. D, [2018-10-09T13:58:03.491384 #22079] DEBUG -- : SDAM | Server description for 127.0.0.1:27100 changed from 'unknown' to 'unknown'. D, [2018-10-09T13:58:03.491642 #22079] DEBUG -- : SDAM | Server localhost:27100 initializing. D, [2018-10-09T13:58:03.493199 #22079] DEBUG -- : SDAM | Server description for localhost:27100 changed from 'unknown' to 'primary'. D, [2018-10-09T13:58:03.493473 #22079] DEBUG -- : SDAM | Server localhost:27101 initializing. D, [2018-10-09T13:58:03.494874 #22079] DEBUG -- : SDAM | Server description for localhost:27101 changed from 'unknown' to 'secondary'. D, [2018-10-09T13:58:03.495139 #22079] DEBUG -- : SDAM | Server localhost:27102 initializing. D, [2018-10-09T13:58:03.496504 #22079] DEBUG -- : SDAM | Server description for localhost:27102 changed from 'unknown' to 'secondary'. D, [2018-10-09T13:58:03.496777 #22079] DEBUG -- : SDAM | Topology type 'Unknown' changed to type 'ReplicaSetNoPrimary'. D, [2018-10-09T13:58:03.497306 #22079] DEBUG -- : SDAM | Server 127.0.0.1:27100 connection closed. D, [2018-10-09T13:58:03.497606 #22079] DEBUG -- : SDAM | Topology type 'ReplicaSetNoPrimary' changed to type 'ReplicaSetWithPrimary'. # client.close D, [2018-10-09T13:58:05.342057 #22079] DEBUG -- : SDAM | Server localhost:27100 connection closed. D, [2018-10-09T13:58:05.342299 #22079] DEBUG -- : SDAM | Server localhost:27101 connection closed. D, [2018-10-09T13:58:05.342565 #22079] DEBUG -- : SDAM | Server localhost:27102 connection closed. D, [2018-10-09T13:58:05.342693 #22079] DEBUG -- : SDAM | Topology type 'ReplicaSetWithPrimary' closed.
Latidos del servidor
También puedes crear un suscriptor personalizado para supervisar los latidos del servidor, que se producen cuando el supervisor del servidor envía un comando hello al servidor.
Los suscriptores de latido de servidor personalizados se diferencian de otros suscriptores de SDAM, ya que deben implementar los siguientes tres métodos:
started:Se invoca cuando el oyente recibe el latido.succeeded:Respuesta para un resultado exitoso del latido cardíacofailed:Respuesta ante un resultado de latido cardíaco fallido
El siguiente ejemplo muestra un suscriptor de evento de latido:
class HeartbeatLogSubscriber include Mongo::Loggable def started(event) log_debug("#{event.address} | STARTED") end def succeeded(event) log_debug("#{event.address} | SUCCEEDED | #{event.duration}s") end def failed(event) log_debug("#{event.address} | FAILED | #{event.error.class}: #{event.error.message} | #{event.duration}s") end private def logger Mongo::Logger.logger end def format_message(message) format("HEARTBEAT | %s", message) end end
Puede suscribirse a eventos de latido a nivel mundial o para un cliente específico, como se muestra en el siguiente ejemplo:
subscriber = HeartbeatLogSubscriber.new # Globally subscribes to Server Opening events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber) # Subscribes to Server Opening events at the client level client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'test' ) client.subscribe( Mongo::Monitoring::SERVER_HEARTBEAT, subscriber )
Cuando ejecuta la aplicación, su suscriptor registra el evento de latido y genera mensajes como los siguientes:
D, [2018-09-23T13:44:10.707018 #1739] DEBUG -- : HEARTBEAT | 127.0.0.1:27027 | STARTED D, [2018-09-23T13:44:10.707778 #1739] DEBUG -- : HEARTBEAT | 127.0.0.1:27027 | SUCCEEDED | 0.000772381s
Descripciones de eventos
La siguiente tabla proporciona el nombre y la descripción de cada evento SDAM:
Tipo de evento | Descripción |
|---|---|
Evento creado cuando se cierra la instancia del servidor. | |
Evento creado cuando cambia la descripción de un servidor. | |
Evento creado cuando falla un latido del servidor. | |
Evento creado cuando un oyente recibe un latido del servidor. | |
Evento creado cuando un latido del servidor tiene éxito. | |
Evento creado cuando el controlador se conecta al servidor. | |
Evento creado cuando cambia la topología. | |
Evento creado cuando se cierran todas las conexiones de instancia en la topología. | |
Evento creado antes de que el controlador intente conectarse a una instancia. |
Supervisa los eventos del grupo de conexiones
Un grupo de conexiones es un conjunto de conexiones TCP abiertas que su controlador mantiene con una instancia de MongoDB. Los grupos de conexiones ayudan a reducir el número de protocolos de enlace de red que su aplicación debe realizar y pueden acelerar su ejecución.
Las siguientes secciones demuestran cómo registrar eventos del grupo de conexiones en su aplicación y exploran la información proporcionada en estos eventos.
Suscríbete a los eventos del Connection Pool
Puede acceder a los detalles de todos los eventos del grupo de conexiones suscribiéndose a ellos en su aplicación. Puede suscribirse a eventos a nivel global, que supervisa a todos los clientes de un clúster, o a nivel de cliente:
Este ejemplo demuestra las siguientes acciones:
Crea una instancia de un suscriptor
CmapLogSubscriberUtiliza el método
Mongo::Monitoring::Global.subscribepara suscribirse a todos los eventos del grupo de conexiones a nivel globalUtiliza el método
Mongo::Client.subscribepara suscribirse a todos los eventos del grupo de conexiones en el nivel del cliente
require 'mongo' # Creates a subscriber for connection pool monitoring subscriber = Mongo::Monitoring::CmapLogSubscriber.new # Globally subscribes to connection pool monitoring events Mongo::Monitoring::Global.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber) # Replace with your connection string and connect to your client uri = '<connection string>' client = Mongo::Client.new(uri) # Subscribes to connection pool monitoring events at the client level client.subscribe(Mongo::Monitoring::CONNECTION_POOL, subscriber)
Descripciones de eventos
Puede suscribirse a cualquiera de los siguientes eventos de monitoreo de pool de conexiones:
Nombre del evento | Descripción |
|---|---|
Se crea cuando una operación no logra adquirir una conexión para su ejecución. | |
Se crea cuando una operación intenta adquirir una conexión para su ejecución. | |
Se crea cuando una conexión se revisa de nuevo en el pool después de ejecutar una operación. | |
Se crea cuando una operación obtiene con éxito una conexión para su ejecución. | |
Se crea cuando se cierra una conexión. | |
Se crea cuando se crea una conexión, pero no necesariamente cuando se utiliza para una operación. | |
Creado después de que una conexión haya completado exitosamente un apretón de manos y esté lista para usarse en operaciones. | |
Se crea cuando se cierran todas las conexiones y se borra el grupo de conexiones. | |
Se crea cuando se cierra un grupo de conexiones antes de la destrucción de la instancia del servidor. | |
Se crea cuando se crea un grupo de conexiones. | |
Se crea cuando un grupo de conexiones está listo. |
Documentación de la API
Para obtener más información sobre cualquiera de las clases o métodos tratados en esta guía, consulta la siguiente documentación de la API: