Pular para o conteúdo principal

Monitorando servidor JBoss no ZABBIX

Neste post, explicarei como utilizar a interface JMX nativa do ZABBIX para monitorar o desempenho do servidor de aplicações JBoss.

Muitos administradores de sistemas devem atentar-se sobre a saúde do sistema operacional. Mas será que todos os administradores tem ferramentas unificadas para monitorar as particularidades de alguns serviços ou aplicativos?

No caso de servidores de aplicações Java como o JBoss, você pode monitorar a utilização de recursos pela ferramenta JConsole, disponível no pacote JDK do Java, ou utilizar ferramentas de linha de comando como o Twiddle.



As aplicações Java, além de utilizarem recursos do sistema operacional, também consomem recursos da JVM (Máquina Virtual Java) para disponibilizar acesso aos seus aplicativos, fazer conexão à banco de dados etc. Por isso, é altamente recomendado que se monitore os serviços e aplicativos Java. Por exemplo: uma aplicação pode estar travando ou mesmo deixando de iniciar por falta de memória na JVM, apesar de ter memória livre no sistema operacional.

A utilização do JConsole é, até certo ponto, aceitável de utilizar. Porém, integrando este tipo de monitoramento com o ZABBIX, você poderá criar triggers e ações de acordo com os problemas que poderão surgir com seu servidor e/ou aplicativos e  enviar alertas. Com a ajuda de gráficos também é possível verificar algum ponto de gargalo. Já no JConsole, isso só é possível gravando os dados em um relatório, pois o monitoramento é feito sem armazenar os dados coletados. A meu ver, uma desvantagem em relação ao que o ZABBIX oferece.

Parte prática desse monitoramento

Vale lembrar que o monitoramento JMX nativo do ZABBIX só está disponível a partir da versão 2.0.

Recompile o source do ZABBIX com o seguinte comando.
# ./configure --prefix=/opt/zabbix --enable-server --enable-agent --enable-java --with-mysql --with-libcurl --with-net-snmp --with-ssh2
No final da compilação, uma parte da saída terá o seguinte conteúdo:
  Enable Java gateway:   yes
  Java gateway details:
    Java compiler:         javac
    Java archiver:         jar
Execute make install para concluir a instalação

Para saber se monitoramento JMX foi ativado, verifique se o diretório $PATH_ZABBIX/sbin/zabbix_java/ foi criado na instalação. Se afirmativo, seu conteúdo pode ser verificado com o seguinte comando.
# tree zabbix_java/
zabbix_java/
|-- bin
|   `-- zabbix-java-gateway-2.0.1.jar
|-- lib
|   |-- logback-classic-0.9.27.jar
|   |-- logback-console.xml
|   |-- logback-core-0.9.27.jar
|   |-- logback.xml
|   |-- org-json-2010-12-28.jar
|   `-- slf4j-api-1.6.1.jar
|-- settings.sh
|-- shutdown.sh
`-- startup.sh
Os desenvolvedores do ZABBIX introduziram um deamon chamado "Zabbix Java Gataway". O código deste deamon, logicamente, foi escrito em Java e seu funcionamento é bem simples. Quando o servidor ZABBIX quer saber o valor de um conector JMX, ele faz a requisição ao Zabbix Java Gateway que fica responsável por interagir com a aplicação, através de uma API de gerenciamento JMX. Por esse motivo, só é possível fazer este tipo de monitoramento no modo passivo.

Para que o monitoramento JMX funcione, o serviço do Zabbix Java Gateway tem que estar em execução
Execute startup.sh encontrado no diretório $PATH_ZABBIX/sbin/zabbix_java/
Para saber se o serviço está em execução, pode ser verificado por dois comandos:
# ps -ef | grep logback
ou
# nmap -p 10052 <ip_servidor>
Dica: crie um serviço para rodar os scripts startup.sh e shutdown.sh.

Agora, no arquivo zabbix_server.conf, configure os seguintes parâmetros:
JavaGateway=<ip_servidor_zabbix>
JavaGatewayPort=10052
StartJavaPollers=5
Depois de gravar o arquivo, reinicie o serviço do ZABBIX. Pronto.

Para que tudo o que configuramos funcione de fato, é imprescindível iniciar o serviço do JBoss com os seguintes parâmetros:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Para isso, edite o arquivo $PATH_JBOSS/bin/run.conf e acrescente as linhas abaixo no final do arquivo:
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
Reinicie o serviço do JBoss.

Agora sim, o servidor ZABBIX já pode interagir com o Zabbix Java Gateway. Este irá coletar as informações do JBoss que forem solicitadas, conforme os itens cadastrados.

Falta agora a cereja do bolo, que é a configuração no frontend. Vamos criar um item para demonstrar tudo o que foi explicado.

Configurando o host a ser monitorado

Abra a configuração do host que deseja fazer o monitoramento do JBoss e insira o IP do servidor e a porta 12345, que foi configurada no arquivo run.conf do JBoss.

Habilitando a interface JMX no host


Configurando item a ser monitorado

Crie um item com os seguintes valores:
Nome = Memória Heap usada
Tipo = JMX Agent
Chave = jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
Sensor IPMI = Ambient Temp
Tipo de informação = Numérico (unsigned)
Unidades = B
Verificando os itens coletados

Acesse a aba Monitoramento >> Dados recentes e você já estará vendo a coleta em funcionamento.

Dados coletados recentemente

Alguns gráficos de exemplo



Mais detalhes sobre quais os itens podem ser coletados via JMX, acessar os links abaixo:

http://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html
http://docs.oracle.com/javase/1.5.0/docs/guide/management/overview.html

Nestes links, você encontra o que pode ser monitorado. O ideal é entender o que deve ser monitorado. No ZABBIX 2.0 já tem uma template pronta com alguns exemplos úteis para utilização, inclusive com gráficos. No menu Configuração >> Templates, procure por Template JMX Generic.

Essa template pode ser utilizada para qualquer Servidor de Aplicação Java, tais como Web Logic, WebSphere, GlassFish entre outros.

É isso pessoal, dúvidas e/ou sugestões é só enviar um e-mail ou postar um comentário.

Comentários

  1. Bom dia!
    Cara, de todo jeito que fiz, dá a mensagem de erro: java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
    java.net.ConnectException: Conexão recusada.
    Eu configuro o IP do servidor JBoss a ser monitorado, porém ele tá pegando o loopback, nao sei porque, tem alguma ideia?
    Obrigado

    ResponderExcluir
  2. Passa o comando que você executa o JBoss.

    ResponderExcluir
  3. Olá Janssen

    Muito util este tutorial, agora estou monitorando todos os servidores Jboss versão 4.x e 5.x aqui da empresa.

    Gostaria de saber se já precisou habilitar o monitoramento JMX na versão 7.x do Jboss. Pergunto porque tentei aplicar esse mesmo procedimento e não deu certo, ao iniciar o serviço do Jboss ele apresenta uma exception e aborta a execução.

    Identifiquei nos foruns do zabbix e do Jboss que devido por questões de segurança, o jmx_remote foi desabilitado na versão 7 do Jboss e isto impede o acesso via rede, somente funciona consultas executadas localmente.

    Por acaso você conhece outra forma de monitorar esta versão do Jboss ou mais recentes?

    Obrigado
    Diego

    ResponderExcluir
    Respostas
    1. Olá Diego.

      Obrigado pelo comentário. Fico feliz que meu post tenha te ajudado.
      Sobre o monitoramento da versão 7.x do JBoss, eu ainda não testei devido a não ter sistema para usar essa versão. Agora surgiu essa demanda e eu terei como testar. Avançando com esse monitoramento eu faço um novo post.

      Excluir
  4. Olá Janssen,

    Eu realizei todas as configurações solicitadas com êxito. Porém o item configurado não recebe nenhuma informação do servidor de Destino... A versão do Jboss está certa do Zabbix também , porém há dois problemas quando eu retiro o template e coloco o Jmx Template Generic ele não consegue conectar ... Ele só consegue coletar dados com o Template OS Linux

    ResponderExcluir
    Respostas
    1. Verifique se o JavaGateway está em execução. Se você seguiu o post, a porta 10052 deve estar aberta. A princípio, o problema pode ser este.

      Excluir
  5. Quando eu verifico execução do JavaGateway a principio ele está sendo executado conforme tela abaixo:

    root 3438 0.0 0.6 1209460 25648 ? Sl Sep11 2:52 java -server -classpath lib:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/org-json-2010-12-28.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-2.0.0.jar -Dzabbix.pidFile=/tmp/zabbix_java.pid com.zabbix.gateway.JavaGatewa
    root 17266 0.0 0.0 3312 792 pts/1 S+ 08:43 0:00 grep zabbix_java

    Eu incluo somente aquele item conforme orientação, ou posso colocar o template JMX Generic?

    Desde já muito Obrigado Janssen pela atenção e pelo apoio Grande Abraço

    ResponderExcluir
    Respostas
    1. Pode colocar a template sim.
      Qual a versão do JBoss e do Java que você está utilizando?

      Excluir
    2. Vou te explicar como eu Instalei.... o JavaGateWay está instalado no servidor Zabbix. Já no servidor Jboss (Um outro servidor) eu apenas lancei os parâmetros no run.conf e Reiniciei. Eu preciso fazer mais alguma configuração na maquina de destino além e configurar o run.conf do JBOSS?

      Excluir
    3. Você consegue acessar a console JMX do seu servidor JBoss de outro servidor, por exemplo, do servidor do Zabbix?
      Verifique se tem firewall bloqueando a comunicação ou até mesmo se o SELinux está ativado. Se você não desativar o SELinux, vai precisar criar uma regrar para liberar essa comunicação.
      Verifica isso primeiro, e se continuar o problema me avise.

      Excluir
  6. Parabéns pelo post Janssen.

    Você sabe me dizer como configuro alertas para um item específico, por exemplo Perm Gen?

    ResponderExcluir
    Respostas
    1. Olá Natália.

      Agradeço por ter gostado.

      Sobre criar alertas, basta você criar uma trigger e especificar o item desejado. Você pode usar a função "last" para usar o limite que você deseja ativar o alerta, como por exemplo: 80%.

      Excluir
  7. parabéns pelo por Janssen.
    VOcê sabe me dizer como faço pra configurar alertas para determinado item, quando ele atinge certo valor?

    por exemplo, quero enviar um email quando o perm gen atingir 80% do uso de memória.

    ResponderExcluir
    Respostas
    1. Natália, se ainda tiver dúvidas, podemos discutir isso no fórum http://zabbixoverflow.com

      Abraços.

      Excluir
  8. Esse tutorial funciona no jboss 4.0?

    ResponderExcluir
    Respostas
    1. Nunca testei nessa versão.
      Teste e informe se deu certo. Se ocorrer erro, eu te ajudo.

      Excluir
  9. Boa tarde Janssen. Parabéns pelo tutorial, muio bom.
    Gostaria de saber se você já implementou o monitoramento via JMX em WebSphere?

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Integração Zabbix + GLPI

Versão atualizada Essa atualização é em consequência de pedidos vindo dos gringos e também a pedido da Zabbix SIA por ser o 4.º conteúdo mais popular no recém criado  https://share.zabbix.com/  e o 1.º entre os brasileiros.   Para conferir a lista dos mais populares, acesse  https://share.zabbix.com/popular Há um tempo que eu queria desenvolver algo para integrar o Zabbix a algum outro sistema. Esse ano surgiu uma oportunidade de implementação de alguns sistemas de inventário e gerenciamento de chamados. Logo pensei em fazer uma integração para abertura e fechamento automático dos tickets quando ocorresse algum problema que o Zabbix identificasse. Porém, o meu entusiasmo foi logo caindo quando eu percebi que não era uma coisa tão trivial de se fazer. Pesquisei várias fontes em busca de informações a respeito dessa integração, porém não passavam de tutoriais ensinando como abrir tickets no GLPI enviando um e-mail. Estudando mais um pouco o GLPI, percebi que não era possível

Primeiros passos com API do Zabbix

Bom galera, Faz tempo que não posto nada sobre Zabbix. Então, quis presentear vocês com um conteúdo mais avançado. Espero que ao menos 1 vez por mês coloco mais assuntos como esse no blog. Vou mostrar para vocês como utilizar a API do Zabbix. Antes vou explicar de forma básica o que API para os que não sabem do que se trata. Programadores tem a obrigação de saber.  :P - API  - Application Programming Interface  - é um conjunto de rotinas e padrões estabelecidos por um software. Isso permite que aplicações de terceiros utilizem as funcionalidades oferecidas pelo software.

Usando LSOF para verificar porta usada por determinado processo

Outro dia fui realizar alguns testes em aplicações rodando no JBoss e verifiquei que nenhuma aplicação estava funcionando. Verifiquei no log do JBoss que o serviço iniciava e ocorria vários erros, informando que não conseguia fazer o deploy das aplicações. Mesmo parando o serviço do JBoss, verifiquei com a ferramenta nmap que a porta 8080 continuava aberta.