Menu Docs
Página inicial do Docs
/ / /
Driver de Kotlin Sync

Monitoramento

Neste guia, você pode aprender como configurar e configurar o monitoramento no driver Kotlin Sync.

O monitoramento é o processo de obtenção de informações sobre as atividades que um programa em execução realiza para uso em um aplicativo ou em uma biblioteca de gerenciamento de desempenho de aplicativo.

Você pode usar o driver Kotlin Sync para monitorar eventos de cluster, comando do driver e pool de conexões . Esses recursos o ajudam a tomar decisões informadas ao projetar e depurar seu aplicação.

Este guia mostra como executar as seguintes tarefas:

  • Monitore eventos específicos usando o driver Kotlin Sync

  • Monitorar eventos do pool de conexões com extensões de gerenciamento Java (JMX) e JConsole

Dica

Este guia mostra como usar informações sobre a metaatividade do driver. Para saber como registrar transações de dados, consulte a página Alterações de dados de monitoramento.

Para monitorar um evento, você deve registrar um ouvinte na sua instância do MongoClient.

Um evento é qualquer ação que aconteça em um programa em execução. O driver inclui funcionalidade para ouvir um subconjunto dos eventos que ocorrem quando o driver está em execução.

Um ouvinte é uma classe que realiza alguma ação quando ocorrem determinados eventos. A API de um ouvinte define os eventos aos quais ele pode responder.

Cada método de uma classe de ouvinte representa uma resposta a um determinado evento e aceita como argumento um objeto de evento que representa o evento.

O driver Kotlin Sync organiza os eventos que ele define em três categorias:

  • Eventos de comando

  • Eventos de descoberta e monitoramento de servidores

  • Eventos do pool de conexões

As seções a seguir mostram como monitorar cada categoria de evento . Para obter uma lista completa dos eventos que você pode monitorar, consulte o pacote de evento Java .

Um evento de comando é um evento relacionado a um comando do banco de dados MongoDB. Alguns exemplos de comandos do banco de dados que produzem eventos de comando são find, insert, delete e count.

Para monitorar eventos de comando, crie uma classe que implemente a interface do CommandListener e registre uma instância dessa classe com sua instância do MongoClient .

Para obter mais informações sobre comandos do banco de dados MongoDB, consulte a entrada manual do MongoDB em comandos do banco de dados no manual do MongoDB Server.

Observação

Comandos internos

O driver não publica eventos para comandos que chama internamente. Isso inclui comandos de banco de dados que o driver usa para monitorar seu cluster e comandos relacionados ao estabelecimento de conexão, como o comando hello inicial.

Importante

Saída editada

Como medida de segurança, o driver redige o conteúdo de alguns eventos de comando. Isso protege as informações confidenciais contidas nesses eventos de comando. Para obter uma lista completa de eventos de comando redigidos, consulte a Especificação de monitoramento e registro de comandos do MongoDB.

Este exemplo mostra como fazer um contador para comandos do banco de dados . O contador controla o número de vezes que o driver executa com êxito cada comando de banco de dados e imprime essas informações sempre que um comando de banco de dados é concluído.

Para criar um contador, siga estas etapas:

  1. Crie uma classe com funcionalidade de contador que implemente a interface do CommandListener.

  2. Adicione uma instância da nova classe a um objeto MongoClientSettings .

  3. Configure sua instância MongoClient com o objeto MongoClientSettings .

O seguinte código implementa estas etapas:

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.event.*
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
class CommandCounter : CommandListener {
private val commands = mutableMapOf<String, Int>()
override fun commandSucceeded(event: CommandSucceededEvent) {
val commandName = event.commandName
val count = commands[commandName] ?: 0
commands[commandName] = count + 1
println(commands.toString())
}
override fun commandFailed(event: CommandFailedEvent) {
println("Failed execution of command '${event.commandName}' with id ${event.requestId}")
}
}
fun main() {
val uri = "<connection string uri>"
// Instantiate your new listener
val commandCounter = CommandCounter()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.addCommandListener(commandCounter)
.build()
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
// Run some commands to test the counter
collection.find().firstOrNull()
collection.find().firstOrNull()
mongoClient.close()
}
{find=1}
{find=2}
{find=2, endSessions=1}

Para obter mais informações sobre as aulas e métodos mencionados nesta seção, consulte a seguinte documentação da API:

Um evento de descoberta e monitoramento de servidor (SDAM) é um evento relacionado a uma alteração no estado da instância MongoDB ou cluster ao qual você conectou o driver.

O driver define nove eventos SDAM e fornece as seguintes interfaces de ouvinte, que escutam três eventos SDAM cada:

Para monitorar um tipo de evento SDAM, crie uma classe que implemente uma das três interfaces anteriores e registre uma instância dessa classe com sua instância MongoClient.

Para obter uma descrição detalhada de cada evento SDAM, consulte Especificação de eventos de monitoramento SDAM do MongoDB.

Este exemplo mostra como criar uma classe de ouvinte que imprime uma mensagem sobre a disponibilidade de escrita de sua instância MongoDB .

Para criar um evento que relata o status de gravação, execute as seguintes tarefas:

  1. Crie uma classe que acompanhe as alterações na descrição do cluster e implemente a interface ClusterListener.

  2. Adicione uma instância da nova classe a um objeto MongoClientSettings .

  3. Configure sua instância MongoClient com o objeto MongoClientSettings .

O seguinte código implementa estas etapas:

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.event.*
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
class IsWriteable : ClusterListener {
private var isWritable = false
override fun clusterDescriptionChanged(event: ClusterDescriptionChangedEvent) {
if (!isWritable) {
if (event.newDescription.hasWritableServer()) {
isWritable = true
println("Able to write to cluster")
}
} else {
if (!event.newDescription.hasWritableServer()) {
isWritable = false
println("Unable to write to cluster")
}
}
}
}
fun main() {
val uri = "<connection string uri>"
// Instantiate your new listener
val clusterListener = IsWriteable()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.applyToClusterSettings { builder ->
builder.addClusterListener(clusterListener)
}
.build()
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
// Run a command to trigger a ClusterDescriptionChangedEvent event
collection.find().firstOrNull()
mongoClient.close()
}
Able to write to server

Para obter mais informações sobre as aulas e métodos mencionados nesta seção, consulte a seguinte documentação da API:

Um evento do pool de conexões é um evento relacionado a um pool de conexões mantido pelo driver. 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ão ajudam a reduzir o número de handshakes de rede que seu aplicação executa com uma instância do MongoDB e podem ajudar seu aplicação a ser executado mais rapidamente.

Para monitorar eventos do pool de conexões , crie uma classe que implemente a interface ConnectionPoolListener e registre uma instância dessa classe com sua instância MongoClient.

Este exemplo mostra como criar uma classe de ouvinte que imprime uma mensagem sempre que você faz check-out de uma conexão do pool de conexões.

Para criar um evento que relata saídas de conexão, execute as seguintes tarefas:

  1. Crie uma classe que rastreie checkouts e implemente a interface CommandListener .

  2. Adicione uma instância da nova classe a um objeto MongoClientSettings .

  3. Configure sua instância MongoClient com o objeto MongoClientSettings .

O seguinte código implementa estas etapas:

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.event.*
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
class ConnectionPoolLibrarian : ConnectionPoolListener {
override fun connectionCheckedOut(event: ConnectionCheckedOutEvent) {
println("Let me get you the connection with id ${event.connectionId.localValue}...")
}
override fun connectionCheckOutFailed(event: ConnectionCheckOutFailedEvent) {
println("Something went wrong! Failed to checkout connection.")
}
}
fun main() {
val uri = "<connection string uri>"
// Instantiate your new listener
val cpListener = ConnectionPoolLibrarian()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.applyToConnectionPoolSettings({
it.addConnectionPoolListener(cpListener)
})
.build()
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
// Run some commands to test the counter
collection.find().firstOrNull()
mongoClient.close()
}
Let me get you the connection with id 21...

Para obter mais informações sobre as aulas e métodos mencionados nesta seção, consulte a seguinte documentação da API:

Você pode monitorar eventos do pool de conexão usando Java Management Extensions (JMX). O JMX fornece ferramentas para monitorar aplicativos e dispositivos.

Para obter mais informações sobre o JMX, consulte a documentação oficial do Oracle JMX.

Para habilitar o monitoramento do pool de conexões JMX, adicione uma instância da classe JMXConnectionPoolListener ao seu objeto MongoClient.

A classe JMXConnectionPoolListener executa as seguintes ações:

  1. Cria instâncias de MXBean para cada processo do mongod ou mongos com o qual o driver mantém um pool de conexão.

  2. Registra estas instâncias MXBean com o servidor MBean da plataforma.

Os MXBeans registrados no servidor MBean da plataforma têm as seguintes propriedades:

Propriedade
Descrição

clusterId

Um identificador exclusivo gerado pelo cliente. Esse identificador garante que cada MXBean criado pelo driver tenha um nome exclusivo quando um aplicativo tiver várias instâncias MongoClient conectadas ao mesmo sistema do MongoDB.

host

O nome de host da máquina executando o processo do mongod ou mongos.

port

A porta na qual o processo mongod ou mongos está escutando.

minSize

O tamanho mínimo do pool de conexões, incluindo conexões ociosas e em uso.

maxSize

O tamanho máximo do pool de conexões, incluindo conexões ociosas e em uso.

size

O tamanho atual do pool de conexões, incluindo conexões ociosas e em uso.

checkedOutCount

A contagem atual de conexões que estão em uso.

Todas as instâncias MXBean criadas pelo driver estão sob o domínio "org.mongodb.driver".

Para obter mais informações sobre os tópicos discutidos nesta subseção, consulte os seguintes recursos da Oracle:

Este exemplo mostra como você pode monitorar os pools de conexão do driver usando JMX e JConsole. JConsole é uma ferramenta de monitoramento de GUI compatível com JMX que vem com a Java Platform.

Dica

Consulte a documentação oficial do JMX e do JConsole

As descrições de JMX e JConsole neste exemplo são ilustrativas em vez de uma fonte da verdade. Para obter informações atualizadas, consulte os seguintes recursos oficiais da Oracle:

O seguinte trecho de código adiciona um JMXConnectionPoolListener a uma instância do MongoClient. O código então pausa a execução para que você possa navegar até o JConsole e inspecionar seus pools de conexão.

import com.mongodb.kotlin.client.MongoClient
import org.bson.Document
import com.mongodb.MongoClientSettings
import com.mongodb.ConnectionString
import com.mongodb.management.JMXConnectionPoolListener
fun main() {
val uri = "<connection string uri>"
// Instantiate your JMX listener
val connectionPoolListener = JMXConnectionPoolListener()
// Include the listener in your client settings
val settings = MongoClientSettings.builder()
.applyConnectionString(ConnectionString(uri))
.applyToConnectionPoolSettings {
it.addConnectionPoolListener(connectionPoolListener)
}
.build()
try {
// Connect to your database
val mongoClient = MongoClient.create(settings)
val database = mongoClient.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("movies")
collection.find().firstOrNull()
collection.find().firstOrNull()
println("Navigate to JConsole to see your connection pools...")
// Pause execution
Thread.sleep(Long.MAX_VALUE)
mongoClient.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
Navigate to JConsole to see your connection pools...

Após iniciar seu servidor, abra o JConsole em seu terminal utilizando o seguinte comando:

jconsole

Quando o JConsole estiver aberto, realize as seguintes ações na interface do usuário:

  1. Selecione o processo que executa o código de exemplo anterior.

  2. Pressione Insecure Connection na caixa de diálogo de aviso.

  3. Clique na aba MBeans.

  4. Inspecione os eventos do pool de conexões no domínio "org.mongodb.driver".

Quando você não quiser mais inspecionar seus pools de conexão no JConsole, faça o seguinte:

  1. Sair do JConsole fechando a janela do JConsole.

  2. Interrompa a execução do programa pelo trecho de código anterior.

Para obter mais informações sobre JMX e JConsole, consulte os seguintes recursos da Oracle:

Para mais informações sobre a classe JMXConnectionPoolListener, consulte a documentação API para JMXConnectionPoolListener.

Se você utilizar um sistema de rastreamento distribuído, poderá incluir dados de eventos do driver. Um sistema de rastreamento distribuído é um aplicativo que rastreia solicitações à medida que elas se propagam por diferentes serviços em uma arquitetura orientada a serviços.

Se você usar o driver em um aplicação Spring Cloud, use o Spring Cloud Sleuth para incluir dados de evento do MongoDB no sistema de rastreamento distribuído Zipkin.

Se você não usar o Spring Cloud ou quiser incluir dados de evento de driver em um sistema de rastreamento distribuído que não seja o Zipkin, deverá escrever um ouvinte de evento de comando que gerencie os spans para o sistema de rastreamento distribuído desejado.

Dica

Para saber mais sobre os conceitos discutidos nesta seção, consulte os seguintes recursos:

Voltar

Execute um comando

Nesta página

  • Visão geral
  • Monitorar eventos
  • Eventos de comando
  • Eventos de descoberta e monitoramento de servidores
  • Eventos do pool de conexões
  • Monitore eventos do pool de conexões com JMX
  • Suporte a JMX
  • Exemplo de JMX e JConsole
  • Incluir o driver em seu sistema de rastreamento distribuído