Gérez la santé de votre code avec JMX
Êtes-vous déjà allé chez le médecin, faire prendre votre température, mesurer votre pouls et votre pression sanguine ?
Votre médecin examine généralement votre état de santé en vérifiant quelques indicateurs clés faciles à mesurer. 🌡️ Ces mesures peuvent aider à résumer votre état de santé général sans avoir à vous ouvrir de façon chirurgicale ! 😷💀
Quand des utilisateurs réels utilisent votre application, vous voulez savoir que tout fonctionne comme prévu, sans surprises. Vous voulez aussi vous en assurer sans être intrusif, afin de ne pas ralentir, arrêter, modifier, ou redémarrer votre application pendant que vous vérifiez qu’elle fonctionne. C’est là que Java Management Extensions (gestion des extensions Java), plus couramment connu sous le nom de JMX, vient à votre secours !
JMX fournit une interface standard pour que les applications fassent un retour sur leur propre santé (en d’autres termes, sur la qualité de leur fonctionnement). Avez-vous déjà utilisé une bibliothèque tierce dans votre code ? Dans ce cas, sans même le savoir, vous avez probablement autorisé des extensions JMX, qui vous donnent des informations sur la santé de l’application, y compris des métriques liées à des éléments tels que votre système d’opération et votre utilisation de la mémoire. Ces informations aident à diagnostiquer et traiter les bugs.
Comment est-ce que cela fonctionne, exactement ?
Pour comprendre JMX, vous devez savoir ce qui le constitue : des attributs et des opérations.
Utilisez des attributs avec JMX
JMX permet aux applications de coder des endpoints spéciaux qui rendent disponible l’information de différentes valeurs. Ceux-ci s’appellent des attributs et ils décrivent la façon dont votre application fonctionne - comme les vérifications de santé et l’historique médical utilisés par le médecin.
Java vous fournit des informations. Par exemple, il peut vous dire combien de mémoire libre est disponible sur l’ordinateur qui exécute la JVM de votre application. La valeur peut comprendre un changement de mémoire au fil du temps, à mesure que votre ordinateur grandit et a besoin de davantage de mémoire pour résoudre ses problèmes. Vous pouvez suivre cette croissance dans le temps, avec des métriques que vous pouvez voir sur un graphique.
D’autres attributs peuvent être fixes et immuables, comme le nom du système d’opération. Ce sont des métadonnées, qui aident à décrire votre système en termes plus larges et donnent du contexte aux métriques. Les informations fixes, comme la JVM que vous utilisez, pourraient être utiles lorsque vous suivez les différences dans l’utilisation de la mémoire et d’autres ressources entre différentes versions de JVM.
Utilisez des opérations avec JMX
JMX permet également aux endpoints d’application de rendre disponibles des méthodes spéciales. Ceci vous permet d’utiliser les mêmes outils qui inspectent les métriques de votre application pour appeler des méthodes spéciales qui peuvent modifier votre application sans la redémarrer. Par exemple, vous pourriez demander à votre application d’être plus bavarde dans ses rapports sur ses activités.
Vous voulez dire que mon application pourrait déjà avoir des métriques de santé ? Comment puis-je les voir ?
JConsole est un outil fourni à la fois avec l’OpenJDK et les JDK Oracle. Vous pouvez l’utiliser pour vous connecter à une JVM exécutant votre application et examiner les métriques de santé via les opérations et les attributs. Regardons cela de plus près !
VisualVM peut également vous montrer les statistiques JMX. JConsole est néanmoins conçu en premier lieu pour cela.
Connectez-vous à JConsole et inspectez une application
Étape 1 : Démarrez une application
Vous pouvez généralement trouver JConsole en affichant votre variable d’environnementJAVA_HOME
et en regardant dans le dossier bin qui s’y trouve. Cela varie en fonction des distributions. Essayez de regarder aux emplacements suivants :
sur un Mac avec OS-X, vous trouverez votre distribution Java sous /Library/Java/JavaVirtualMachines ;
sous Windows, vous trouverez généralement vos installations Java sous c:\Program Files\Java ;
avec les distributions Debian Linux, vous verrez que votre dpkg a installé JDK sous /usr/lib/jvm.
Regardez sous le répertoire bin de votre installation JDK pour trouver la binaire d’application JConsole. Le calculateur de taille de selle de dragon fonctionne avec JDK 8, donc sous Windows, cela ressemblerait à :
Essayez d’exécuter JConsole et de le faire se connecter à lui-même. Explorez un peu après qu’il se soit connecté.
Comme avec VisualVM, c’est amusant de connecter JConsole à lui-même, mais l’outil brille vraiment lorsque vous pouvez commencer à l’utiliser pour inspecter votre application. Nous allons exécuter une version de notre calculateur de taille de selle de dragon, qui donne un rapport sur la taille de selle estimée pour cette année, pour un dragon né en l’an 1 après J.-C. Comme vous allez beaucoup travailler sur Spring Boot en tant que développeur Java, je vous ai fait une application qui fonctionne comme une application web Spring Boot. Bien que JConsole puisse être utilisé avec de nombreux outils Java, le fait de travailler dessus avec Spring Boot vous donnera un peu d’entraînement réaliste. 😎
Regardons la branche avec notre application web et démarrons-la ! Revenez au calculateur de taille de selle de dragons, et consultez la branche spring-application-with-actuator. Nous la démarrerons dans IntelliJ. Vous pouvez la commande :
git checkout spring-application-with-actuator
Examinons la branche ensemble dans IntelliJ et lançons l’application :
Comme vous l’avez vu :
nous avons “check out” la branche, puis utilisé le menu
Gradle
pour démarrer l’application en cliquant sur bootRun ;nous avons ensuite pu aller à http://localhost:9999/dragon/size dans notre navigateur web pour obtenir une estimation pour l’année en cours.
Qu’est-ce que cette version de l’application a de particulier ?
Dans cette branche, votre application de calculateur de taille de selle de dragon a été convertie en une simple application web ; vous pouvez donc aller à une URL dans un navigateur et obtenir une estimation de taille de selle. Le projet n’est pas seulement une application Spring, mais il a aussi une dépendance ajoutée de org.springframework.boot:spring-boot-starter-actuator
, connue sous le nom de Spring Actuator, dans son fichier build.gradle
. L’inclusion de cette dépendance dans un projet Spring introduit des rapports sur votre application web. C’est ce que nous allons regarder avec JConsole.
Étape 2 : Utilisez JConsole pour inspecter les métriques de votre application
Pour consulter les métriques d’une application, démarrez JConsole et sélectionnez Connexion et New Connection (nouvelle connexion). Cela vous montre une liste de process Java auxquels vous pouvez vous connecter. Trouvons la DragonSaddleSizeGuesserApp, connectons-nous à elle, et examinons l’écran qui nous est présenté :
Détaillons cela :
La section Local Processes montre tous les process Java exécutés sur le PC où vous avez démarré JConsole.
Après le démarrage de notre application, vous verrez notre DragonSaddleSizeGuesserApp sous Local Processes, le nom de la classe principale de notre application. Puis, double-cliquez dessus pour vous connecter.
En bas, sous Remote Process, vous pouvez vous connecter à la partie JMX de tout programme Java sur tout ordinateur que vous pouvez atteindre par un réseau sans firewalls en travers du chemin, bien sûr. Vous pouvez en apprendre plus à ce sujet ici.
Utilisons ceci pour nous connecter à notre calculateur de taille de selle de dragon et voir certaines des métriques et données de référence que cela dévoile.
Le plus intéressant lorsque nous utilisons JConsole est l’onglet MBeans. C’est là où les classes Java publient les métriques qui vous donnent des informations sur ce qu’il se passe dans la JVM.
Comme vous l’avez vu, il existe de nombreuses métriques différentes mises à disposition par Spring Actuator, ainsi qu’une myriade d’autres bibliothèques dont votre application dépend. Elles sont groupées par clés significatives nommées ObjectNames.
Voyons ce que JConsole vous montre sous MBeans :
Comme vous pouvez le voir, le formulaire ObjectName est structuré en dossiers dans lesquels vous pouvez naviguer.
Explorons-les :
Les dossiers jaunes constituent la partie Domaine de l’ObjectName et vous aident à regrouper différents attributs. Comme vous pouvez le voir, Java publie une quantité d’attributs utiles sous le domaine java.lang.
Les clés spéciales regroupent les attributs et les opérations sous un type plus spécifique. Ce type décrit leur nature plus clairement que le domaine. Par exemple, tous les détails récupérés directement depuis le système d’opération Windows ou OS-X sur lequel votre JVM fonctionne sont regroupés sous le type OperatingSystem.
Si vous regardez les détails du type, vous verrez Attributs et Opérations. Sous Attributs, vous pouvez voir les noms des attributs sur lesquels votre application fait ses rapports. Ils sont aussi connus sous le nom de clés. Par exemple, FreePhysicalMemorySize, que vous pouvez voir ci-dessus, est la clé qui décrit combien de mémoire libre il reste sur votre ordinateur.
À droite de vos attributs, vous pouvez voir des paires de clés avec leurs dernières valeurs rapportées. Dans la plupart des cas, elles seront proches de la valeur actuelle.
Il y a de nombreux ObjectNames, attributs, et opérations dévoilés par une application typique. Ceux que je vous ai montrés dans la démonstration constituent un bon début, car ils vous donnent une idée de la manière dont votre application fonctionne, mais il ne s’agit que d’une vue en surface.
Si vous voulez simplement connaître le niveau de performance de votre application Spring, vous pouvez vous concentrer sur la branche étiquetée org.springframework.boot/Endpoint, qui a été donnée par Spring Boot Actuator. Toutes les opérations et tous les attributs sous cette branche sont pensés pour vous donner davantage de visibilité sur une application Spring. Le fait de regarder l’endpoint health (santé) devrait vous montrer que votre application a démarré correctement.
Comme vous l’avez vu, la définition de la propriété a montré que le code correspondait à une version plus ancienne et devait être mis à niveau. Dans une situation plus complexe, vous devrez peut-être creuser plus profondément et jouer à nouveau les Sherlock, en utilisant les indices dans votre application, comme les logs (vous en apprendrez plus à leur sujet dans un chapitre suivant).
En résumé
Java Management Extensions, ou JMX, fournit un protocole que les outils peuvent utiliser pour surveiller et gérer vos applications Java.
Les MBeans sont des classes spéciales que les applications peuvent fournir pour faire des rapports sur elles-mêmes et permettre le déroulement d’opérations de management spéciales.
Les attributs sont constitués par une valeur, et une clé qui décrit cette valeur. Les MBeans utilisent les attributs pour effectuer des rapports sur des aspects de votre application.
Les opérations sont des actions spéciales que vous pouvez effectuer en utilisant les MBeans. Un exemple de ceci pourrait être de changer un niveau de log, ou de vider un cache.
JConsole est un outil fourni avec le JDK et il est conçu pour vous aider à interagir avec les MBeans sur un process Java local ou à distance.
Spring Actuator est une bibliothèque qui permet aux applications Spring de gérer les MBeans à travers l’application elle-même sans avoir besoin d’autres outils.
Dans le chapitre suivant, nous allons nous intéresser à un autre outil puissant : le logging, ou la log !