Monitoramento
Nesta página
Visão geral
Neste guia, você pode aprender como configurar e configurar o monitoramento no driver Java do MongoDB.
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.
O monitoramento do driver Java do MongoDB permite que você entenda o uso de recursos e o desempenho do driver e pode ajudá-lo a tomar decisões informadas ao projetar e depurar seu aplicativo.
Neste guia você aprenderá como executar estas tarefas:
Monitorar diferentes tipos de eventos no MongoDB Java Driver
Monitorar eventos do pool de conexões com extensões de gerenciamento Java (JMX) e JConsole
Este guia mostra como usar informações sobre a atividade do driver no código. Se você gostaria de aprender a registrar eventos no driver, considere ler nossoguia sobre registro.
Monitorar eventos
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. Cada método recebe um argumento: um objeto representando o evento ao qual o método responde.
O driver MongoDB Java 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.
For a full list of the events you can monitor, see the evento pacote of the MongoDB Java Driver.
Eventos de comando
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, escreva 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 de dados MongoDB , consulte a entrada manual do MongoDB em comandos do banco de dados de dados.
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.
Exemplo
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, faça o seguinte:
Crie uma classe com funcionalidade de contador que implemente a interface do
CommandListener
.Adicione uma instância da nova classe que implementa
CommandListener
em um objetoMongoClientSettings
.Configure uma instância do
MongoClient
com o objetoMongoClientSettings
.
O seguinte código define a classe CommandCounter
que implementa a interface CommandListener
:
class CommandCounter implements CommandListener { private Map<String, Integer> commands = new HashMap<String, Integer>(); public synchronized void commandSucceeded(final CommandSucceededEvent event) { String commandName = event.getCommandName(); int count = commands.containsKey(commandName) ? commands.get(commandName) : 0; commands.put(commandName, count + 1); System.out.println(commands.toString()); } public void commandFailed(final CommandFailedEvent event) { System.out.println(String.format("Failed execution of command '%s' with id %s", event.getCommandName(), event.getRequestId())); } }
O seguinte código adiciona uma instância da classe CommandCounter
a um objeto MongoClientSettings
e configura uma instância MongoClient
com o objeto MongoClientSettings
. O código então executa alguns comandos do banco de dados para testar o contador.
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .addCommandListener(new CommandCounter()) .build(); MongoClient mongoClient = MongoClients.create(settings); MongoDatabase database = mongoClient.getDatabase(DATABASE); MongoCollection<Document> collection = database.getCollection(COLLECTION); // Run some commands to test the timer collection.find().first(); collection.find().first(); mongoClient.close();
O trecho de código anterior produz um resultado semelhante ao seguinte:
{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:
Eventos de descoberta e monitoramento de servidores
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. O driver divide esses nove eventos entre três interfaces de ouvinte separadas, cada uma ouvindo três dos nove eventos. Aqui estão as três interfaces e os eventos que elas escutam:
ClusterListener
: eventos relacionados à topologiaServerListener
: eventos relacionados a processosmongod
oumongos
ServerMonitorListener
: eventos relacionados ao batimento cardíaco
Para monitorar um tipo de evento SDAM, escreva 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 no driver, consulte a Especificação de Monitoramento e Registro SDAM do MongoDB.
Observação
Modo de carga balanceada
O driver não emite eventos relacionados à pulsação quando está no modo de carga balanceada. Para obter mais detalhes sobre eventos SDAM com balanceamento de carga, consulte Especificação de suporte do balancer de carga do MongoDB .
Exemplo
Este exemplo mostra como criar uma classe de ouvinte que imprime uma mensagem que permite que você saiba se o driver pode gravar em sua instância do MongoDB.
O seguinte código define a classe IsWritable
que implementa a interface ClusterListener
.
class IsWriteable implements ClusterListener { private boolean isWritable; public synchronized void clusterDescriptionChanged(final ClusterDescriptionChangedEvent event) { if (!isWritable) { if (event.getNewDescription().hasWritableServer()) { isWritable = true; System.out.println("Able to write to server"); } } else { if (!event.getNewDescription().hasWritableServer()) { isWritable = false; System.out.println("Unable to write to server"); } } } }
O seguinte código adiciona uma instância da classe IsWritable
a um objeto MongoClient
. O código então executa uma operação de localizar para testar a classe IsWritable
.
IsWriteable clusterListener = new IsWriteable(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToClusterSettings(builder -> builder.addClusterListener(clusterListener)) .build(); MongoClient mongoClient = MongoClients.create(settings); MongoDatabase database = mongoClient.getDatabase(DATABASE); MongoCollection<Document> collection = database.getCollection(COLLECTION); // Run a command to trigger a ClusterDescriptionChangedEvent event collection.find().first();
O trecho de código anterior produz um resultado semelhante ao seguinte:
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:
Eventos do pool de conexões
Um evento de 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 aplicativo precisa realizar com uma instância do MongoDB e podem ajudar seu aplicativo a ser executado mais rapidamente.
Para monitorar eventos do pool de conexões, escreva uma classe que implemente a interface ConnectionPoolListener
e registre uma instância dessa classe com sua instância MongoClient
.
Exemplo
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.
O seguinte código define a classe ConnectionPoolLibrarian
que implementa a interface ConnectionPoolListener
.
class ConnectionPoolLibrarian implements ConnectionPoolListener { public void connectionCheckedOut(final ConnectionCheckedOutEvent event) { System.out.println(String.format("Let me get you the connection with id %s...", event.getConnectionId().getLocalValue())); } public void connectionCheckOutFailed(final ConnectionCheckOutFailedEvent event) { System.out.println("Something went wrong! Failed to checkout connection."); } }
O código a seguir adiciona uma instância da classe ConnectionPoolLibrarian
a um objeto MongoClient
. O código então executa um comando de banco de dados para testar o bibliotecário.
ConnectionPoolLibrarian cpListener = new ConnectionPoolLibrarian(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(cpListener)) .build(); MongoClient mongoClient = MongoClients.create(settings); MongoDatabase database = mongoClient.getDatabase(DATABASE); MongoCollection<Document> collection = database.getCollection(COLLECTION); // Run a command to trigger connection pool events collection.find().first();
O trecho de código anterior produz um resultado semelhante ao seguinte:
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:
Monitore eventos do pool de conexões com JMX
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.
Suporte a 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:
Cria instâncias de MXBean para cada processo do
mongod
oumongos
com o qual o driver mantém um pool de conexão.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 |
---|---|
| 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 |
| O nome de host da máquina executando o processo do |
| A porta na qual o processo |
| O tamanho mínimo do pool de conexões, incluindo conexões ociosas e em uso. |
| O tamanho máximo do pool de conexões, incluindo conexões ociosas e em uso. |
| O tamanho atual do pool de conexões, incluindo conexões ociosas e em uso. |
| 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:
Exemplo de JMX e JConsole
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.
JMXConnectionPoolListener connectionPoolListener = new JMXConnectionPoolListener(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(URI) .applyToConnectionPoolSettings(builder -> builder.addConnectionPoolListener(connectionPoolListener)) .build(); // Creates a MongoClient instance that enables connection pool event monitoring with the JMX tool MongoClient mongoClient = MongoClients.create(settings); try { System.out.println("Navigate to JConsole to see your connection pools..."); // Pauses the code execution so you can navigate to JConsole and inspect your connection pools Thread.sleep(Long.MAX_VALUE); // Prints exception details if any exceptions occur during the code execution } catch (Exception e) { e.printStackTrace(); }
O trecho de código anterior produz um resultado semelhante ao seguinte:
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:
Selecione o processo Java que executa o código de exemplo anterior.
Pressione Insecure Connection na caixa de diálogo de aviso.
Clique na aba MBeans.
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:
Sair do JConsole fechando a janela do JConsole
Pare o programa Java executando o 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 JMXConnectionPoolListener
classe , consulte a Documentação da API para JMXConnectionPoolListener.
Incluir o driver em seu sistema de rastreamento distribuído
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 aplicativo Spring Cloud, use o Spring Cloud Sleuth para incluir dados de eventos do MongoDB no sistema de rastreamento distribuído Zipkin.
Se você não usar o Spring Cloud ou precisar incluir dados de eventos de driver em um sistema de rastreamento distribuído que não seja o Zipkin, deverá escrever um ouvinte de eventos de comando que gerencie os spans para o sistema de rastreamento distribuído desejado. Para ver uma implementação de tal ouvinte, consulte a classe TraceMongoCommandListener no código-fonte Spring Cloud Sleuth.
Para saber mais sobre o Spring Cloud Sleuth, consulte Comece a usar na documentação do Spring Cloud Sleuth.
Para ver uma descrição detalhada de um sistema de rastreamento distribuído, consulte Dapper da Google Research.