Visão geral
Neste guia, você pode aprender como usar o driver Scala para monitorar eventos que ocorrem durante a operação do driver. O monitoramento envolve a coleta de informações sobre as atividades de um programa em execução, que você pode usar com um aplicativo ou uma biblioteca de gerenciamento de desempenho de aplicativo.
Você pode monitorar eventos de aplicativo para entender o uso e o desempenho dos recursos do driver, o que ajuda a tomar decisões informadas ao projetar e depurar seu aplicativo.
O driver Scala organiza os eventos que você pode monitorar nas seguintes categorias:
Eventos de comando: eventos relacionados a comandos de banco de dados MongoDB
Eventos de descoberta e monitoramento de servidor (SDAM): Eventos relacionados a alterações no estado da instância ou cluster do MongoDB ao qual você está conectado
Evento do pool de conexões: Evento relacionado ao pool de conexões que o driver mantém com uma instância do MongoDB
As seções a seguir descrevem cada categoria de evento e mostram como monitorar eventos. Para aprender a registrar eventos de driver em um log, consulte o guia Logging.
Monitorar eventos de comando
Um evento de comando é um evento relacionado a um comando de banco de dados MongoDB. Exemplos de comandos de banco de dados que produzem eventos de comando incluem find, insert, delete e count.
O driver Scala não publica eventos para comandos que chama internamente. Isso inclui comandos que o driver usa para monitorar seu cluster e comandos relacionados ao estabelecimento de conexão, como o comando hello inicial.
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 .
Importante
Saída editada
Como medida de segurança, o driver redige o conteúdo de alguns eventos de comando para proteger informações confidenciais. Para obter uma lista completa de eventos de comando redigidos, consulte a seção Segurança da especificação de monitoramento e registro de comandos do MongoDB.
Para aprender mais sobre os comandos do banco de dados MongoDB, consulte Comandos de banco de dados.
Exemplo
O exemplo a seguir define a classe CommandCounter, que implementa a interface CommandListener. A classe acompanha 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 é concluído.
case class CommandCounter() extends CommandListener { private val commands = scala.collection.mutable.Map[String, Int]() override def commandStarted(event: CommandStartedEvent): Unit = {} override def commandSucceeded( event: CommandSucceededEvent ): Unit = { val commandName = event.getCommandName commands(commandName) = commands.getOrElse(commandName, 0) + 1 println(commands.toMap) } override def commandFailed(event: CommandFailedEvent): Unit = {} }
O código a seguir adiciona uma instância da classe CommandCounter a um objeto MongoClientSettings e configura uma instância MongoClient usando as configurações:
val settings: MongoClientSettings = MongoClientSettings .builder() .addCommandListener(CommandCounter()) .applyConnectionString(ConnectionString("<connection string>")) .build() val mongoClient: MongoClient = MongoClient(settings)
Quando você executa o aplicativo, a saída é semelhante à seguinte:
Map(find -> 1) Map(find -> 2) Map(find -> 2, endSessions -> 1)
Descrições de evento
A tabela a seguir descreve os eventos de comando que o driver Scala publica e a interface do ouvinte que os lida:
eventType | Interface do ouvinte | Descrição |
|---|---|---|
Publicado quando um comando de banco de dados é iniciado. | ||
Publicado quando um comando de banco de dados é bem-sucedido. | ||
Publicado quando um comando de banco de dados falha. |
Monitorar evento SDAM
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ê está conectado.
O driver Scala define nove eventos SDAM e fornece as seguintes interfaces de ouvinte, que escutam três eventos SDAM cada:
ClusterListener: Ouve eventos relacionados a alterações de topologia ou alterações no estado e na estrutura do clusterServerListener: escuta eventos relacionados a alterações individuais do servidorServerMonitorListener: escuta eventos de pulsação, que relatam o status da comunicação entre os nós do conjunto de réplicas
Você pode usar informações de eventos SDAM para entender as alterações do cluster, avaliar a integridade do cluster ou planejar a capacidade.
Exemplo
O exemplo a seguir define a classe TestClusterListener, que implementa a interface ClusterListener. A classe contém métodos que imprimem mensagens em resposta aos seguintes eventos relacionados à topologia:
clusterOpening(): Imprime uma mensagem quando o driver se conecta pela primeira vez a um clusterclusterClosed(): Imprime uma mensagem quando o driver se desconecta de um clusterclusterDescriptionChanged(): Imprime uma mensagem sobre as alterações na disponibilidade de leitura e gravação do cluster
case class TestClusterListener(readPreference: ReadPreference) extends ClusterListener { var isWritable: Boolean = false var isReadable: Boolean = false override def clusterOpening(event: ClusterOpeningEvent): Unit = println(s"Cluster with ID ${event.getClusterId} opening") override def clusterClosed(event: ClusterClosedEvent): Unit = println(s"Cluster with ID ${event.getClusterId} closed") override def clusterDescriptionChanged(event: ClusterDescriptionChangedEvent): Unit = { if (!isWritable) { if (event.getNewDescription.hasWritableServer) { isWritable = true println("Writable server available") } } else { if (!event.getNewDescription.hasWritableServer) { isWritable = false println("No writable server available") } } if (!isReadable) { if (event.getNewDescription.hasReadableServer(readPreference)) { isReadable = true println("Readable server available") } } else { if (!event.getNewDescription.hasReadableServer(readPreference)) { isReadable = false println("No readable server available") } } } }
O código a seguir adiciona uma instância da classe TestClusterListener a um objeto MongoClientSettings e configura uma instância MongoClient usando as configurações:
val uri: ConnectionString = ConnectionString("<connection string>") val settings: MongoClientSettings = MongoClientSettings .builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.addClusterListener(TestClusterListener(ReadPreference.secondary()))) .applyConnectionString(uri) .build() val client: MongoClient = MongoClient(settings)
Quando você executa o aplicativo, a saída é semelhante à seguinte:
Cluster with ID ClusterId{value='...', description='...'} opening Writable server available Readable server available Cluster with ID ClusterId{value='...', description='...'} closed
Descrições de evento
A tabela a seguir descreve cada evento SDAM, a interface do ouvinte que o lida e quando o driver o publica:
eventType | Interface do ouvinte | Descrição |
|---|---|---|
Publicado quando a descrição da topologia muda, como quando há uma eleição de um novo primário. | ||
Publicado quando o driver se conecta pela primeira vez ao cluster. | ||
Publicado quando o driver se desconecta do cluster. | ||
Publicado quando a descrição do servidor é alterada. | ||
Publicado quando um novo servidor é adicionado à topologia. | ||
Publicado quando um servidor existente é removido da topologia. | ||
Publicado quando o monitor do servidor envia um comando | ||
Publicado quando a pulsação é bem-sucedida. | ||
Publicado quando o heartbeat falha. |
Monitorar eventos do pool de conexões
Um evento de pool de conexões é um evento relacionado ao pool de conexões que o driver mantém com uma instância do MongoDB. Um pool de conexões é um conjunto de conexões TCP abertas que seu driver mantém com uma instância do MongoDB. Os pools de conexões reduzem o número de negociações de rede que seu aplicativo precisa executar e podem ajudar seu aplicativo 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.
Exemplo
O exemplo a seguir define a classe ConnectionPoolLibrarian, que implementa a interface ConnectionPoolListener. A classe imprime uma mensagem sempre que o driver faz check-out de uma conexão do pool de conexões.
case class ConnectionPoolLibrarian() extends ConnectionPoolListener { override def connectionCheckedOut( event: ConnectionCheckedOutEvent ): Unit = println( s"Let me get you the connection with id " + s"${event.getConnectionId.getLocalValue}..." ) override def connectionCheckOutFailed( event: ConnectionCheckOutFailedEvent ): Unit = {} }
O código a seguir adiciona uma instância da classe ConnectionPoolLibrarian a um objeto MongoClientSettings e configura uma instância MongoClient usando as configurações:
val settings: MongoClientSettings = MongoClientSettings .builder() .applyToConnectionPoolSettings( (builder: ConnectionPoolSettings.Builder) => builder.addConnectionPoolListener( ConnectionPoolLibrarian() ) ) .applyConnectionString(ConnectionString("<connection string>")) .build() val mongoClient: MongoClient = MongoClient(settings)
Quando você executa o aplicativo, a saída é semelhante à seguinte:
Let me get you the connection with id 1...
Descrições de evento
A tabela a seguir descreve os eventos do pool de conexões que o driver Scala publica e a interface do ouvinte que lida com eles:
eventType | Interface do ouvinte | Descrição |
|---|---|---|
Publicado quando o pool de conexões é criado. | ||
Publicado quando o pool de conexões está pronto para uso. | ||
Publicado quando o pool de conexões é fechado. | ||
Publicado quando uma conexão é criada no pool. | ||
Publicado quando uma conexão conclui seu handshake e está pronta para uso. | ||
Publicado quando uma conexão é fechada. | ||
Publicado quando o driver começa a verificar uma conexão. | ||
Publicado quando o driver verifica com sucesso uma conexão. | ||
Publicado quando o driver não consegue verificar uma conexão. | ||
Publicado quando o driver verifica uma conexão de volta ao pool. | ||
Publicado quando o pool de conexões é limpo. |
Documentação da API
Para saber mais sobre os métodos e tipos discutidos neste guia, consulte a seguinte documentação da API: