Overview
En esta guía, aprenderá a configurar la monitorización en el controlador Go de MongoDB. Puede monitorizar eventos usando el controlador Go para suscribirse a ellos en su aplicación.
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.
Un evento es cualquier acción que ocurre dentro del controlador durante su funcionamiento. El controlador Go incluye la función de escuchar un subconjunto de estos eventos.
Supervisar el controlador Go 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ás a realizar estas 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 la sección sobre el controlador Go. 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 para suscribirse a ellos en su aplicación.
Para obtener más información sobre los comandos de base de datos MongoDB, consulte la guía Comandos de base de datos en el Manual del servidor.
Suscríbete a Eventos
Puede acceder a detalles sobre los eventos de comando suscribiéndose a ellos en su aplicación. El siguiente ejemplo muestra cómo suscribirse a CommandStartedEvent evento instanciando un CommandMonitor y conectándose a una implementación:
var eventArray []*event.CommandStartedEvent cmdMonitor := &event.CommandMonitor{ Started: func(ctx context.Context, e *event.CommandStartedEvent) { eventArray = append(eventArray, e) }, } clientOpts := options.Client().ApplyURI(uri).SetMonitor(cmdMonitor) client, err := mongo.Connect(clientOpts)
Descripciones de eventos
Puede suscribirse a uno o más 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 un comando no tiene éxito. |
Documentos de eventos de ejemplo
Las siguientes secciones muestran una salida de muestra para cada tipo de evento de monitoreo de comando.
EventoComandoIniciado
*event.CommandStartedEvent { "Command": "...", "DatabaseName": "...", "CommandName": "...", "RequestID": ..., "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": "..." }
Evento de comando exitoso
*event.CommandSucceededEvent { "DurationNanos": 38717583, "Duration": 38717583, "CommandName": "insert", "RequestID": 13, "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": null, "Reply": "..." }
Evento de comando fallido
*event.CommandFailedEvent { "DurationNanos": 38717583, "Duration": 38717583, "CommandName": "insert", "RequestID": 13, "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": null, "Failure": "..." }
Supervisar eventos de descubrimiento y supervisión del servidor
El controlador Go 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.
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 Eventos
Puede acceder a detalles sobre los eventos de SDAM suscribiéndose a ellos en su aplicación. El siguiente ejemplo muestra cómo suscribirse al evento ServerClosed instanciando un ServerMonitor y conectándose a una implementación:
var eventArray []*event.ServerClosedEvent srvMonitor := &event.ServerMonitor{ ServerClosed: func(e *event.ServerClosedEvent) { eventArray = append(eventArray, e) }, } clientOpts := options.Client().ApplyURI(uri).SetServerMonitor(srvMonitor) client, err := mongo.Connect(clientOpts)
Descripciones de eventos
Puede suscribirse a los siguientes eventos SDAM especificando las propiedades de una instancia ServerMonitor:
Nombre del evento | Descripción |
|---|---|
| Se crea cuando cambia el estado de una instancia (por ejemplo, de secundaria a principal). |
| Se crea cuando se inicializa el servidor. |
| Se crea cuando se cierra el servidor. |
| Se crea cuando cambia la topología, como la elección de un nuevo servidor principal o la desconexión de un proxy |
| Se crea cuando se inicializa la topología. |
| Se crea cuando se cierra la topología. |
| Se crea cuando se inicia el latido del corazón. |
| Se crea cuando el latido tiene éxito. |
| Se crea cuando falla el latido del corazón. |
Documentos de eventos de ejemplo
Las siguientes secciones muestran la salida de ejemplo para cada tipo de evento SDAM.
Evento de cambio de descripción del servidor
*event.ServerDescriptionChangedEvent { "Address": "...", "TopologyID": "...", "PreviousDescription": { "Addr": "...", "Arbiters": null, "AverageRTT": 0, "AverageRTTSet": false, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": 0, "HelloOK": false, "Hosts": null, "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": 0, "MaxDocumentSize": 0, "MaxMessageSize": 0, "Members": null, "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 0, "SetName": "...", "SetVersion": 0, "Tags": null, "TopologyVersion": null, "Kind": 0, "WireVersion": null }, "NewDescription": { "Addr": "...", "Arbiters": null, "AverageRTT": ..., "AverageRTTSet": true, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": ..., "HelloOK": true, "Hosts": [...], "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": ..., "MaxDocumentSize": ..., "MaxMessageSize": ..., "Members": [...], "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 30, "SetName": "...", "SetVersion": 9, "Tags": [...], "TopologyVersion": {...}, "Kind": 10, "WireVersion": {...} } }
Kind Valor del campo
El campo Kind en un documento de evento representa el tipo de un solo servidor en una topología y puede tener los siguientes valores:
Valor | Descripción |
|---|---|
| Instancia desconocida |
| Instancia independiente |
| Miembro del conjunto de réplicas |
| Instancia principal |
| Instancia secundaria |
| Instancia de árbitro |
| set de réplicas ghost (un nodo que no se puede query) |
|
|
| Instancia de balanceador de carga |
ServerOpeningEvent
*event.ServerOpeningEvent { "Address": "...", "TopologyID": "..." }
Evento de servidor cerrado
*event.ServerClosedEvent { "Address": "...", "TopologyID": "..." }
Descripción de topologíaCambiadoEvento
Importante
Debido a que el controlador llama a TopologyDescriptionChangedEvent cuando la topología de implementación está bloqueada, la devolución de llamada (argumento de función) para este evento no debe intentar ninguna operación que requiera la selección del servidor en el mismo cliente.
*event.TopologyDescriptionChangedEvent { "TopologyID": "...", "PreviousDescription": { "Servers": [ { "Addr": "...", "Arbiters": null, "AverageRTT": 0, "AverageRTTSet": false, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": 0, "HelloOK": false, "Hosts": null, "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": 0, "MaxDocumentSize": 0, "MaxMessageSize": 0, "Members": null, "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 0, "SetName": "...", "SetVersion": 0, "Tags": null, "TopologyVersion": null, "Kind": 0, "WireVersion": null }, ... ], "SetName": "...", "Kind": 10, "SessionTimeoutMinutes": 30, "CompatibilityErr": null }, "NewDescription": { "Servers": [...], "SetName": "...", "Kind": 10, "SessionTimeoutMinutes": 30, "CompatibilityErr": null } }
Para interpretar el valor del Kind campo, consulte la sección Valor del campo tipo.
Evento de apertura de topología
*event.TopologyOpeningEvent { "TopologyID": "..." }
Evento cerrado de topología
*event.TopologyClosedEvent { "TopologyID": "..." }
ServerHeartbeatStartedEvent
*event.ServerHeartbeatStartedEvent { "ConnectionID": "...", "Awaited": true }
Evento de latido del servidor exitoso
*event.ServerHeartbeatSucceededEvent { "DurationNanos": ..., "Reply": { "Addr": "...", "Arbiters": null, "AverageRTT": 0, "AverageRTTSet": false, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": 0, "HelloOK": true, "Hosts": [...], "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": ..., "MaxDocumentSize": ..., "MaxMessageSize": ..., "Members": [...], "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 30, "SetName": "...", "SetVersion": 9, "Tags": [...], "TopologyVersion": {...}, "Kind": 6, "WireVersion": {...} }, "ConnectionID": "...", "Awaited": true }
Para interpretar el valor del Kind campo, consulte la sección Valor del campo tipo.
Evento de fallo de latido del servidor
*event.ServerHeartbeatFailedEvent { "DurationNanos": ..., "Failure": "<error message>" "ConnectionID": "...", "Awaited": true }
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 Eventos
Puede acceder a detalles sobre los eventos del grupo de conexiones suscribiéndose a ellos en su aplicación. El siguiente ejemplo muestra cómo suscribirse al evento PoolEvent instanciando un PoolMonitor y conectándose a una implementación:
var eventArray []*event.PoolEvent cxnMonitor := &event.PoolMonitor{ Started: func(e *event.PoolEvent) { eventArray = append(eventArray, e) }, } clientOpts := options.Client().ApplyURI(uri).SetPoolMonitor(cxnMonitor) client, err := mongo.Connect(clientOpts)
Descripciones de eventos
La siguiente tabla describe los tipos de eventos de grupo que el controlador genera:
Tipo de evento del pool | Descripción |
|---|---|
| Se crea cuando se crea un grupo de conexiones. |
| Se crea cuando un grupo de conexiones está listo. |
| Se crea cuando se cierran todas las conexiones en el pool. |
| Se crea cuando se cierra un grupo de conexiones, antes de la destrucción de la instancia del servidor. |
| Se crea cuando se crea una conexión, pero no necesariamente cuando se utiliza para una operación. |
| Se crea después de que una conexión completa un protocolo de enlace y está lista para usarse en operaciones. |
| Se crea cuando se cierra una conexión. |
| Se crea cuando una operación intenta adquirir una conexión para su ejecución. |
| Se crea cuando una operación no puede adquirir una conexión para su ejecución. |
| Se crea cuando una operación obtiene con éxito 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. |
Documentos de eventos de ejemplo
Las siguientes secciones muestran una salida de muestra para cada tipo de evento de monitoreo de grupo de conexiones.
Grupo de conexiones creado
*event.PoolEvent { "type": "ConnectionPoolCreated", "address": "...", "connectionId": 0, "options": { "maxPoolSize": 100, "minPoolSize": 0, "maxIdleTimeMS": 0 }, "reason": "", "serviceId": null, "error": null }
ConnectionPoolReady
*event.PoolEvent { "type": "ConnectionPoolReady", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
Grupo de conexiones despejado
*event.PoolEvent { "type": "ConnectionPoolCleared", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionPoolClosed
*event.PoolEvent { "type": "ConnectionPoolClosed", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
Conexión creada
*event.PoolEvent { "type": "ConnectionCreated", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
Conexión lista
*event.PoolEvent { "type": "ConnectionReady", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
Conexión cerrada
*event.PoolEvent { "type": "ConnectionClosed", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
Conexión verificada iniciada
*event.PoolEvent { "type": "ConnectionCheckOutStarted", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
Error en la verificación de conexión
*event.PoolEvent { "type": "ConnectionCheckOutFailed", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
Conexión verificada
*event.PoolEvent { "type": "ConnectionCheckedOut", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
Conexión registrada
*event.PoolEvent { "type": "ConnectionCheckedIn", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
Información Adicional
Para obtener más información sobre cómo monitorear una implementación de MongoDB, consulte el artículo Cómo monitorear MongoDB.
Para obtener más información sobre cómo conectarse a MongoDB, consulte la guía Crear un MongoClient.
Para obtener más información sobre cómo realizar operaciones de MongoDB, consulte la sección Operaciones CRUD.
Documentación de la API
Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API:
Eventos de comando
Tipo deCommandMonitor
MétodoSetMonitor()
Tipo de eventoCommandStartedEvent
Tipo de eventoCommandSucceededEvent
Tipo de eventoCommandFailedEvent
Eventos SDAM
Tipo deServerMonitor
El método SetServerMonitor()
Eventos del grupo de conexiones
Tipo dePoolMonitor
MétodoSetPoolMonitor()