Overview
En esta guía, puedes aprender cómo configurar y ajustar la supervisión en el driver Go de MongoDB. Se pueden supervisar eventos mediante el uso del driver Go para suscribirse a ellos en su aplicación.
La supervisión implica recopilar información sobre las actividades de un programa en ejecución, la cual se puede usar con una librería de gestión de rendimiento de aplicaciones (APM).
Un evento es cualquier acción que ocurre dentro del driver durante su operación. El controlador de Go incluye funcionalidad para escuchar un subconjunto de estos eventos.
La supervisión del driver de Go permite entender el uso de recurso y el rendimiento del driver, y puede ayudar a tomar decisiones informadas al diseñar y depurar la aplicación.
En esta guía aprenderás cómo 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 la sección sobre el controlador Go. Logging guía.
Monitorear eventos de comando
Un evento de comando es un evento relacionado con un comando de base de datos de MongoDB. Puede acceder a uno o más eventos de supervisión de comandos usando el driver para suscribirse a ellos en su aplicación.
Para obtener más información sobre los comandos de base de datos de MongoDB, consulta la guía Database Commands en el Manual del Servidor.
Suscribirse a eventos
Puedes acceder a los detalles sobre los eventos de comandos suscribiéndote a ellos en tu aplicación. El siguiente ejemplo demuestra cómo suscribirse a la CommandStartedEvent evento mediante la instanciación de un CommandMonitor y la conexión 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 la salida de muestra para cada tipo de evento de supervisión de comandos.
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": "..." }
CommandFailedEvent
*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 en la topología en tu aplicación y explorar la información proporcionada en estos eventos.
Suscribirse 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. |
| Creado cuando la topología se cierra. |
| Se crea cuando se inicia el latido del corazón. |
| Se crea cuando el latido cardíaco tiene éxito. |
| Se crea cuando falla la señal de vida. |
Documentos de eventos de ejemplo
Las siguientes secciones muestran la salida de ejemplo para cada tipo de evento SDAM.
ServerDescriptionChangedEvent
*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 autónoma |
| 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": "..." }
ServerClosedEvent
*event.ServerClosedEvent { "Address": "...", "TopologyID": "..." }
TopologyDescriptionChangedEvent
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 campo Kind, consulta la sección Valor de campo "Kind".
TopologyOpeningEvent
*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 campo Kind, consulta la sección Valor de campo "Kind".
ServerHeartbeatFailedEvent
*event.ServerHeartbeatFailedEvent { "DurationNanos": ..., "Failure": "<error message>" "ConnectionID": "...", "Awaited": true }
Supervisa los eventos del grupo de conexiones
Un pool de conexiones es un conjunto de conexiones TCP abiertas que tu driver mantiene con una instancia de MongoDB. Los grupos de conexiones ayudan a reducir 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.
Las siguientes secciones demuestran cómo registrar eventos del pool de conexiones en tu aplicación y explorar la información proporcionada en estos eventos.
Suscribirse a eventos
Puedes acceder a los detalles sobre los eventos del pool de conexiones suscribiéndote a ellos en tu aplicación. El siguiente ejemplo demuestra 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 pool de conexiones. |
| Se crea cuando un pool de conexiones está listo. |
| Se crea cuando se cierran todas las conexiones de la agrupación. |
| Se crea cuando se cierra un pool de conexiones, antes de la destrucción de la instancia del servidor. |
| Se crea cuando se establece una conexión, pero no necesariamente cuando se utiliza para una operación. |
| Creado después de que una conexión completa un apretón de manos y está listo para ser usado 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 ejecutarse. |
| 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 la salida de muestra para cada tipo de evento de supervisión del pool de conexiones.
ConnectionPoolCreated
*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 }
ConnectionPoolCleared
*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 }
ConnectionClosed
*event.PoolEvent { "type": "ConnectionClosed", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCheckOutStarted
*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 }
ConnectionCheckedOut
*event.PoolEvent { "type": "ConnectionCheckedOut", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCheckedIn
*event.PoolEvent { "type": "ConnectionCheckedIn", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
Información Adicional
Para obtener más información sobre la supervisión de una implementación de MongoDB, consulte el artículo Cómo supervisar MongoDB.
Para obtener más información sobre la conexión a MongoDB, consulta la guía Crear un MongoClient.
Para aprender más sobre cómo realizar operaciones de MongoDB, consulta 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, vea la siguiente documentación de la API:
event paquete
Eventos de comando
CommandMonitor tipo
método SetMonitor()
CommandStartedEvent tipo
Tipo de eventoCommandSucceededEvent
CommandFailedEvent tipo
Eventos de SDAM
ServerMonitor tipo
El método SetServerMonitor()
Eventos del grupo de conexiones
PoolMonitor tipo
PoolEvent tipo
MétodoSetPoolMonitor()