Overview
Esta guía te muestra cómo utilizar el driver de Go para supervisar eventos de topología en una instancia de MongoDB, un set de réplicas o un clúster. El driver crea eventos de topología, también conocidos como eventos de Descubrimiento y Supervisión de Servidores (SDAM), cuando hay cambios en el estado de la instancia o el clúster al que está conectado.
Podrías utilizar información sobre eventos de topología en tu aplicación para comprender cambios en el clúster, evaluar el estado del clúster o realizar la planificación de la capacidad.
Tip
Registro
También puedes configurar el registro en tu aplicación para aprender más sobre los eventos del controlador. Para obtener más información, consulta Registro.
Suscribirse a eventos
Puedes acceder a detalles sobre los eventos SDAM suscribiéndote a ellos en tu 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(context.TODO(), clientOpts)
Descripciones de eventos
Puedes suscribirte 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 la topología cambia, como por ejemplo una elección de uno nuevo 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 |
| Set 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 driver llama TopologyDescriptionChangedEvent cuando la topología de implementación está bloqueada, la función de retorno (argumento de la función) para este evento no debe intentar ninguna operación que requiera la selección de servidores 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": "..." }
EventoDeTopologíaCerrado
*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 }
Documentación de la API
ServerMonitor tipo
El método SetServerMonitor()
event paquete