Visão geral
Neste guia, você pode aprender como configurar e configurar o monitoramento no Driver MongoDB Go. Você pode monitorar eventos usando o driver Go para assiná-los em seu aplicação.
O monitoramento envolve a coleta de informações sobre as atividades de um programa em execução, que você pode usar com uma biblioteca de gerenciamento de desempenho de aplicação .
Um evento é qualquer ação que ocorra dentro do driver durante sua operação. O driver Go inclui funcionalidade para ouvir um subconjunto desses eventos.
Monitorar o driver Go permite que você entenda o uso e o desempenho dos recursos do driver e pode ajudá-lo a tomar decisões informadas ao projetar e depurar seu aplicação.
Neste guia você aprenderá como executar estas tarefas:
Este guia mostra como usar informações sobre a atividade do driver no código. Para saber como registrar eventos no driver, consulte o guia de registro do driver Go.
Monitorar eventos de comando
Um evento de comando é um evento relacionado a um comando de banco de dados MongoDB . Você pode acessar um ou mais eventos de monitoramento de comandos usando o driver para assiná-los em seu aplicação.
Para saber mais sobre os comandos do banco de dados MongoDB, consulte o guia Comandos do banco de dados no Manual do servidor.
Inscrever-se para receber eventos
Você pode acessar detalhes sobre eventos de comando assinando-os em seu aplicativo. O exemplo seguinte demonstra como assinar o evento CommandStartedEvent
instanciando um CommandMonitor
e conectando-se a um sistema:
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)
Descrições de evento
Você pode assinar um ou mais dos seguintes eventos de monitoramento de comando:
Nome do evento | Descrição |
---|---|
| Criado quando um comando é iniciado. |
| Criado quando um comando é bem-sucedido. |
| Criado quando um comando não é bem-sucedido. |
Documentos de exemplos de eventos
As seções a seguir mostram amostras de saída para cada tipo de evento de monitoramento de comando.
CommandStartedEvent
*event.CommandStartedEvent { "Command": "...", "DatabaseName": "...", "CommandName": "...", "RequestID": ..., "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": "..." }
CommandSucceededEvent
*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": "..." }
Monitore a descoberta do servidor e os eventos de monitoramento
O driver Go cria eventos de topologia , também conhecidos como eventos SDAM, quando há uma alteração no estado da instância ou cluster ao qual você se conectou. Por exemplo, o driver cria um evento quando você estabelece uma nova conexão ou se o cluster optar por um novo nó primary.
As seções a seguir demonstram como registrar as alterações de topologia em seu aplicativo e explorar as informações fornecidas nesses eventos.
Inscrever-se para receber eventos
Você pode acessar detalhes sobre eventos SDAM assinando-os em seu aplicativo. O exemplo seguinte demonstra como assinar o evento ServerClosed
instanciando um ServerMonitor
e conectando a um sistema:
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)
Descrições de evento
Você pode assinar os seguintes eventos SDAM especificando propriedades de uma instância ServerMonitor
:
Nome do evento | Descrição |
---|---|
| Criado quando um estado de instância muda (como de secundário para primário). |
| Criado quando o servidor é inicializado. |
| Criado quando o servidor é fechado. |
| Criado quando a topologia muda, como a eleição de um novo primary ou desconexão de um proxy |
| Criado quando a topologia é inicializada. |
| Criado quando a topologia é fechada. |
| Criado quando a pulsação é iniciada. |
| Criado quando a pulsação é bem-sucedida. |
| Criado quando o heartbeat falha. |
Documentos de exemplos de eventos
As seções a seguir mostram amostras de saída 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 do campo
O campo Kind
em um documento de evento representa o tipo de um único servidor em uma topologia e pode ter os seguintes valores:
Valor | Descrição |
---|---|
| Instância desconhecida |
| Instância autônomo |
| Membro do conjunto de réplicas |
| Instância primária |
| Instância secundária |
| Instância de árbitro |
| Conjunto de réplicas fantasma (um membro que não pode ser consultado) |
|
|
| Instância do balancer de carga |
ServerOpeningEvent
*event.ServerOpeningEvent { "Address": "...", "TopologyID": "..." }
ServerClosedEvent
*event.ServerClosedEvent { "Address": "...", "TopologyID": "..." }
TopologiaDescriptionChangedEvent
Importante
Como o driver chama TopologyDescriptionChangedEvent
quando a topologia de implantação está bloqueada, a chamada de resposta (argumento de função) para esse evento não deve tentar nenhuma operação que exija a seleção do servidor no mesmo 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 o valor do campo Kind
, consulte a seção Valor do campo de tipo.
TopologiaOpeningEvent
*event.TopologyOpeningEvent { "TopologyID": "..." }
TopologiaClosedEvent
*event.TopologyClosedEvent { "TopologyID": "..." }
ServerHeatbeatStartedEvent
*event.ServerHeartbeatStartedEvent { "ConnectionID": "...", "Awaited": true }
ServerHeatbeatSucceededEvent
*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 o valor do campo Kind
, consulte a seção Valor do campo de tipo.
ServerHeatbeatFailedEvent
*event.ServerHeartbeatFailedEvent { "DurationNanos": ..., "Failure": "<error message>" "ConnectionID": "...", "Awaited": true }
Monitorar eventos do pool de conexões
Um pool de conexões é um conjunto de conexões TCP abertas que seu driver mantém com uma instância MongoDB . Os pools de conexões ajudam a reduzir o número de negociações de rede que seu aplicação precisa executar e podem ajudá- aplicação a ser executado mais rapidamente.
As seções a seguir demonstram como registrar eventos de pool de conexões em seu aplicativo e explorar as informações fornecidas nesses eventos.
Inscrever-se para receber eventos
Você pode acessar detalhes sobre eventos do pool de conexões assinando-os em seu aplicativo. O exemplo seguinte demonstra como assinar o evento PoolEvent
instanciando um PoolMonitor
e conectando a um sistema:
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)
Descrições de evento
A tabela a seguir descreve os tipos de eventos de pool que o driver emite:
Tipo de evento de pool | Descrição |
---|---|
| Criado quando um pool de conexões é criado. |
| Criado quando um pool de conexões estiver pronto. |
| Criado quando todas as conexões no pool são fechadas. |
| Criado quando um pool de conexões é fechado, antes da destruição da instância do servidor. |
| Criado quando uma conexão é criada, mas não necessariamente quando é usada para uma operação. |
| Criado após uma conexão concluir um handshake e estar pronta para ser usada em operações. |
| Criado quando uma conexão é fechada. |
| Criado quando uma operação tenta adquirir uma conexão para execução. |
| Criado quando uma operação não pode adquirir uma conexão para execução. |
| Criado quando uma operação adquire com sucesso uma conexão para execução. |
| Criado quando uma conexão é verificada novamente no pool depois que uma operação é executada. |
Documentos de exemplos de eventos
As seções abaixo mostram amostras de saída para cada tipo de evento de monitoramento do pool de conexões.
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 }
connectionCreated
*event.PoolEvent { "type": "ConnectionCreated", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
connectionReady
*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 }
connectionCheckOutFailed
*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 }
Informações adicionais
Para saber mais sobre como monitorar uma MongoDB deployment, consulte o artigo Como monitorar o MongoDB .
Para saber mais sobre como se conectar ao MongoDB, consulte o Guia de Conexão.
Para saber mais sobre como executar operações do MongoDB, consulte os guias de operações CRUD .
Documentação da API
Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo:
Pacote de evento
Eventos de comando
Monitor de comando tipo
SetMonitor() método
CommandStartedEvent tipo
CommandFailedEvent tipo
Eventos SDAM
ServerMonitor tipo
SetServerMonitor() método
Eventos do pool de conexões
Monitor depiscina tipo
PoolEvent tipo
SetPoolMonitor() método