Esta é uma tradução da página de documentação original em inglês. Ajude-nos a torná-la melhor.

13 Monitoramento JMX

Visão geral

Monitoramento JMX pode ser usado para monitorar contadores JMX de uma aplicação Java.

O monitoramento JMX possui suporte nativo no Zabbix na forma de um daemon (serviço) chamado "Zabbix Java Gateway", introduzido desde o Zabbix 2.0.

Para resgatar o valor de um contador JMX em particular em um host, o Zabbix Server consulta o Zabbix Java Gateway, que por sua vez usa a API de gerenciamento JMX para consultar a aplicação de interesse remotamente.

Para mais detalhes e configuração verifique a seção Zabbix Java Gateway.

A comunicação entre o Java Gateway e a aplicação JMX monitorada deve estar devidamente liberada pelo firewall de rede.

Habilitando monitoramento JMX remoto para aplicação Java

Uma aplicação Java não necessita de qualquer software adicional instalado, mas precisa ser iniciada com as opções de linha de comando especificadas abaixo para ter suporte ao monitoramento JMX remoto.

No mínimo, se você deseja apenas iniciar o monitoramento de uma aplicação Java simples em um host local sem aplicação de segurança, inicie com estas opções:

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

Isto faz com que o Java ouça conexões JMX de entrada na porta 12345, apenas do host local, e declara que não é necessário autenticação ou SSL.

Se você deseja permitir conexões em outra interface, configure o parâmetro -Djava.rmi.server.hostname com o IP dessa interface.

Se você deseja ser mais rigoroso com a segurança, há muitas outras opções de Java disponíveis. Como exemplo, a instrução abaixo inicia a aplicação com um conjunto de opções mais versátil e a deixa aberta para uma rede mais ampla, não apenas o 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 \
       -Dcom.sun.management.jmxremote.registry.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 (se não todas) configurações pode ser especificada em /etc/java-6-openjdk/management/management.properties (ou onde quer que esse arquivo esteja em seus sistema).

Note que se você deseja usar SSL, você tem que modificar o script startup.sh com a adição das opções -Djavax.net.ssl.* para o Java Gateway, de forma que ele saiba onde encontrar o 'keystore' e o 'truststore'.

Consulte Monitoramento e Gerenciamento Usando JMX para uma descrição detalhada.

Configurando interfaces e itens JMX no Zabbix Frontend

Com o Java Gateway em execução, o Server tendo conhecimento de onde o encontrar e uma aplicação Java iniciada com suporte a monitoramento JMX remoto, é hora de configurar as interfaces e itens no GUI do Zabbix.

Configurando interface JMX

Você começa criando uma interface do tipo JMX no host de interesse.

Todos os campos obrigatórios estão marcados com um asterisco vermelho.

Adicionando um item de agente JMX

Para cada contador JMX no qual você está interessado você adiciona um item Agente JMX anexado a essa interface.

A chave na imagem abaixo diz jmx["java.lang:type=Memory","HeapMemoryUsage.used"].

Todos os campos obrigatórios estão marcados com um asterisco vermelho.

Os campos que requerem informação específica para itens JMX são:

Tipo Configure Agente JMX aqui.
Chave A chave de item jmx[] contém três parâmetros:
nome de objeto - o nome de objeto de um MBean
nome de atributo - um nome de atributo MBean com campos de dados compostos opcionais separados por pontos
descrição curta única - uma descrição única que permita múltiplos itens JMX com o mesmo nome de objeto e nome de atributo no host (opcional)
Veja abaixo mais detalhes em relação às chaves de item JMX.
Desde o Zabbix 3.4, você pode descobrir MBeans e atributos de MBean usando o item de descoberta de baixo-nível jmx.discovery[].
Endpoint JMX Você pode especificar um endpoint JMX customizado. Certifique-se de que os parâmetros de conexão ao endpoint JMX correspondem à interface JMX. Isto pode ser realizado com o uso das macros {HOST.*} como feito no endpoint JMX padrão.
Este campo é suportado desde o 3.4.0. Macros {HOST.*} e macros de usuário são suportadas.
Nome de usuário Especifique o nome de usuário, se você tiver configurado autenticação em sua aplicação Java.
Macros de usuário são suportadas.
Senha Informe a senha, se você tiver configurado autenticação em sua aplicação Java.
Macros de usuário são suportadas.

Se você deseja monitorar um contador booleano que é ou "verdadeiro" ou "falso", então você deve informar o tipo de informação como "Numérico (unsigned)" e utilizar a etapa de pré-processamento "Booleano para decimal" na aba de pré-processamento. O Zabbix Server armazenará os valores Booleanos como 1 ou 0, respectivamente.

Chaves de item JMX em mais detalhes

Atributos simples

Um nome de objeto MBean é nada senão uma string que você define em sua aplicação Java. Um nome de atributo, por outro lado, pode ser mais complexo. No caso de o atributo retornar um tipo de dado primitivo (um inteiro, uma string, etc.) não há nada com o que se preocupar, a chave se parecerá com esta:

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

Neste exemplo temos um nome de objeto "com.example:Type=Hello", o nome de atributo é "weight" e provavelmente o tipo de valor retornado deve ser "Numérico (float)".

Atributos retornando dados compostos

Se torna mais complicado quando seu atributo retorna dado composto. Por exemplo: seu nome de atributo é "laranja" e ele retorna um hash representando seus parâmetros, como "peso", "cor", etc. Sua chave pode se parecer como esta:

jmx[com.example:Type=Hello,laranja.peso]

Assim é como um nome de atributo e uma chave hash são separados, usando um símbolo de ponto. Da mesma forma, se um atributo retorna dados compostos aninhados as partes são separadas por um ponto:

jmx[com.example:Type=Hello,frutas.laranja.peso]
Atributos retornando dado tabular

Atributos de dado tabular consistem de um ou múltiplos atributos compostos. Se tal atributo é especificado no parâmetro de nome de atributo então este valor de item retornará a estrutura completa do atributo em formato JSON. Os valores de elemento individuais dentro do atributo de dado tabular podem ser recuperados usando pré-processamento.

Exemplo de atributo de dado tabular:

 jmx[com.example:type=Hello,comidainfo]

Valor do item:

[
         {
           "a": "laranja",
           "b": "banana",
           "c": "cereja"
         },
         {
           "a": "batata",
           "b": "alface",
           "c": "cebola"
         }
       ]
Problemas com pontos

Até aqui tudo bem. Mas e se um nome de atributo ou uma chave hash contiver um símbolo de ponto? Aqui temos um exemplo:

jmx[com.example:Type=Hello,todas.frutas.laranja.peso]

Isto é um problema. Como informar ao Zabbix que o nome de atributo é "todas.frutas", não apenas "todas"? Como distinguir um ponto que é parte do nome de um ponto que separa um nome de atributo e chaves hash?

Antes da 2.0.4 o Zabbix Java Gateway era incapaz de lidar com tais situações e os usuários ficavam com itens NÃO SUPORTADOS. Desde a versão 2.0.4 isto é possível, e tudo o que você precisa fazer é escapar os pontos que fazem parte do nome com uma contrabarra:

jmx[com.example:Type=Hello,todas\.frutas.laranja.peso]

Da mesma forma, se sua chave hash contém um ponto escape-o:

jmx[com.example:Type=Hello,todas\.frutas.laranja.peso\.total]
Outros problemas

Um caracter de contrabarra em um nome de atributo deve ser escapado:

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

Para lidar com quaisquer outros caracteres especiais em uma chave de item JMX, por favor consulte a seção de formato de chave de item.

Isto é na verdade tudo o que temos. Feliz monitoramento JMX!

Tipos de dados não-primitivos

Desde o Zabbix 4.0.0 é possível trabalhar com MBeans personalizados retornando tipos de dados não-primitivos, o que sobrescreve o método toString().

Usando endpoint customizado com JBoss EAP 6.4

Endpoints customizados permitem trabalhar com diferentes protocolos de transporte que não o RMI padrão.

Para ilustrar esta possibilidade, vamos tentar configurar o monitoramento de um JBoss EAP 6.4 como exemplo. Primeiro, vamos supor algumas coisas:

  • Você já tem o Zabbix Java Gateway instalado. Se não, então você pode fazê-lo de acordo com a documentação.
  • O Zabbix Server e Java Gateway estão instalados com o prefixo /usr/local/
  • O JBoss já está instalado em /opt/jboss-eap-6.4/ e em execução no modo standalone
  • Devemos assumir que todos estes componentes estão operando no mesmo host
  • Firewall e SELinux estão desabilitados (ou configurados de acordo)

Vamos fazer algumas configurações simples no zabbix_server.conf:

JavaGateway=127.0.0.1
       StartJavaPollers=5

E no arquivo de configuração zabbix_java/settings.sh (ou zabbix_java_gateway.conf):

START_POLLERS=5

Garanta que o JBoss ouve sua porta de gerenciamento padrão:

$ netstat -natp | grep 9999
       tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      10148/java

Agora vamos criar um host com interface JMX 127.0.0.1:9999 no Zabbix.

Como sabemos que esta versão do JBoss usa o protocolo JBoss Remoting em vez do RMI, nós podemos atualizar em massa o parâmetro de endpoint JMX para os itens em nosso modelo JMX de acordo:

service:jmx:remoting-jmx://{HOST.CONN}:{HOST.PORT}

Vamos atualizar o cache de configuração:

$ /usr/local/sbin/zabbix_server -R config_cache_reload

Note que você pode encontrar um erro primeiro.

"Protocolo não suportado: remoting-jmx (Unsupported protocol: remoting-jmx)" significa que o Java Gateway não sabe como trabalhar com o protocolo especificado. Isso pode ser resolvido com a criação de um arquivo ~/modulos_necessarios.txt com o seguinte conteúdo:

jboss-as-remoting
       jboss-logging
       jboss-logmanager
       jboss-marshalling
       jboss-remoting
       jboss-sasl
       jcl-over-slf4j
       jul-to-slf4j-stub
       log4j-jboss-logmanager
       remoting-jmx
       slf4j-api
       xnio-api
       xnio-nio</pre>

e então executando o comando:

$ for i in $(cat ~/modulos_necessarios.txt); do find /opt/jboss-eap-6.4 -iname ${i}*.jar -exec cp {} /usr/local/sbin/zabbix_java/lib/ \; ; done

Assim, o Java Gateway terá todos os módulos necessários para trabalhar com jmx-remoting. O que nos resta é reiniciar o Java Gateway, aguardar uns instantes e se você fez tudo certo, ver os dados de monitoramento JMX começando a chegar no Zabbix (veja também: Último dados).