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 Criar um MongoClient.
Para saber mais sobre como executar operações MongoDB, consulte a seção 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: