Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver GO
/

Monitorar eventos de aplicativos

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:

  • Monitorar eventos de comando

  • Monitorar eventos de descoberta e monitoramento do servidor (SDAM)

  • Monitorar eventos do pool de conexões

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.

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.

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)

Você pode assinar um ou mais dos seguintes eventos de monitoramento de comando:

Nome do evento
Descrição

CommandStartedEvent

Criado quando um comando é iniciado.

CommandSucceededEvent

Criado quando um comando é bem-sucedido.

CommandFailedEvent

Criado quando um comando não é bem-sucedido.

As seções a seguir mostram amostras de saída para cada tipo de evento de monitoramento 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": "..."
}

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.

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)

Você pode assinar os seguintes eventos SDAM especificando propriedades de uma instância ServerMonitor :

Nome do evento
Descrição

ServerDescriptionChangedEvent

Criado quando um estado de instância muda (como de secundário para primário).

ServerOpeningEvent

Criado quando o servidor é inicializado.

ServerClosedEvent

Criado quando o servidor é fechado.

TopologyDescriptionChangedEvent

Criado quando a topologia muda, como a eleição de um novo primary ou desconexão de um proxy mongos .

TopologyOpeningEvent

Criado quando a topologia é inicializada.

TopologyClosedEvent

Criado quando a topologia é fechada.

ServerHeartbeatStartedEvent

Criado quando a pulsação é iniciada.

ServerHeartbeatSucceededEvent

Criado quando a pulsação é bem-sucedida.

ServerHeartbeatFailedEvent

Criado quando o heartbeat falha.

As seções a seguir mostram amostras de saída 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": {...}
}
}

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

0

Instância desconhecida

1

Instância autônomo

2

Membro do conjunto de réplicas

6

Instância primária

10

Instância secundária

18

Instância de árbitro

34

Conjunto de réplicas fantasma (um membro que não pode ser consultado)

256

mongos instância de proxy

512

Instância do balancer de carga

*event.ServerOpeningEvent
{
"Address": "...",
"TopologyID": "..."
}
*event.ServerClosedEvent
{
"Address": "...",
"TopologyID": "..."
}

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.

*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 o valor do campo Kind, consulte a seção Valor do campo de tipo.

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

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.

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)

A tabela a seguir descreve os tipos de eventos de pool que o driver emite:

Tipo de evento de pool
Descrição

ConnectionPoolCreated

Criado quando um pool de conexões é criado.

ConnectionPoolReady

Criado quando um pool de conexões estiver pronto.

ConnectionPoolCleared

Criado quando todas as conexões no pool são fechadas.

ConnectionPoolClosed

Criado quando um pool de conexões é fechado, antes da destruição da instância do servidor.

ConnectionCreated

Criado quando uma conexão é criada, mas não necessariamente quando é usada para uma operação.

ConnectionReady

Criado após uma conexão concluir um handshake e estar pronta para ser usada em operações.

ConnectionClosed

Criado quando uma conexão é fechada.

ConnectionCheckOutStarted

Criado quando uma operação tenta adquirir uma conexão para execução.

ConnectionCheckOutFailed

Criado quando uma operação não pode adquirir uma conexão para execução.

ConnectionCheckedOut

Criado quando uma operação adquire com sucesso uma conexão para execução.

ConnectionCheckedIn

Criado quando uma conexão é verificada novamente no pool depois que uma operação é executada.

As seções abaixo mostram amostras de saída para cada tipo de evento de monitoramento do pool de conexões.

*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 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 .

Para saber mais sobre os métodos e tipos mencionados neste guia, consulte a documentação da API abaixo:

Voltar

Monitoramento e registro