{"id":3169,"date":"2020-12-06T22:14:03","date_gmt":"2020-12-07T01:14:03","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=3169"},"modified":"2020-12-06T22:14:05","modified_gmt":"2020-12-07T01:14:05","slug":"monitorando-e-gerenciando-sua-aplicacao-java-com-jmx","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=3169","title":{"rendered":"Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX"},"content":{"rendered":"\n<p>Meu objetivo era escrever sobre o <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/production-ready-features.html\">Actuator<\/a> do Spring Boot, mas enquanto o escrevia lembrei algo importante: boa parte dos desenvolvedores Java n\u00e3o sabem que tem uma ferramenta maravilhosa para monitorar e gerenciar suas aplica\u00e7\u00f5es remotamente e que j\u00e1 v\u00eam de &#8220;brinde&#8221; com a JVM: o JMX. Com ele voc\u00ea pode:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Acompanhar qualquer aspecto relativo ao ambiente de execu\u00e7\u00e3o do seu projeto (incluindo o estado da sua aplica\u00e7\u00e3o).<\/li><li>Executar a\u00e7\u00f5es remotas em seu c\u00f3digo: pense em coisas como limpar o cache, remover arquivos tempor\u00e1rios, executar alguma a\u00e7\u00e3o, enfim, <strong>qualquer coisa<\/strong>.<\/li><li>Disparar notifica\u00e7\u00f5es para outros m\u00f3dulos da sua plataforma, o que possibilita a constru\u00e7\u00e3o de uma estrat\u00e9gia de manuten\u00e7\u00e3o e monitoramento pr\u00f3-ativa.<\/li><\/ul>\n\n\n\n<p>E tudo isto com recursos que voc\u00ea j\u00e1 tem a\u00ed na sua aplica\u00e7\u00e3o Java, sem precisar instalar qualquer biblioteca ou framework. S\u00f3 precisa saber Java (ou qualquer outra linguagem que gere bytecode e interaja com a JVM, como Groovy, Scala, Clojure, JavaScript&#8230;).<\/p>\n\n\n\n<p><strong>JMX \u00e9 uma ferramenta poderos\u00edssima que deve estar no cinto de utilidades de qualquer pessoa que desenvolva aplica\u00e7\u00f5es Java.<\/strong><\/p>\n\n\n\n<p>Meu objetivo \u00e9 apresentar as funcionalidades que a tecnologia oferece e lhe dar a base para que possa se aprofundar no assunto. N\u00e3o se preocupe: incluirei alguns links que v\u00e3o te ajudar a se aprofundar no decorrer do texto.<\/p>\n\n\n\n<p>Naturalmente, come\u00e7aremos pelo <strong>conceitual<\/strong> e, mais \u00e0 frente, veremos como aplicar na pr\u00e1tica esta tecnologia.<\/p>\n\n\n\n<figure class=\"wp-block-image is-style-default\"><img decoding=\"async\" src=\"https:\/\/canalcienciascriminais.com.br\/wp-content\/uploads\/2019\/03\/socrates.png\" alt=\"S\u00f3crates pergunta: o que \u00e9 o JMX?\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">O que \u00e9 JMX?<\/h1>\n\n\n\n<p>Antes de descrever o que \u00e9 JMX \u00e9 importante fazer <strong>outra<\/strong> pergunta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Que problemas JMX resolve?<\/h2>\n\n\n\n<p>Ap\u00f3s terminar seu c\u00f3digo segue o pr\u00f3ximo passo: a implanta\u00e7\u00e3o. Para uma mentalidade ing\u00eanua a hist\u00f3ria acabaria a\u00ed, mas eu e voc\u00ea sabemos que esta n\u00e3o \u00e9 a verdade, longe disto! Uma vez implantada a sua aplica\u00e7\u00e3o voc\u00ea precisa monitor\u00e1-la e gerenci\u00e1-la. Monitorar, o que \u00e9 isto? E gerenciar?<\/p>\n\n\n\n<p><strong>Monitorar \u00e9 vigiar<\/strong>: acompanhar a qualidade de servi\u00e7o da aplica\u00e7\u00e3o que voc\u00ea implantou. Como est\u00e1 o consumo de mem\u00f3ria e CPU? Quantas transa\u00e7\u00f5es foram realizadas com sucesso ou erro em um per\u00edodo pr\u00e9-determinado? Quantos usu\u00e1rios est\u00e3o autenticados? Quantas requisi\u00e7\u00f5es est\u00e3o em execu\u00e7\u00e3o neste momento?<\/p>\n\n\n\n<p><strong>Gerenciar \u00e9 interagir:<\/strong> voc\u00ea precisa executar algumas a\u00e7\u00f5es esporadicamente, tais como limpar caches, liberar espa\u00e7o em disco, finalizar processos, iniciar a\u00e7\u00f5es de manuten\u00e7\u00e3o, alterar configura\u00e7\u00f5es, etc. <\/p>\n\n\n\n<p>Se voc\u00ea est\u00e1 diante da m\u00e1quina em que sua aplica\u00e7\u00e3o est\u00e1 em execu\u00e7\u00e3o estas a\u00e7\u00f5es s\u00e3o relativamente simples. Basta ir a este equipamento e executar o seu trabalho, se for remoto, tamb\u00e9m \u00e9 tranquilo, usa-se algum protocolo de comunica\u00e7\u00e3o como o SSH e t\u00e1 tranquilo. Mas e se voc\u00ea precisar, durante a opera\u00e7\u00e3o, reiniciar sua aplica\u00e7\u00e3o e, com isto, penitenciar seus usu\u00e1rios com o sistema fora do ar? Ser\u00e1 que \u00e9 poss\u00edvel executar estas a\u00e7\u00f5es <strong>sem parar a aplica\u00e7\u00e3o?<\/strong> Yeap: e JMX \u00e9 uma solu\u00e7\u00e3o para estes problemas.<\/p>\n\n\n\n<p>Mas h\u00e1 mais uma situa\u00e7\u00e3o: e se voc\u00ea pudesse ser alertado de que problemas est\u00e3o prestes a ocorrer? Por exemplo: e se voc\u00ea pudesse receber alertas lhe informando que o n\u00famero de requisi\u00e7\u00f5es aumentou repentinamente ou que o espa\u00e7o em disco est\u00e1 prestes a esgotar? <\/p>\n\n\n\n<p>JMX resolve este problema tamb\u00e9m a partir do disparo de eventos, o que permite a ado\u00e7\u00e3o de <strong>estrat\u00e9gias pr\u00f3-ativas de manuten\u00e7\u00e3o<\/strong>.<\/p>\n\n\n\n<p>Resumindo, os principais problemas resolvidos pelo JMX s\u00e3o:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Oferecer uma ferramenta de monitoramento remoto (ou local) de aplica\u00e7\u00f5es.<\/li><li>Possibilitar a ado\u00e7\u00e3o de estrat\u00e9gias de manuten\u00e7\u00e3o pr\u00f3-ativas. <\/li><li>Possibilita a gest\u00e3o remota de sistemas feitos em Java.<\/li><\/ul>\n\n\n\n<p>Naturalmente voc\u00ea pode pensar em outros usos criativos pra tecnologia ap\u00f3s ler este post, prossigamos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Finalmente, o que \u00e9 JMX?<\/h2>\n\n\n\n<p>A sigla JMX significa (Java Management E<strong>x<\/strong>tensions): \u00e9 o framework (n\u00e3o biblioteca, quer saber a defini\u00e7\u00e3o de framwork, leia <a href=\"https:\/\/devkico.itexto.com.br\/?p=2760\">este meu texto<\/a>) que fornece as estruturas para que possamos resolver os problemas que mencionei acima. <\/p>\n\n\n\n<p>\u00c9 interessante observar que estamos falando de uma tecnologia bem antiga e bastante est\u00e1vel: aparece pela primeira vez na <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=3\">JSR-3<\/a> do Java Community Process e que se tornou parte integral do Java SE a partir da sua vers\u00e3o 5. Temos portanto uma JSR com 22 anos de idade (aprovada em 1998) e 16 de aplica\u00e7\u00e3o massiva (lan\u00e7amento do Java 5 em 2004). Nada mal, o que me faz questionar por que t\u00e3o pouco usada. Este post talvez ajude a reverter a situa\u00e7\u00e3o. <br>(h\u00e1 tamb\u00e9m a JSR-160 que atualiza a especifica\u00e7\u00e3o, que voc\u00ea pode conferir <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=160\">aqui<\/a>)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Um par\u00eantese de pr\u00e1tica antes dos conceitos<\/h3>\n\n\n\n<p>Neste momento voc\u00ea pensa no JMX como uma ferramenta de monitoramento essencialmente. Acho interessante come\u00e7armos vendo-o em a\u00e7\u00e3o. Para isto vamos monitorar a aplica\u00e7\u00e3o mais simples poss\u00edvel: o c\u00f3digo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public class Chata {\n  public static void main(String args[]) {\n     System.out.println(\"Oi, eu sou chata. Digite algo e eu paro.\");\n     System.console().readLine();\n     System.out.println(\"Tchau\u2026\");\n   }\n}<\/pre>\n\n\n\n<p>Temos o c\u00f3digo Java mais tedioso que voc\u00ea pode imaginar, mas um c\u00f3digo que pode ser monitorado por JMX, veja como \u00e9 simples:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">javac Chata # compilo o programa<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">java Chata # executo o programa<\/pre>\n\n\n\n<p>E a\u00ed voc\u00ea j\u00e1 pode imaginar a empolgante sa\u00edda no console:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"493\" height=\"141\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image.png\" alt=\"Nosso empolgante programa em execu\u00e7\u00e3o\" class=\"wp-image-3175\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image.png 493w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-300x86.png 300w\" sizes=\"(max-width: 493px) 100vw, 493px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Na sequ\u00eancia executamos um programa que sempre v\u00eam com o JDK, se chama jconsole (h\u00e1 outras op\u00e7\u00f5es, mas usarei este pois \u00e9 o mais simples e que sempre est\u00e1 dispon\u00edvel): gravei um v\u00eddeo expondo seu funcionamento.<\/p>\n\n\n\n<p>Observe que seleciono o processo local que quero (Chata) e, a partir dali, conectando-me ao processo por JMX, tenho acesso a TUDO: uso de CPU, mem\u00f3ria, threads e, ao final, os managed beans, sobre os quais falaremos mais tarde.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jconsole_intro.mp4\"><\/video><\/figure>\n\n\n\n<p>Como podem ver, JMX se aplica a <strong>qualquer<\/strong> aplica\u00e7\u00e3o Java, ou seja, voc\u00ea pode aplic\u00e1-lo em seus projetos <strong>agora<\/strong> se quiser. Mas antes vamos para um passeio r\u00e1pido por um certo edif\u00edcio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Um tour por nosso edif\u00edcio conceitual<\/h2>\n\n\n\n<p>Novamente aqui h\u00e1 alguns conceitos cujo conhecimento \u00e9 essencial para que voc\u00ea possa dominar a tecnologia. Sendo assim vamos subir as escadas do nosso edif\u00edcio conceitual.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Primeiro andar: instrumenta\u00e7\u00e3o e gerenciamento<\/h3>\n\n\n\n<figure class=\"wp-block-image alignfull size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"233\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/monitoramento.jpg\" alt=\"Monitoramento\" class=\"wp-image-3174\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/monitoramento.jpg 840w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/monitoramento-300x83.jpg 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/monitoramento-768x213.jpg 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>N\u00e3o \u00e9 por acaso que escolhi este como nosso ponto de partida. 80% do que voc\u00ea precisa conhecer est\u00e1 aqui e, como ver\u00e1, s\u00e3o poucos conceitos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resource (Recurso)<\/h3>\n\n\n\n<p>Na documenta\u00e7\u00e3o oficial do JMX (<a href=\"https:\/\/www.oracle.com\/technical-resources\/articles\/javase\/jmx.html\">aqui<\/a> e <a href=\"https:\/\/docs.oracle.com\/javase\/10\/jmx\/toc.htm\">aqui<\/a>) al\u00e9m de diversos artigos da internet voc\u00ea encontrar\u00e1 este termo: &#8220;resource&#8221;, ent\u00e3o \u00e9 importante ter este conceito bem fixado em sua cabe\u00e7a. Resource \u00e9 qualquer coisa que voc\u00ea deseje monitorar, assim como os aspectos que deseja monitorar. Vamos a alguns exemplos:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>CPU &#8211; voc\u00ea quer monitorar o seu uso no momento atual ou a m\u00e9dia ao longo de determinado per\u00edodo.<\/li><li>Threads &#8211; threads no momento atual ou em determinado per\u00edodo.<\/li><li>Transa\u00e7\u00f5es &#8211; quantas transa\u00e7\u00f5es sua aplica\u00e7\u00e3o executou em um per\u00edodo ou encontram-se em execu\u00e7\u00e3o agora.<\/li><li>Alguma m\u00e9trica de neg\u00f3cio do seu projeto &#8211; exemplo: quantas vendas realizei hoje?<\/li><\/ul>\n\n\n\n<p>Resumindo: \u00e9 aquilo que voc\u00ea quer espiar e os atributos da coisa que voc\u00ea quer espiar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MBean<\/h3>\n\n\n\n<p>Aqui n\u00f3s temos o n\u00facleo do JMX: essencialmente s\u00e3o as classes que escrevemos para realizar a\u00e7\u00f5es de monitoramento e gerenciamento dos nossos sistemas. Mencionarei aqui os mais importantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Standard<\/strong> &#8211; o que veremos aqui<\/li><li><strong>MXBeans<\/strong> &#8211; referencia apenas um n\u00famero pr\u00e9-determinado de tipos, o que permite ser port\u00e1vel em, essencialmente, qualquer plataforma. \u00c9 \u00fatil, portanto, para o p\u00fablico que implementa ferramentas de monitoramento comerciais. Mais detalhes <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/jmx\/mbeans\/mxbeans.html\">aqui<\/a>.<\/li><li><strong>Dynamic<\/strong> &#8211; os demais tipos de beans possuem um n\u00famero fixo de propriedades e opera\u00e7\u00f5es, j\u00e1 os dynamic beans n\u00e3o: estes implementam interfaces que permitem crescer ou diminuir o n\u00famero de propriedades e a\u00e7\u00f5es em tempo de execu\u00e7\u00e3o, o que pode ser muito \u00fatil quando, por exemplo, precisamos monitorar listas de objetos. Mais detalhes <a href=\"https:\/\/docs.oracle.com\/cd\/E19206-01\/816-4178\/6madjde4l\/index.html\">aqui<\/a>.<\/li><\/ul>\n\n\n\n<p>Para o desenvolvedor que n\u00e3o desenvolve frameworks ou ferramentas de monitoramento de longe o MBean mais comum \u00e9 o padr\u00e3o (Standard), sobre o qual falaremos aqui. Mas antes de prosseguirmos \u00e9 importante saber o que este tipo de bean (e na realidade, todos os outros) deve oferecer:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Propriedades que exp\u00f5em dados que iremos monitorar. Estas podem ser do tipo somente leitura ou permitindo escrita.<\/li><li>Opera\u00e7\u00f5es que iremos executar pelo nosso MBean.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Seu primeiro MBean<\/h4>\n\n\n\n<p>Ent\u00e3o vamos para o nosso primeiro MBean. Para este exemplo resolvi implementar algo real: nosso MBean ir\u00e1 executar as seguintes a\u00e7\u00f5es:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Listar quantos arquivos h\u00e1 no meu diret\u00f3rio home.<\/li><li>Listar quantos diret\u00f3rios h\u00e1 no meu diret\u00f3rio home.<\/li><li>Criar um diret\u00f3rio tempor\u00e1rio na pasta home.<\/li><li>Apagar o diret\u00f3rio tempor\u00e1rio na pasta home.<\/li><\/ul>\n\n\n\n<p>Com isto voc\u00ea conseguir\u00e1 ver as duas a\u00e7\u00f5es principais que um MBean deve executar: monitorar seu sistema (quantos arquivos e diret\u00f3rios?) e tamb\u00e9m gerenciar a plataforma (criando e removendo pastas).<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Conven\u00e7\u00f5es<\/h5>\n\n\n\n<p>S\u00e3o pouqu\u00edssimas, e \u00e9 bem f\u00e1cil de seguir. Vamos a elas.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\"><strong>Interface<\/strong><br>Todo MBean deve ter uma interface que siga o seguinte padr\u00e3o: <span class=\"has-inline-color has-medium-gray-color\"><strong>[Nome do Bean]MBean.<\/strong><\/span><\/h6>\n\n\n\n<p>Nosso MBean se chamar\u00e1 Arquivos, sendo assim devemos escrever uma interface chamada ArquivosMBean, tal como no exemplo a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public interface ArquivosMBean {\n\n    long getNumArquivos();\n\n    long getNumDiretorios();\n\n    void criarDiretorioTemporario();\n\n    void removerDiretorioTemporario();\n\n}<\/pre>\n\n\n\n<p>Notou como \u00e9 apenas um padr\u00e3o de nome? Outro ponto importante: para obter ou escrever dados no MBean, siga o padr\u00e3o JavaBeans (\u00e9 iniciante e n\u00e3o sabe o que s\u00e3o JavaBeans? Segue um <a href=\"https:\/\/pt.wikipedia.org\/wiki\/JavaBeans\">link da Wikipedia<\/a>. Essencialmente s\u00e3o os getters e setters que voc\u00ea escreve).<\/p>\n\n\n\n<p>Se voc\u00ea tem opera\u00e7\u00f5es, estas podem usar nomes como os que coloquei: criarDiretorioTemporario, ou qualquer outro padr\u00e3o que deseje expor.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\"><strong>Implementa\u00e7\u00e3o<\/strong><\/h6>\n\n\n\n<p>O importante a saber \u00e9: o JMX expor\u00e1 apenas o que estiver na interface, <strong>jamais a implementa\u00e7\u00e3o ser\u00e1 exposta<\/strong>. Bom, por falar em implementa\u00e7\u00e3o, vamos ver a nossa? Segue o c\u00f3digo fonte:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public class Arquivos implements ArquivosMBean {\n\n@Override\npublic void criarDiretorioTemporario() {\n  new File(System.<em>getProperty<\/em>(\"user.home\") + \"\/temporario\").mkdirs();\n}\n\npublic void removerDiretorioTemporario() {\n   \/\/ s\u00f3 pra fins did\u00e1ticos, vai dar erro\n   \/\/ se o diret\u00f3rio estiver cheio!\n  new File(System.<em>getProperty<\/em>(\"user.home\") + \"\/temporario\").delete();\n}\n\n@Override\npublic long getNumArquivos() {\n  File diretorio = new File(System.<em>getProperty<\/em>(\"user.home\"));\n  return Arrays.<em>stream<\/em>(diretorio.listFiles()).filter(t -> t.isFile()).count();\n}\n\n@Override\npublic long getNumDiretorios() {\n  File diretorio = new File(System.<em>getProperty<\/em>(\"user.home\"));\n  return Arrays.<em>stream<\/em>(diretorio.listFiles()).filter(t -> t.isDirectory()).count();\n  }\n}<\/pre>\n\n\n\n<p>Novamente uma conven\u00e7\u00e3o. O nome da sua classe deve ser o nome da interface SEM o sufixo <strong>MBean<\/strong>. Vamos a alguns exemplos pra treinar?<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Nome da interface<\/strong><\/td><td><strong>Nome da implementa\u00e7\u00e3o<\/strong><\/td><\/tr><tr><td>ArquivosMBean<\/td><td>Arquivos<\/td><\/tr><tr><td>RedeMBean<\/td><td>Rede<\/td><\/tr><tr><td>TransacoesMBean<\/td><td>Transacoes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Segundo andar: Agents<\/h3>\n\n\n\n<figure class=\"wp-block-image alignfull size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"304\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/agents-1024x304.jpg\" alt=\"Segundo andar: Agents\" class=\"wp-image-3178\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/agents-1024x304.jpg 1024w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/agents-300x89.jpg 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/agents-768x228.jpg 768w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/agents.jpg 1030w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>No primeiro andar conhecemos o cora\u00e7\u00e3o do JMX que s\u00e3o os MBeans: agora vamos entender como estes s\u00e3o carregados e executados. Esta \u00e9 a fun\u00e7\u00e3o do <a href=\"https:\/\/docs.oracle.com\/javase\/10\/jmx\/using-jmx-agents.htm\">MBean Server<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">MBean Server<\/h4>\n\n\n\n<p>Se voc\u00ea j\u00e1 usou o Spring, pense no MBean Server como se fosse um container respons\u00e1vel por ter registrados todos os MBeans do seu projeto. Inicialmente seu uso \u00e9 para disponibiliza\u00e7\u00e3o local dos mesmos. E seu uso \u00e9 bastante simples, apesar de requerer alguns detalhes que vamos expor aqui.<\/p>\n\n\n\n<p>Vamos come\u00e7ar registrando o MBean que implementamos no primeiro andar. Observe o c\u00f3digo a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import javax.management.*;\nimport java.lang.management.ManagementFactory;\n\ntry {\n  \n  MBeanServer server = ManagementFactory.<em>getPlatformMBeanServer<\/em>();\n  ObjectName name = new ObjectName(\"br.com.itexto:type=basic,name=arquivos\");\n  server.registerMBean(new Arquivos(), name);\n} catch (MalformedObjectNameException | \n         InstanceAlreadyExistsException |\n         MBeanRegistrationException | \n         NotCompliantMBeanException e) {\n   \/\/ fins did\u00e1ticos, fa\u00e7a melhor que isto aqui embaixo\n   e.printStackTrace();\n}<\/pre>\n\n\n\n<p>O primeiro passo \u00e9 a obten\u00e7\u00e3o do MBeanServer, o que \u00e9 feito chamando o m\u00e9todo getPlatformMBeanServer() da classe ManagementFactory. Obtido o servidor, o pr\u00f3ximo passo consiste em darmos um nome ao nosso MBean, muita aten\u00e7\u00e3o ao objeto do tipo ObjectName (<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/javax\/management\/ObjectName.html\">javadoc<\/a> pra maiores detalhes).<\/p>\n\n\n\n<p>Todo MBean deve ter um nome \u00fanico no MBeanServer, e isto \u00e9 feito atrav\u00e9s da classe <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/javax\/management\/ObjectName.html\">ObjectName<\/a>. H\u00e1 um padr\u00e3o que deve ser seguido:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[dom\u00ednio]:[propriedades no formato chave\/valor separadas por v\u00edrgula]<\/pre>\n\n\n\n<p>Dom\u00ednio \u00e9 bom que seja um nome \u00fanico para que possamos achar o seu MBean pelas ferramentas administrativas. No nosso caso, usamos &#8220;br.com.itexto&#8221;. J\u00e1 quanto \u00e0s propriedades, estas informam o grupo em que incluiremos o MBean (basic) e o nome como \u00e9 apresentado (Arquivos). Executando o jconsole novamente para monitorar a aplica\u00e7\u00e3o, vamos ver como nosso MBean aparece?<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"669\" height=\"227\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-1.png\" alt=\"\" class=\"wp-image-3179\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-1.png 669w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-1-300x102.png 300w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Finalmente, temos o registro da inst\u00e2ncia no MBean Server no trecho a seguir:<\/p>\n\n\n\n<pre id=\"block-268dd7d8-1f8b-4895-acda-700b2f657d5b\" class=\"wp-block-preformatted\">MBeanServer server = ManagementFactory.<em>getPlatformMBeanServer<\/em>();\nObjectName name = new ObjectName(\"br.com.itexto:type=basic,name=arquivos\");\n<strong>server.registerMBean(new Arquivos(), name);<\/strong><\/pre>\n\n\n\n<p>Com a aplica\u00e7\u00e3o em execu\u00e7\u00e3o, \u00e9 poss\u00edvel vermos nossos pontos de monitoramento mudando em tempo real, tal como mostro a voc\u00eas no v\u00eddeo a seguir, em que executamos algumas opera\u00e7\u00f5es e, como resultado, vemos as mudan\u00e7as nos pontos monitorados. Veja o v\u00eddeo:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jconsole_operacao.mp4\"><\/video><\/figure>\n\n\n\n<p>Voc\u00ea pode ver claramente o monitoramento em tempo real: clicando duas vezes sobre os valores monitorados (n\u00famero de arquivos e diret\u00f3rios), \u00e9 poss\u00edvel ver que s\u00e3o renderizados gr\u00e1ficos que apontam os valores medidos de segundo a segundo.<\/p>\n\n\n\n<p>Logo na sequ\u00eancia, \u00e9 poss\u00edvel ver tamb\u00e9m como n\u00f3s executamos opera\u00e7\u00f5es. Estas aparecem como bot\u00f5es na interface do jconsole. Basta clicar ali para termos nossas a\u00e7\u00f5es de gerenciamento executadas. Imagine qu\u00e3o \u00fatil \u00e9 isto em um ambiente remoto? Bem lindo, n\u00e9?<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"692\" height=\"301\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-2.png\" alt=\"Opera\u00e7\u00f5es\" class=\"wp-image-3181\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-2.png 692w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-2-300x130.png 300w\" sizes=\"(max-width: 692px) 100vw, 692px\" \/><figcaption>Como as opera\u00e7\u00f5es aparecem no jConsole<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-3.png\" alt=\"Monitoramento em tempo real\" class=\"wp-image-3182\" width=\"750\" height=\"525\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-3.png 750w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-3-300x210.png 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><figcaption>Monitorando o sistema em tempo real com JMX<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>Dica: leia este <a href=\"https:\/\/docs.oracle.com\/javase\/1.5.0\/docs\/guide\/management\/jconsole.html\">texto bem antigo<\/a> sobre o jconsole: \u00e9 uma ferramenta bem simples, mas MUITO \u00fatil.<\/p><\/blockquote><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Terceiro andar: Gerenciamento Remoto<\/h3>\n\n\n\n<figure class=\"wp-block-image alignfull size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"313\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/remote_management.jpg\" alt=\"terceiro andar: remote management\" class=\"wp-image-3184\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/remote_management.jpg 840w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/remote_management-300x112.jpg 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/remote_management-768x286.jpg 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>No terceiro andar temos toda a infraestrutura necess\u00e1ria para que possamos acessar o JMX remotamente. \u00c9 um andar muito importante para que voc\u00ea possa, inclusive, evitar s\u00e9rios problemas de seguran\u00e7a. Apenas imagine que voc\u00ea implemento uma a\u00e7\u00e3o chamada &#8220;zerar banco de dados vital&#8221;, voc\u00ea n\u00e3o quer isto exposto na rede, quer? :)<\/p>\n\n\n\n<p>Este \u00e9 um texto introdut\u00f3rio \u00e0 tecnologia e, devo confessar, quest\u00f5es relativas ao gerenciamento remoto n\u00e3o s\u00e3o minha especialidade, sendo assim tratarei aqui apenas das informa\u00e7\u00f5es essenciais que voc\u00ea deve ter para que possa se aprofundar adiante no assunto.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Expondo seu JMX ao mundo<\/h4>\n\n\n\n<p>Primeiro vamos tornar p\u00fablico o JMX: por padr\u00e3o este s\u00f3 \u00e9 acess\u00edvel localmente. Vamos come\u00e7ar pela forma menos segura poss\u00edvel.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Da forma mais simples &#8211; sem autentica\u00e7\u00e3o ou SSL<\/h5>\n\n\n\n<p>Para expor o JMX de sua aplica\u00e7\u00e3o da forma mais simples poss\u00edvel \u00e9 necess\u00e1rio passar as seguintes propriedades de sistema \u00e0 JVM monitorada, que ser\u00e3o comentados abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Indica que o JMX ser\u00e1 acess\u00edvel remotamente\n-Dcom.sun.management.jmxremote\n# Qual a porta do JMX estar\u00e1 dispon\u00edvel\n-Dcom.sun.management.jmxremote.port=9010\n# Indica que o JMX n\u00e3o requer autentica\u00e7\u00e3o para ser acessado\n-Dcom.sun.management.jmxremote.authenticate=false\n# Indica que o JMX n\u00e3o est\u00e1 acess\u00edvel somente localmente\n-Dcom.sun.management.jmxremote.local.only=false\n# Indica que n\u00e3o estamos usando SSL para estabelecer a comunica\u00e7\u00e3o\n-Dcom.sun.management.jmxremote.ssl=false\n# Fundamental: o IP da m\u00e1quina em que o JMX est\u00e1 dispon\u00edvel\n-Djava.rmi.server.hostname=192.168.0.30<\/pre>\n\n\n\n<p>Nesta configura\u00e7\u00e3o algumas notas s\u00e3o importantes: primeiro \u00e9 tornar claro que temos aqui a forma <strong>menos segura poss\u00edvel<\/strong> de configurar o acesso ao JMX, pois n\u00e3o usamos nem SSL nem credenciais de acesso.<\/p>\n\n\n\n<p>O segundo ponto diz respeito ao hostname do RMI. Muitas vezes o localhost encontra-se configurado como loopback no servidor, sendo assim \u00e9 obrigat\u00f3rio que voc\u00ea torne claro qual o IP da sua m\u00e1quina para que possa ser acessada por outras.<\/p>\n\n\n\n<p>Voltando ao cliente, a conex\u00e3o com este \u00e9 muito f\u00e1cil. Levando em considera\u00e7\u00e3o que temos aqui uma aplica\u00e7\u00e3o no ip 192.168.0.30 na porta 9010, usando o jconsole, basta preencher tal como no print abaixo:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"451\" height=\"427\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-4.png\" alt=\"jconsole\" class=\"wp-image-3186\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-4.png 451w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-4-300x284.png 300w\" sizes=\"(max-width: 451px) 100vw, 451px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Bem simples: com a conex\u00e3o aceita o jconsole perguntar\u00e1 se voc\u00ea quer fazer uma conex\u00e3o n\u00e3o segura, diga que sim, tal como no print a seguir:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-5.png\" alt=\"voc\u00ea aceitando o perigo\" class=\"wp-image-3187\" width=\"369\" height=\"184\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-5.png 369w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-5-300x150.png 300w\" sizes=\"(max-width: 369px) 100vw, 369px\" \/><figcaption>Clique em &#8220;Insecure Connection&#8221; e aceite o perigo :)<\/figcaption><\/figure><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Definindo par\u00e2metros de autentica\u00e7\u00e3o &#8211; ainda inseguro<\/h5>\n\n\n\n<p>Uma vers\u00e3o um pouco mais segura de acesso \u00e9 a autentica\u00e7\u00e3o baseada em arquivos do tipo plain text. \u00c9 um pouco mais dif\u00edcil de ser configurado, requer inclusive alterar arquivos da sua JVM, por\u00e9m \u00e9 vi\u00e1vel para fins de desenvolvimento.<\/p>\n\n\n\n<p>Talvez agora voc\u00ea entenda por que este recurso n\u00e3o \u00e9 t\u00e3o popular: configurar a seguran\u00e7a n\u00e3o \u00e9 trivial. O primeiro passo consiste em, no diret\u00f3rio da sua JVM, localizar a pasta <strong>conf\/management<\/strong>.<\/p>\n\n\n\n<p>No interior deste diret\u00f3rio voc\u00ea encontrar\u00e1 um arquivo chamado <strong>jmxremote.password.template<\/strong>, copie-o no mesmo diret\u00f3rio com o nome <strong>jmxremote.password<\/strong>. Este arquivo \u00e9 que cont\u00e9m as senhas em texto simples ou cifrado (neste post falaremos apenas do texto simples) para os dois perfis padr\u00e3o definidos para o acesso ao JMX:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>monitorRole<\/strong> &#8211; que te permite apenas monitorar o processo, isto \u00e9, apenas acompanhar os indicadores (somente leitura).<\/li><li><strong>controlRole<\/strong> &#8211; que te permite acesso total, ou seja, al\u00e9m de monitorar voc\u00ea tamb\u00e9m poder\u00e1 gerenciar via JMX (leitura e escrita).<\/li><\/ul>\n\n\n\n<p>Estes s\u00e3o tamb\u00e9m os usernames padr\u00e3o que voc\u00ea usar\u00e1 para se autenticar. Bom: criando a c\u00f3pia do seu arquivo jmxremote.password, \u00e9 importante tamb\u00e9m que haja permiss\u00e3o de leitura apenas para o usu\u00e1rio que iniciou o processo java (chmod 400 jmxremote.password &#8211; portanto).<\/p>\n\n\n\n<p>Modifiquei o meu arquivo para que sua \u00faltima linha ficasse tal como a apresentada a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">controlRole kicolobo<\/pre>\n\n\n\n<p>O nome do usu\u00e1rio \u00e9 controlRole, a senha, kicolobo. (dica: no diret\u00f3rio conf\/management, confira o arquivo jmxremote.access, h\u00e1 informa\u00e7\u00f5es interessantes ali).<\/p>\n\n\n\n<p>Pronto, agora \u00e9 s\u00f3 conectar no servidor tal como no exemplo a seguir:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-7.png\" alt=\"conex\u00e3o com credenciais\" class=\"wp-image-3189\" width=\"283\" height=\"287\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-7.png 453w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/image-7-296x300.png 296w\" sizes=\"(max-width: 283px) 100vw, 283px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Como n\u00e3o estamos usando SSL, aquela mesma mensagem avisando que voc\u00ea est\u00e1 trafegando por um canal de comunica\u00e7\u00e3o inseguro aparecer\u00e1. Diga para continuar e, voil\u00e1, voc\u00ea est\u00e1 dentro do console JMX.<\/p>\n\n\n\n<p>Mais detalhes sobre este tipo de configura\u00e7\u00e3o voc\u00ea encontra <a href=\"https:\/\/docs.oracle.com\/javadb\/10.10.1.2\/adminguide\/radminjmxenablesimpleauth.html\">neste link<\/a>.<\/p>\n\n\n\n<p>Ah, quer mudar a localiza\u00e7\u00e3o do arquivo ou mesmo seu nome? Use a propriedade de sistema <em>com.sun.management.jmxremote.password.file<\/em> apontando para o arquivo a ser carregado!<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Conectando de forma segura ao JMX<\/h5>\n\n\n\n<p>H\u00e1 ainda mais duas op\u00e7\u00f5es de se estabelecer autentica\u00e7\u00e3o com o servidor JMX. A primeira delas \u00e9 via LDAP (ou Active Directory). Mais detalhes sobre como implementar esta configura\u00e7\u00e3o voc\u00ea encontra <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/management\/agent.html#ldap\">neste link<\/a>.<\/p>\n\n\n\n<p>E, claro, para aprender a configurar seu certificado SSL e aplic\u00e1-lo ao JMX, siga as instru\u00e7\u00f5es <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/management\/agent.html#gdemv\">deste link<\/a>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Clientes JMX que valem \u00e0 pena mencionar<\/h1>\n\n\n\n<p>Neste post at\u00e9 agora mencionei apenas o jconsole como cliente por ser a op\u00e7\u00e3o mais popular: praticamente toda distribui\u00e7\u00e3o do JDK v\u00eam com ele, mas h\u00e1 outras op\u00e7\u00f5es que tamb\u00e9m costumam acompanhar a JVM:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/visualvm.github.io\/\">JVisualVM<\/a> &#8211; que antes fazia parte do pr\u00f3prio JDK, mas agora \u00e9 um projeto separado. Tem ferramentas de visualiza\u00e7\u00e3o muito interessantes, inclusive um profilador que \u00e9 extremamente \u00fatil quando bem usado para detectar gargalos.<\/li><li><a href=\"https:\/\/www.oracle.com\/java\/technologies\/jdk-mission-control.html#:~:text=JDK%20Mission%20Control%20is%20an,or%20deployed%20in%20production%20environments.\">Mission Control<\/a> &#8211; (comando jmc nas JVMs da Oracle) &#8211; costumava vir junto com o JDK, agora n\u00e3o mais, \u00e9 uma ferramenta excelente que tem como diferencial um recurso chamado &#8220;flight recorder&#8221;, que essencialmente grava toda a telemetria da sua aplica\u00e7\u00e3o para que voc\u00ea possa depois analisar com calma aonde encontram-se os gargalos.<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Concluindo<\/h1>\n\n\n\n<p>Existem diversas ferramentas de monitoramento de ambiente no mercado, mas para quem desenvolve em Java talvez o JMX seja a melhor das op\u00e7\u00f5es por nos permitir acompanhar em tempo real o que ocorre de fato no interior da JVM. H\u00e1 diversas ferramentas que se limitam a consumo de CPU, mem\u00f3ria, sistemas de arquivos, por\u00e9m o JMX nos d\u00e1 este &#8220;raio x&#8221; da aplica\u00e7\u00e3o em execu\u00e7\u00e3o que \u00e9 \u00fanico.<\/p>\n\n\n\n<p>Seu ponto fraco na minha opini\u00e3o \u00e9 a quest\u00e3o da seguran\u00e7a que n\u00e3o \u00e9 t\u00e3o simples de ser configurada. Talvez por isto n\u00e3o seja t\u00e3o popular, por\u00e9m solu\u00e7\u00f5es como o Actuator do Spring podem ser encaixadas aqui (inclusive tirando proveito do JMX) para resolver este gap.<\/p>\n\n\n\n<p>Um detalhe importante do JMX \u00e9 que este \u00e9 profundamente integrado \u00e0 JVM e a diversos containers de aplica\u00e7\u00e3o e bibliotecas. Sendo assim voc\u00ea literalmente pode ver TUDO o que ocorre no seu ambiente de produ\u00e7\u00e3o:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Como anda seu pool de conex\u00f5es.<\/li><li>Quais as conex\u00f5es ativas.<\/li><li>Quantas threads e classes est\u00e3o carregadas ao longo do tempo.<\/li><li>Usu\u00e1rios autenticados.<\/li><li>Enfim&#8230; se n\u00e3o tudo, quase tudo.<\/li><\/ul>\n\n\n\n<p>H\u00e1 mais pontos que poderia colocar neste post mas que ficar\u00e3o para o futuro:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>O mecanismo de eventos do JMX que permite projetar solu\u00e7\u00f5es de manuten\u00e7\u00e3o pr\u00f3-ativas.<\/li><li>Os adaptadores de protocolos de comunica\u00e7\u00e3o do JMX, que nos permite fazer o RMI se comunicar com qualquer outro protocolo, inclusive gerando outros tipos de visualiza\u00e7\u00e3o, como HTML, por exemplo.<\/li><li>Um review dos outros clientes JMX dispon\u00edveis, ou mesmo mostrar como, a partir do seu c\u00f3digo Java, voc\u00ea pode interagir com JMX remoto (isto \u00e9 MUITO interessante).<\/li><li>Como integrar JMX com Spring (isto \u00e9 post futuro GARANTIDO quando for falar de Actuator).<\/li><\/ul>\n\n\n\n<p>\u00c9 um assunto bem amplo sobre uma ferramenta que t\u00e1 em toda JVM e pouca gente fala a respeito. N\u00e3o raro em consultorias inicio o jconsole pra identificar gargalos e os olhos ao meu redor brilham, espero que os seus tenham brilhado tamb\u00e9m neste post.<\/p>\n\n\n\n<p>Agora que vimos um pouco sobre monitoramento \u00e9 hora de vermos o Actuator. Bora l\u00e1!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para aprender mais<\/h2>\n\n\n\n<p>Segue uma lista de links para voc\u00ea se aprofundar no assunto:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Overview do JMX do site da Oracle, que d\u00e1 uma vis\u00e3o resumida da tecnologia &#8211; <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/jmx\/overview\/index.html \">https:\/\/docs.oracle.com\/javase\/tutorial\/jmx\/overview\/index.html <\/a><\/li><li>Getting Started da Oracle &#8211; mesma linha do link acima &#8211; <a href=\"https:\/\/www.oracle.com\/technical-resources\/articles\/javase\/jmx.html\">https:\/\/www.oracle.com\/technical-resources\/articles\/javase\/jmx.html<\/a> <\/li><li>Documenta\u00e7\u00e3o completa do JMX no site da Oracle &#8211; <a href=\"https:\/\/docs.oracle.com\/javase\/10\/jmx\/toc.htm\">https:\/\/docs.oracle.com\/javase\/10\/jmx\/toc.htm<\/a><\/li><li>Vinda ainda do Java 6, a spec do JMX, que mostra detalhes internos muito interessantes sobre o seu funcionamento que ainda se aplicam hoje: <a href=\"https:\/\/docs.oracle.com\/javase\/6\/docs\/technotes\/guides\/jmx\/JMX_1_4_specification.pdf\">https:\/\/docs.oracle.com\/javase\/6\/docs\/technotes\/guides\/jmx\/JMX_1_4_specification.pdf<\/a><\/li><li>Uma leitura light no site do Baeldung &#8211; <a href=\"https:\/\/www.baeldung.com\/java-management-extensions\">https:\/\/www.baeldung.com\/java-management-extensions<\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Conhe\u00e7a uma p\u00e9rola oculta do Java, o JMX, que permite monitorar e gerenciar remotamente qualquer aplica\u00e7\u00e3o que execute na JVM!<\/p>\n","protected":false},"author":1,"featured_media":3170,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[112,109,84,111,108,110,106,107],"class_list":["post-3169","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-actuator","tag-devops","tag-java","tag-javase","tag-jmx","tag-monitoramento","tag-spring","tag-spring-boot"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX - \/dev\/Kico<\/title>\n<meta name=\"description\" content=\"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=3169\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monitore e gerencie remotamente suas aplica\u00e7\u00f5es Java com JMX!\" \/>\n<meta property=\"og:description\" content=\"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=3169\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-07T01:14:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-12-07T01:14:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Monitore e gerencie remotamente suas aplica\u00e7\u00f5es Java com JMX!\" \/>\n<meta name=\"twitter:description\" content=\"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=3169\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=3169\",\"name\":\"Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=3169#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=3169#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png\",\"datePublished\":\"2020-12-07T01:14:03+00:00\",\"dateModified\":\"2020-12-07T01:14:05+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"description\":\"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!\",\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=3169#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=3169\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=3169#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png\",\"width\":640,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=3169#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX - \/dev\/Kico","description":"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=3169","og_locale":"pt_BR","og_type":"article","og_title":"Monitore e gerencie remotamente suas aplica\u00e7\u00f5es Java com JMX!","og_description":"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!","og_url":"https:\/\/devkico.itexto.com.br\/?p=3169","og_site_name":"\/dev\/Kico","article_published_time":"2020-12-07T01:14:03+00:00","article_modified_time":"2020-12-07T01:14:05+00:00","og_image":[{"width":640,"height":640,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png","type":"image\/png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_title":"Monitore e gerencie remotamente suas aplica\u00e7\u00f5es Java com JMX!","twitter_description":"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!","twitter_image":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=3169","url":"https:\/\/devkico.itexto.com.br\/?p=3169","name":"Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=3169#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=3169#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png","datePublished":"2020-12-07T01:14:03+00:00","dateModified":"2020-12-07T01:14:05+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"description":"Conhe\u00e7a o JMX, esta p\u00e9rola oculta da JVM que permite monitorar e gerenciar remotamente suas aplica\u00e7\u00f5es Java!","breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=3169#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=3169"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=3169#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png","width":640,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=3169#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Monitorando (e gerenciando) sua aplica\u00e7\u00e3o Java com JMX"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2020\/12\/jmx.png","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/3169"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3169"}],"version-history":[{"count":9,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/3169\/revisions"}],"predecessor-version":[{"id":3194,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/3169\/revisions\/3194"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/3170"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}