Descubra como monitorar sua JVM com Prometheus e Grafana
Saiba o que ocorre com a sua JVM!
O monitoramento e a visibilidade do ambiente de TI sempre foram de grande importância para seus gestores e administradores, seja para avaliação de performance, correção de falhas e principalmente para evitar que os problemas venham de fato a ocorrer. Atualmente ferramentas open source como o Prometheus podem coletar métricas tanto de máquinas, como de serviços para nos auxiliar nessas questões e o Grafana pode nos ajuda a ter uma visibilidade mais analítica dessas métricas com a criação de dashboards e gráficos intuitivos.
Porém sempre foi um desafio muito grande realizar o monitoramento de uma JVM (Java Virtual Machine). Neste post veremos como realizar a coleta de métricas de uma JVM Wildfly com Prometheus e Grafana utilizando um exporter do Prometheus.
As novas versões de Wildfly (a partir da 15), já possuem um subsystem que gera uma página de métricas e que pode ser acessada normalmente pelo browser, assim não se faz necessário a utilização do exporter do Prometheus. Para nosso laboratório iremos demonstrar justamente como realizar a coleta em versões anteriores a 15, pois estas não possuem o subsystem e são um desafio e tanto para qualquer SysAdmin obter métricas e visibilidade da JVM.
Pré-requisitos:
- Utilizar um SO Linux
- GIT (https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
- Docker e Docker Compose (https://docs.docker.com/install/linux/docker-ce/ubuntu/ | https://docs.docker.com/compose/install/)
- Wildfly 14 ou anterior (https://wildfly.org/downloads/)
Download do Projeto
Todos os arquivos necessários para a execução do nosso laboratório estão em um repositório do GitHub, assim, com o git instalado em sua máquina, escolha um diretório para ser o seu workspace e realize o clone do projeto com o seguinte comando:
git clone https://github.com/CaeirOps/wildfly-exporter.git
Habilitando as Métricas
Após o clone do repositório iremos então começar a configurar nosso Wildfly para exportar as métricas que serão coletadas pelo Prometheus. O exporter que iremos utilizar é mantido pela comunidade e pode ser encontrado no repositório “https://github.com/nlighten/wildfly_exporter“. Para iniciar a configuração iremos executar os seguintes passos:
- Copie o arquivo ‘wildfly_exporter_module-0.0.5.jar’, que foi baixado do repositório, no diretório “$JBOSS_HOME/modules/” da sua instância do Wildfly. A variável $JBOSS_HOME indica o diretório do seu Wildfly, para realizar a cópia coloque o caminho relativo ou absoluto no comando da cópia, ex:
cp wildfly-exporter/wildfly_exporter_module-0.0.5.jar /opt/wildfly/modules/
- Acesse o diretório “$JBOSS_HOME/modules/” e extraia o arquivo JAR com o comando:
jar -xvf wildfly_exporter_module-0.0.5.jar
- Após extrair os arquivos, vamos deletar os seguintes itens que não serão utilizados:
rm -rf META-INF ; rm -f wildfly_exporter_module-0.0.5.jar
- Agora precisamos adicionar os seguintes parâmetros no arquivo de configuração xml utilizado, por exemplo, no modo standalone com perfil default altere o arquivo de configuração em “JBOSS_HOME/standalone/configuration/standalone.xml”, adicionando os seguintes parâmetros:
Este parâmetro irá definir que o módulo que extraímos anteriormente seja carregado e deve estar dentro da chave ‘subsystem xmlns=”urn:jboss:domain:ee:4.0’, provavelmente você não terá em sua configuração a chave “global-modules” então será necessário inserir como no exemplo:
(linha do arquivo: 167)
<subsystem xmlns="urn:jboss:domain:ee:4.0">
<global-modules>
<module name="nl.nlighten.prometheus.wildfly" services="true" meta-inf="true"/>
</global-modules>
Este parâmetro servirá para habilitarmos as estatísticas em nosso subsystem undertow, provavelmente você irá encontrar esses parâmetros todos configurados, adicione então somente o “ statistics-enabled=“true” ” como no exemplo:
(linha do arquivo: 465)
<subsystem xmlns="urn:jboss:domain:undertow:7.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other" statistics-enabled="true">
Aqui é uma situação muito parecida com a anterior, estes parâmetros já estarão configurados no arquivo, adicione somente o “statistics-enabled=“true””, e caso você tenha mais de um data-source será necessário adicionar em todos eles, ou apenas nos que você deseja coletar métricas:
(linha do arquivo: 148)
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true" statistics-enabled="true">
- Feito isso, precisamos agora realizar o deploy de nossa aplicação que irá disponibilizar as métricas para o Prometheus. Copie o arquivo “metrics.war” do repositório para o diretório “JBOSS_HOME/standlone/deployments/”, como no exemplo:
cp wildfly-exporter/metrics.war /opt/wildfly/standalone/deployments/
- Realize o start da sua instância, importante lembrar que deve ser feito o bind da JVM para uma interface que possa receber conexão do Prometheus depois, pode-se utilizar a opção “-b” na inicialização para informar a interface. Após isso a página “métrics” já deve estar acessível para a visualização das métricas geradas da JVM:
Exemplo de inicialização com o processo da JVM em listening em qualquer interface e executando em background:
/opt/wildfly/bin/standalone.sh -b 0.0.0.0 -c standalone.xml > /dev/null 2>&1 &

Prometheus + Grafana + Docker
Para provisionar nossos servidores Prometheus e Grafana de forma simples e ágil, iremos utilizar containers Docker. Partimos do ponto que você já possua Docker e Docker Compose instalados na sua máquina. O arquivo compose que será utilizado também foi baixado do repositório anteriormente com o git clone, atente-se que a versão do compose file é 3.3 assim é necessário uma engine atualizada do Docker e do Compose. As imagens utilizadas são as oficiais do Docker Hub.
Para iniciarmos nossos serviços devemos seguir os passos:
- Dentro do diretório do repositório, edite o arquivo “./configs/prometheus.yml” adicionando os endereços IPs:Portas das instâncias como no exemplo:
- job_name: 'wildfly-exporter'
metrics_path: /metrics
static_configs:
- targets:
- 192.168.0.50:8080
- Executar os comandos:
docker swarm init ; docker-compose up -d
(O PROMETHEUS USARÁ A PORTA 9090 E O GRAFANA A PORTA 3000, PODE SER ALTERADO NO ARQUIVO DO COMPOSE)
Após isso já podemos acessar o nosso Prometheus e verificar na opção de “Status>Targets” a conexão com a nossa JVM:

Agora é a hora de acessarmos o Grafana para configurar os dashboards. O usuário e senha definidos para o Grafana estão no compose file e são respectivamente “admin/password”. Após o login na primeira tela selecione a opção “Datasource”:

Após isso será aberto uma tela para escolher qual será a fonte de dados que alimentará os nossos dashboards, assim podemos escolher o Prometheus:

Na tela seguinte configure a url de acesso como a da imagem, isso fará com que o container do Grafana se conecte através dessa URL no container do Prometheus para ler os dados, salve e teste no final da página:

Ao lado esquerdo da tela terá um ícone de soma, ali poderemos adicionar o nosso dashboard:

Após clicar em dashboard nos será dado a opção de “New Dashboard”, clique nessa opção e logo em seguida do lado direito clique em “Import Dashboard”:

Nesta tela veremos a opção de importar um template JSON, clique nessa opção e selecione o arquivo “wildfly_stats.json” que foi baixado do repositório:

Ajuste as opções como a da imagem e finalize a importação:

Após isso já poderemos visualizar as métricas coletadas através de gráficos no Grafana.

Esta foi apenas uma pequena demonstração sobre o monitoramento de nossas queridas JVMs, pode ser feito muito mais e iremos explorar isso nos próximos posts, fique ligado! Também como foi dito no início as novas versões de Wildfly já vem com o subsystem de métricas embarcado, não sendo necessário o deploy da app “metrics”, sinta-se à vontade para utilizar esses containers para testar também.
Até a próxima!
Líder em Treinamento e serviços de Consultoria, Suporte e Implantação para o mundo open source. Conheça nossas soluções:
About author
Você pode gostar também
Criando um Pendrive Bootável com Múltiplas ISOs no Linux
Criar um pendrive bootável no Linux, não é nada muito complexo, mas para algumas pessoas nem sempre é um processo tão simples quanto desejado. No entanto, com a ferramenta certa,
Primeiros passos com OpenStack: Como criar um ambiente de testes
Sempre que falamos sobre “primeiros passos” em alguma tecnologia, realizamos algum pequeno teste como um “Hello World” em uma linguagem ou um pequeno blog quando estamos estudando um framework web
Entenda a interação entre MySQL e o cache de sistema de arquivos do Linux
Neste post veremos a interação entre o MySQL e o cache de sistema de arquivos do Linux, principalmente a respeito da configuração do buffer pool do InnoDB. Utilizamos o MySQL







