Passez vos applications Java au microscope électronique.
La « Vigie » est née d’un besoin dans mes activités de consultant Java/JEE.
L’une de mes missions consiste à diagnostiquer et résoudre des problèmes de fonctionnement, de robustesse ou de performance d’applications java.
Une des difficultés rencontrées pendant ces analyses est le manque d’informations. L’application est une boîte noire, son comportement est invisible depuis l’extérieur.
Diagnostiquer un problème sur une application requiert bien souvent de reconstituer une histoire en partant de faits. Les traces systèmes, serveurs et applicatives constituent généralement les principales sources d’informations.
Même si les serveurs d’application Java Open Source ou commerciaux exposent généralement pas mal d’informations utiles il en est très souvent autrement des applications qui y sont déployées.
Or, bien souvent ce sont elles qui détiennent la clef du problème.
De plus, les cycles de vie des projets informatiques ne permettent pas toujours de modifier le code rapidement afin d’ajouter des traces supplémentaires aux endroits clefs.
Par conséquent, comment faire en sorte d’obtenir les informations manquantes qui permettraient de réaliser les analyses et de résoudre les problèmes ?
Cette approche permet de ne pas avoir à repartir sur un cycle complet de développement (Développement, intégration, qualification, production) pour enrichir l’application des traces manquantes.
Cas d’utilisation
Cet outil permet par exemple de répondre aux questions suivantes :
Vigie surveille toutes les ouvertures de sockets afin de les tracer. Cela permet de vérifier par exemple que l’url utilisée est bien la bonne.
Vigie surveille le chargement des fichiers .properties par la JVM afin de les tracer
Vigie surveille la lecture des propriétés afin de les tracer.
Vigie surveille les temps d’exécution des servlets de votre choix et trace celles qui dépassent le seuil fixé.
Vigie surveille n’importe quelle exception et trace son déclenchement en fournissant la pile complète des appels.
Vigie surveille les pilotes JDBC afin de tracer l’exécution des requêtes SQL (avec la valeur des paramètres) ainsi que les demandes de connexions SQL.
Vigie déclenche une série de thread dumps dès le démarrage de la JVM afin de voir où se situe le problème.
Vigie trace toutes les exécutions de méthodes au sein de la JVM. Ceci permet de reconstituer partiellement ou intégralement le « parcours » de la requête. En bous, les paramètres d’entrée des méthodes ainsi que les valeurs de retour sont tracées.
Vigie surveille les créations/suppressions de sessions HTTP des applications Web afin de répondre à ces questions.
Vigie surveille les fichiers ouverts par l’application
Vigie surveille le chargement des classes par la JVM.
Vigie surveille les Keystores et les certificats qui y sont stockés.
Vigie dispose d’autres capacités dont certaines sont étroitement liées aux serveurs d’application (Oracle WebLogic Server ou JBoss par exemple)
Son champs opérationnel n’est pas limité et il évolue régulièrement en fonction des besoins rencontrés pendant les missions.
Certains de ces cas peuvent faire sourire mais ils sont tous le résultat d’expériences vécues chez les clients auprès d’équipes de développement ou des Ops en charge des infrastructures. Il est également acté que la plupart de ces informations peuvent être obtenues autrement mais souvent au pris de modifications de l’application elle-même ou de son environnement d’exécution.
Déploiement
Techniquement, Vigie est constitué d’un agent Java, d’une application Web de pilotage et d’un client Java. L’application web est optionnelle et n’est pas requise pour le fonctionnement de l’outil.
Le client java permet de communiquer avec l’agent via le réseau afin de déclencher des opérations ou de récupérer des informations. Il est facilement intégrable dans un script exécuté régulièrement sur une machine, via une cron table par exemple. Il est possible d’utiliser le protocole TLS pour authentifier le client auprès de l’agent et chiffrer les échanges réseaux entre le client et l’agent.
L’agent peut être implanté dans la JVM
- soit directement au niveau des paramètres de démarrage de la JVM. Redémarrage de la JVM requis ;
- soit en s’accrochant à une JVM qui fonctionne sans nécessiter un redémarrage de celle-ci. Très pratique pour ne pas engendrer d’interruption de service à cause de l’arrêt de la JVM.
Informations obtenues
Une fois implantée dans la JVM, Vigie peut récupérer des informations telles que :
- les méthodes invoquées, avec les paramètres d’entrée et la valeur de retour
- la pile des appels (stack trace) menant à une invocation de méthode
- Un thread dump complet
- L’identifiant et le nom du thread
- L’identifiant de corrélation utilisé par WebLogic Server (ECID) s’il est disponible
- L’identifiant de l’utilisateur s’il est authentifié
- etc…
Vigie génère des logs dans lesquelles sont stockées les informations recueillies au sein de la JVM. La compression et la rotation des fichiers de logs sont gérées automatiquement par l’outil.
Impact sur le comportement des applications
Quel impact sur l’application ?
Vigie a pour vocation d’être utilisé sur les environnements de tests ou de développement.
Il peut (et a déjà été) être utilisé sur des environnements de production, même fortement sollicités, à condition de limiter son champs opérationnel.
Il dispose également de garde-fous qui peuvent limiter la quantité de traces générées afin de ne pas impacter les performances ou saturer les systèmes de fichiers.
Contact
Si vous voulez en savoir plus, n’hésitez pas à prendre contact avec moi via le formulaire de contact.