14 Agente JMX (Monitoração JMX)

14.1 Visão geral

A monitoração JMX é feita através de contadores JMX de uma aplicação escrita em JAVA. O Zabbix suporta este tipo de monitoração nativamente, através do módulo "Zabbix Java gateway", que foi introduzido no Zabbix 2.0.

Para recuperar de um host o valor de um contador JMX, o Zabbix server os requisita ao Zabbix Java Gateway, que utiliza-se da API de gerenciamento JMX para obte-los da aplicação JAVA.

Veja o manual sobre o Zabbix Java gateway para maiores detalhes sobre sua implementação.

14.2 Habilitando monitoração JMX remota em aplicações Java

Uma aplicação Java não necessita de nenhum software adicional, mas necessita ser iniciada com o parâmetro de linha de comando específico para habilitar o suporte à monitoração remota via JMX.

No mínimo, se você quer começar a monitoração de uma aplicação feita em java em um host local, sem definições específicas de segurança, você deverá utilizar os parâmetros abaixo:

java \
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345 \
       -Dcom.sun.management.jmxremote.authenticate=false \
       -Dcom.sun.management.jmxremote.ssl=false \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

Estes parâmetros informam ao Java para aceitar conexões JMX na porta 12345 e informa que não deverá ser requerida autenticação ou SSL.

Se, no seu caso, você precisa monitorar a aplicação a partir de outro servidor, existem vários outros parâmetros que poderão ser utilizados. Por exemplo, o próximo parâmetro inicia a aplicação aceitando conexões de outros hosts, não somente do host local.

java \
       -Djava.rmi.server.hostname=192.168.3.14 \
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345 \
       -Dcom.sun.management.jmxremote.authenticate=true \
       -Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
       -Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
       -Dcom.sun.management.jmxremote.ssl=true \
       -Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
       -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
       -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
       -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
       -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

A maioria destas configurações (se não todas) podem ser especificadas em /etc/java-6-openjdk/management/management.properties (ou onde quer que este arquivo tenha sido definido em seu ambiente).

Observe que se você precisar utilizar o SSL, você precisará alterar o script de inicialização startup.sh e adicionar o parâmetro -Djavax.net.ssl.* no Zabbix Java gateway, para que ele saiba onde encontrar as chaves e redes de confiança.

Veja monitorando e gerenciando usando JMX para mais detalhes.

14.3 Configurando interfaces e itens JMX na interface web do Zabbix

Com o Zabbix Java gateway em execução o Zabbix Server passa a saber onde encontra-lo e como encontrar as aplicações com suporte a JMX, o próximo passo é configurar os itens.

Configurando a interface JMX

Você começa criando uma interface JMX no host:

Adicionando um item Agente JMX

Para cada contador JMX que você estiver interessado você precisará adicionar um item do tipo Agente JMX associado à interface criada no passo anterior. Se você tiver configurado uma autenticação para a sua aplicação Java você deverá especificar também um usuário e senha no item.

A chave definida na imagem a seguir é jmx["java.lang:type=Memory","HeapMemoryUsage.used"], nesta definição existem dois parâmetros:

  • object name - representa o objeto nome de um MBean
  • attribute name - um atributo MBean com composição opcional e campos de dados separados por pontos

Veja a seguir os detalhes do item JMX.

Se você quiser monitorar um contador booleano que seja "verdadeiro" ou "falso", então você pode especificar o tipo de informação como "Numérico (inteiro sem sinal)" e o tipo de dados como "Booleano". O Zabbix Server irá armazenar os valores como 1 e 0, respectivamente.

Detalhes sobre Chaves de itens JMX

Atributos simples

Um objeto MBean nada mais é um texto que você define em uma aplicação Java. Um nome de atributo, por outro lado, pode ser mais complexo. Caso um atributo retorne um tipo primitivo de dados (um inteiro, texto, etc) não se preocupe, a chave será algo similar ao definido a seguir:

jmx[com.example:Type=Hello,weight]

Neste exemplo o nome do objeto é "com.example:Type=Hello", o nome do atributo é "weight" e provavelmente retornará um valor do tipo "Numerico (fracionário)".

Atributos retornando dados compostos

Pode ser um pouco mais complicado quando o atributo retorna dados compostos. Por exemplo: o nome do seu atributo é "apple" e retorna um "hash" representando seus parâmetros, como "weight", "color" etc. Sua chave pode ser algo similar ao exemplo a seguir:

jmx[com.example:Type=Hello,apple.weight]

É assim que o nome do atributo e o "hash" da chave são separados, com um ponto. Da mesma forma, se um atributo retorna dados compostos as partes serão separadas por pontos:

jmx[com.example:Type=Hello,fruits.apple.weight]


Problemas com pontos

Por enquanto tudo bem. Mas e se o nome do atributo ou a chave "hash" contiver o símbolo "."? Um exemplo:

jmx[com.example:Type=Hello,all.fruits.apple.weight]

Aí temos um problema. Como dizer ao Zabbix que o nome do atributo é "all.fruits", não apenas "all"? Como distinguir o ponto que é parte do nome do ponto que separa o nome de atributo e o hash de chaves?

Antes do Zabbix 2.0.4 o Zabbix Java gateway não conseguia gerir esta situação e os usuários tinham itens com o estado 'não suportado'. Desde o 2.0.4 isso passou a ser possível, tudo que você precisa é escapar os pontos com uma "\":

jmx[com.example:Type=Hello,all\.fruits.apple.weight]

Da mesma forma, se seu hash de chave contêm um ponto, você pode escapa-lo:

jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]


Outros problemas

O caracter de escape pode ser escapado também:

jmx[com.example:type=Hello,c:\\documents]

Se o nome do objeto ou o nome do atributo contiver espaços ou aspas duplas:

jmx["com.example:Type=Hello","fruits.apple.total weight"]

É isso que temos para o momento. Feliz monitoramento JMX!