Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Supervisar eventos de aplicaciones

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:

  • Monitorear eventos de comando

  • Supervisar eventos de descubrimiento y supervisión de servidores (SDAM)

  • Supervisa los eventos del grupo de conexiones

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.

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.

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)

Puede suscribirse a uno o más de los siguientes eventos de monitoreo de comandos:

Nombre del Evento
Descripción

CommandStartedEvent

Se crea cuando se inicia un comando.

CommandSucceededEvent

Se crea cuando un comando tiene éxito.

CommandFailedEvent

Se crea cuando un comando no tiene éxito.

Las siguientes secciones muestran la salida de muestra para cada tipo de evento de supervisión de comandos.

*event.CommandStartedEvent
{
"Command": "...",
"DatabaseName": "...",
"CommandName": "...",
"RequestID": ...,
"ConnectionID": "...",
"ServerConnectionID": ...,
"ServiceID": "..."
}
*event.CommandSucceededEvent
{
"DurationNanos": 38717583,
"Duration": 38717583,
"CommandName": "insert",
"RequestID": 13,
"ConnectionID": "...",
"ServerConnectionID": ...,
"ServiceID": null,
"Reply": "..."
}
*event.CommandFailedEvent
{
"DurationNanos": 38717583,
"Duration": 38717583,
"CommandName": "insert",
"RequestID": 13,
"ConnectionID": "...",
"ServerConnectionID": ...,
"ServiceID": null,
"Failure": "..."
}

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.

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)

Puede suscribirse a los siguientes eventos SDAM especificando las propiedades de una instancia ServerMonitor:

Nombre del Evento
Descripción

ServerDescriptionChangedEvent

Se crea cuando cambia el estado de una instancia (por ejemplo, de secundaria a principal).

ServerOpeningEvent

Se crea cuando se inicializa el servidor.

ServerClosedEvent

Se crea cuando se cierra el servidor.

TopologyDescriptionChangedEvent

Se crea cuando cambia la topología, como la elección de un nuevo servidor principal o la desconexión de un proxy mongos.

TopologyOpeningEvent

Se crea cuando se inicializa la topología.

TopologyClosedEvent

Creado cuando la topología se cierra.

ServerHeartbeatStartedEvent

Se crea cuando se inicia el latido del corazón.

ServerHeartbeatSucceededEvent

Se crea cuando el latido cardíaco tiene éxito.

ServerHeartbeatFailedEvent

Se crea cuando falla la señal de vida.

Las siguientes secciones muestran la salida de ejemplo para cada tipo de evento SDAM.

*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": {...}
}
}

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

0

Instancia desconocida

1

Instancia autónoma

2

Miembro del conjunto de réplicas

6

Instancia principal

10

Instancia secundaria

18

Instancia de árbitro

34

set de réplicas ghost (un nodo que no se puede query)

256

mongos instancia de proxy

512

Instancia de balanceador de carga

*event.ServerOpeningEvent
{
"Address": "...",
"TopologyID": "..."
}
*event.ServerClosedEvent
{
"Address": "...",
"TopologyID": "..."
}

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".

*event.TopologyOpeningEvent
{
"TopologyID": "..."
}
*event.TopologyClosedEvent
{
"TopologyID": "..."
}
*event.ServerHeartbeatStartedEvent
{
"ConnectionID": "...",
"Awaited": true
}
*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".

*event.ServerHeartbeatFailedEvent
{
"DurationNanos": ...,
"Failure": "<error message>"
"ConnectionID": "...",
"Awaited": true
}

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.

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)

La siguiente tabla describe los tipos de eventos de grupo que el controlador genera:

Tipo de evento del pool
Descripción

ConnectionPoolCreated

Se crea cuando se crea un pool de conexiones.

ConnectionPoolReady

Se crea cuando un pool de conexiones está listo.

ConnectionPoolCleared

Se crea cuando se cierran todas las conexiones de la agrupación.

ConnectionPoolClosed

Se crea cuando se cierra un pool de conexiones, antes de la destrucción de la instancia del servidor.

ConnectionCreated

Se crea cuando se establece una conexión, pero no necesariamente cuando se utiliza para una operación.

ConnectionReady

Creado después de que una conexión completa un apretón de manos y está listo para ser usado en operaciones.

ConnectionClosed

Se crea cuando se cierra una conexión.

ConnectionCheckOutStarted

Se crea cuando una operación intenta adquirir una conexión para su ejecución.

ConnectionCheckOutFailed

Se crea cuando una operación no puede adquirir una conexión para ejecutarse.

ConnectionCheckedOut

Se crea cuando una operación obtiene con éxito una conexión para su ejecución.

ConnectionCheckedIn

Se crea cuando una conexión se revisa de nuevo en el pool después de ejecutar una operación.

Las siguientes secciones muestran la salida de muestra para cada tipo de evento de supervisión del pool de conexiones.

*event.PoolEvent
{
"type": "ConnectionPoolCreated",
"address": "...",
"connectionId": 0,
"options": {
"maxPoolSize": 100,
"minPoolSize": 0,
"maxIdleTimeMS": 0
},
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionPoolReady",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionPoolCleared",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionPoolClosed",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCreated",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionReady",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionClosed",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckOutStarted",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckOutFailed",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckedOut",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckedIn",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}

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.

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:

Volver

Búsqueda vectorial de MongoDB