Docs Menu
Docs Home
/ /

Monitorear eventos de aplicaciones

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:

  • Monitorear eventos de comando

  • Supervisar eventos de detección y supervisión del servidor (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. Guía de registro.

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.

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)

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 una salida de muestra para cada tipo de evento de monitoreo de comando.

*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 de topología en su aplicación y exploran 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

Se crea cuando se cierra la topología.

ServerHeartbeatStartedEvent

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

ServerHeartbeatSucceededEvent

Se crea cuando el latido tiene éxito.

ServerHeartbeatFailedEvent

Se crea cuando falla el latido del corazón.

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 independiente

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 Kind campo, consulte la sección Valor del campo tipo.

*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 Kind campo, consulte la sección Valor del campo tipo.

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

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.

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)

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 grupo de conexiones.

ConnectionPoolReady

Se crea cuando un grupo de conexiones está listo.

ConnectionPoolCleared

Se crea cuando se cierran todas las conexiones en el pool.

ConnectionPoolClosed

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

ConnectionCreated

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

ConnectionReady

Se crea después de que una conexión completa un protocolo de enlace y está lista para usarse 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 su ejecución.

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 una salida de muestra para cada tipo de evento de monitoreo de grupo 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 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.

Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API:

  • paquete de eventos

Volver

Búsqueda vectorial de MongoDB