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 se puede configurar el registro de eventos en la aplicación para obtener más información sobre los eventos del driver. Para obtener más información, consulte Registro.
Suscribirse a eventos
Puedes acceder a detalles sobre los eventos SDAM suscribiéndote a ellos en tu aplicación. El siguiente ejemplo demuestra cómo suscribirse a la ServerClosed evento mediante la instanciación de un ServerMonitor y la conexión 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, consulte el Sección Valor del campo de tipo.
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