Menu Docs
Página inicial do Docs
/ / /
Driver de sincronização Java
/

Monitoramento

Neste guia, você pode aprender como configurar e configurar o monitoramento no Driver Java do MongoDB.

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 .

O monitoramento do driver Java 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

  • Monitore 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. Para saber como registrar eventos no driver, consulte o guia deregistro do driver Java.

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.

Para saber mais sobre os eventos que você pode monitorar, consulte a documentação da API para classes de evento .

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 saber mais sobre os comandos do banco de dados MongoDB, consulte o guia Comandos do banco de dados no Manual do servidor.

Observação

Comandos internos

O driver Java 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 seção Segurança da especificação de Registro e Monitoramento de Comandos do MongoDB no GitHub.

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:

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

  2. Adicione uma instância da nova classe que implementa CommandListener em um objeto MongoClientSettings.

  3. Configure uma instância MongoClient usando o objeto MongoClientSettings.

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>();
@Override
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());
}
@Override
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 usando o objeto MongoClientSettings. O código então executa comandos de amostra find() 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);
// Runs sample find() 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 saber mais sobre as aulas e os 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. O driver divide esses nove eventos entre três interfaces de ouvinte separadas. Veja a seguir as três interfaces e os eventos que elas escutam:

  • ClusterListener: eventos relacionados à topologia

  • ServerListener: eventos relacionados a processos mongod ou mongos

  • 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 seção API do servidor da Especificação de Monitoramento e Registro SDAM do MongoDB no GitHub.

Observação

Modo de carga balanceada

O driver não emite eventos relacionados à pulsação quando está no modo de carga balanceada. Para saber mais sobre eventos SDAM com balanceamento de carga, consulte a seção Registro e monitoramento de descoberta de servidor da Especificação de suporte do balanceador de carga do MongoDB no GitHub.

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;
@Override
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);
// Runs a sample find() command to trigger a ClusterDescriptionChangedEvent event
collection.find().first();

O trecho de código anterior produz uma mensagem de confirmação semelhante à 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:

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 precisa realizar com uma instância do MongoDB e podem ajudar seu aplicação a ser executado mais rapidamente. Para saber mais sobre pool de conexões, consulte o guia Pools de conexões do driver Java.

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.

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 {
@Override
public void connectionCheckedOut(final ConnectionCheckedOutEvent event) {
System.out.println(String.format("Let me get you the connection with id %s...",
event.getConnectionId().getLocalValue()));
}
@Override
public void connectionCheckOutFailed(final ConnectionCheckOutFailedEvent event) {
System.out.println("Something went wrong! Failed to checkout connection.");
}
}

O seguinte código 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);
// Runs a sample find() 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:

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

Para saber 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 saber mais 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:

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:

  1. Selecione o processo Java 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:

  • Sair do JConsole fechando a janela do JConsole

  • Pare o programa Java executando o trecho de código anterior

Para saber mais sobre JMX e JConsole, consulte os seguintes recursos da Oracle:

Para saber mais sobre a classe JMXConnectionPoolListener, consulte a documentação da 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 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.

Voltar

Exploração madeireira

Nesta página