{"id":45,"date":"2017-09-21T15:33:14","date_gmt":"2017-09-21T13:33:14","guid":{"rendered":"http:\/\/corsaire-consulting.fr\/blog\/?page_id=45"},"modified":"2019-01-27T17:36:19","modified_gmt":"2019-01-27T16:36:19","slug":"vigie","status":"publish","type":"page","link":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/vigie\/","title":{"rendered":"Vigie"},"content":{"rendered":"<p style=\"text-align: center;\"><span style=\"color: #0000ff;\"><em>Passez vos applications Java au microscope \u00e9lectronique.<\/em><\/span><\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-387 alignleft\" src=\"https:\/\/corsaire-consulting.fr\/blog\/wp-content\/uploads\/2019\/01\/biology-close-up-instrument-60022-300x199.jpg\" alt=\"Passez vos applications java au microscope \u00e9lectronique\" width=\"300\" height=\"199\" \/><\/p>\r\n\r\n<p><strong>La \u00ab\u00a0Vigie\u00a0\u00bb<\/strong> est n\u00e9e d&rsquo;un besoin dans mes activit\u00e9s de consultant Java\/JEE.<br \/>L&rsquo;une de mes missions consiste \u00e0 diagnostiquer et r\u00e9soudre des probl\u00e8mes de fonctionnement, de robustesse ou de performance d&rsquo;applications java.<\/p>\r\n\r\n\r\n\r\n<p>Une des difficult\u00e9s rencontr\u00e9es pendant ces analyses est le manque d&rsquo;informations. L&rsquo;application est une bo\u00eete noire, son comportement est invisible depuis l&rsquo;ext\u00e9rieur. <br \/>Diagnostiquer un probl\u00e8me sur une application requiert bien souvent de reconstituer une histoire en partant de faits. Les traces syst\u00e8mes, serveurs et applicatives constituent g\u00e9n\u00e9ralement les principales sources d&rsquo;informations.<\/p>\r\n\r\n\r\n\r\n<p>M\u00eame si les serveurs d&rsquo;application Java Open Source ou commerciaux exposent g\u00e9n\u00e9ralement pas mal d&rsquo;informations utiles il en est tr\u00e8s souvent autrement des applications qui y sont d\u00e9ploy\u00e9es.<\/p>\r\n\r\n\r\n\r\n<p>Or, bien souvent ce sont elles qui d\u00e9tiennent la clef du probl\u00e8me.<\/p>\r\n\r\n\r\n\r\n<p>De plus, les cycles de vie des projets informatiques ne permettent pas toujours de modifier le code rapidement afin d&rsquo;ajouter des traces suppl\u00e9mentaires aux endroits clefs.<\/p>\r\n\r\n\r\n\r\n<p><span class=\"label label-danger\">Par cons\u00e9quent, comment faire en sorte d&rsquo;obtenir les informations manquantes qui permettraient de r\u00e9aliser les analyses et de r\u00e9soudre les probl\u00e8mes ?<\/span><\/p>\r\n\r\n\r\n\r\n<div class=\"alert alert-block alert-success\">La r\u00e9ponse que j&rsquo;ai trouv\u00e9 est de modifier le <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_bytecode\">bytecode java<\/a> au sein de la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_virtual_machine\">Machine Virtuelle Java (JVM)<\/a> <br \/>Cette approche permet de ne pas avoir \u00e0 repartir sur un cycle complet de d\u00e9veloppement (D\u00e9veloppement, int\u00e9gration, qualification, production) pour enrichir l&rsquo;application des traces manquantes.<\/div>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Cas d&rsquo;utilisation<\/h2>\r\n\r\n\r\n\r\n<p>Cet outil permet par exemple de r\u00e9pondre aux questions suivantes :<\/p>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i> Mon application doit se connecter sur un serveur (HTTP, service web, EJB, etc&#8230;) mais \u00e7a ne marche pas.<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille toutes les ouvertures de sockets afin de les tracer. Cela permet de v\u00e9rifier par exemple que l&rsquo;url utilis\u00e9e est bien la bonne.<\/div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Comment conna\u00eetre tous les fichiers properties charg\u00e9s par mon application ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille le chargement des fichiers .properties par la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_virtual_machine\">JVM<\/a> afin de les tracer<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i> Comment savoir quelle classe acc\u00e8de \u00e0 telle ou telle propri\u00e9t\u00e9 d&rsquo;un fichier .properties ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille la lecture des propri\u00e9t\u00e9s afin de les tracer.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Comment d\u00e9tecter les <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/index-jsp-135475.html\">servlets<\/a> dont le d\u00e9lai d&rsquo;ex\u00e9cution d\u00e9passe un certain seuil ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille les temps d&rsquo;ex\u00e9cution des <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/index-jsp-135475.html\">servlets<\/a> de votre choix et trace celles qui d\u00e9passent le seuil fix\u00e9.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Une exception du type &#8230; est d\u00e9clench\u00e9e par l&rsquo;application mais je ne sais pas depuis quelle classe et quelle m\u00e9thode ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille n&rsquo;importe quelle exception et trace son d\u00e9clenchement en fournissant la pile compl\u00e8te des appels.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Quelles sont les requ\u00eates SQL ex\u00e9cut\u00e9es par mon application ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille les pilotes JDBC afin de tracer l&rsquo;ex\u00e9cution des requ\u00eates SQL (avec la valeur des param\u00e8tres) ainsi que les demandes de connexions SQL.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Mon serveur d&rsquo;application met beaucoup de temps \u00e0 d\u00e9marrer. Comment d\u00e9terminer l&rsquo;origine du probl\u00e8me ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie d\u00e9clenche une s\u00e9rie de thread dumps d\u00e8s le d\u00e9marrage de la JVM afin de voir o\u00f9 se situe le probl\u00e8me.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Comment conna\u00eetre toutes les m\u00e9thodes ex\u00e9cut\u00e9es suite \u00e0 la r\u00e9ception d&rsquo;une requ\u00eate par le serveur d&rsquo;application ?<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie trace toutes les ex\u00e9cutions de m\u00e9thodes au sein de la JVM. Ceci permet de reconstituer partiellement ou int\u00e9gralement le \u00ab\u00a0parcours\u00a0\u00bb de la requ\u00eate. En bous, les param\u00e8tres d&rsquo;entr\u00e9e des m\u00e9thodes ainsi que les valeurs de retour sont trac\u00e9es.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0Je constate que le conteneur web cr\u00e9\u00e9 ou d\u00e9truit des sessions HTTP mais je ne sais pas quand ni quel code en est \u00e0 l&rsquo;origine.<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille les cr\u00e9ations\/suppressions de sessions HTTP des applications Web afin de r\u00e9pondre \u00e0 ces questions.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0J&rsquo;ai besoin de conna\u00eetre ou v\u00e9rifier les fichiers charg\u00e9s par mon application (.properties, .xml, etc&#8230;)<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille les fichiers ouverts par l&rsquo;application<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i>\u00a0J&rsquo;ai besoin de savoir quand une classe est charg\u00e9e par la JVM, par qui (classloader et thread) et depuis quel emplacement (.jar)<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille le chargement des classes par la JVM.<\/div>\r\n\r\n\r\n\r\n<div class=\"well\"><i class=\"icon-question-sign\"><\/i> J&rsquo;ai besoin de savoir quels sont les certificats de s\u00e9curit\u00e9 utilis\u00e9s ainsi que leur date d&rsquo;expiration<br \/><i class=\"icon-circle-arrow-right\"><\/i> Vigie surveille les <a href=\"https:\/\/en.wikipedia.org\/wiki\/Keystore\">Keystores<\/a> et les certificats qui y sont stock\u00e9s.<\/div>\r\n\r\n\r\n\r\n<p>Vigie dispose d&rsquo;autres capacit\u00e9s dont certaines sont \u00e9troitement li\u00e9es aux serveurs d&rsquo;application (Oracle WebLogic Server ou JBoss par exemple)<\/p>\r\n\r\n\r\n\r\n<p>Son champs op\u00e9rationnel n&rsquo;est pas limit\u00e9 et il \u00e9volue r\u00e9guli\u00e8rement en fonction des besoins rencontr\u00e9s pendant les missions.<\/p>\r\n\r\n\r\n\r\n<p>Certains de ces cas peuvent faire sourire mais ils sont tous le r\u00e9sultat d&rsquo;exp\u00e9riences v\u00e9cues chez les clients aupr\u00e8s d&rsquo;\u00e9quipes de d\u00e9veloppement ou des Ops en charge des infrastructures. Il est \u00e9galement act\u00e9 que la plupart de ces informations peuvent \u00eatre obtenues autrement mais souvent au pris de modifications de l&rsquo;application elle-m\u00eame ou de son environnement d&rsquo;ex\u00e9cution.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">D\u00e9ploiement<\/h2>\r\n\r\n\r\n\r\n<p>Techniquement, Vigie est constitu\u00e9 d&rsquo;un agent Java, d&rsquo;une application Web de pilotage et d&rsquo;un client Java. L&rsquo;application web est optionnelle et n&rsquo;est pas requise pour le fonctionnement de l&rsquo;outil.<\/p>\r\n<p>Le client java permet de communiquer avec l&rsquo;agent via le r\u00e9seau afin de d\u00e9clencher des op\u00e9rations ou de r\u00e9cup\u00e9rer des informations. Il est facilement int\u00e9grable dans un script ex\u00e9cut\u00e9 r\u00e9guli\u00e8rement sur une machine, via une cron table par exemple. Il est possible d&rsquo;utiliser le protocole TLS pour authentifier le client aupr\u00e8s de l&rsquo;agent et chiffrer les \u00e9changes r\u00e9seaux entre le client et l&rsquo;agent.<\/p>\r\n\r\n\r\n\r\n<p>L&rsquo;agent peut \u00eatre implant\u00e9 dans la JVM<\/p>\r\n<ul>\r\n<li>soit directement au niveau des param\u00e8tres de d\u00e9marrage de la JVM. Red\u00e9marrage de la JVM requis ;<\/li>\r\n<li>soit en s&rsquo;accrochant \u00e0 une JVM qui fonctionne<strong> sans n\u00e9cessiter un red\u00e9marrage<\/strong> de celle-ci. Tr\u00e8s pratique pour ne pas engendrer d&rsquo;interruption de service \u00e0 cause de l&rsquo;arr\u00eat de la JVM.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Informations obtenues<\/h2>\r\n\r\n\r\n\r\n<p>Une fois implant\u00e9e dans la JVM, Vigie peut r\u00e9cup\u00e9rer des informations telles que :<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>les m\u00e9thodes invoqu\u00e9es, avec les param\u00e8tres d&rsquo;entr\u00e9e et la valeur de retour<\/li>\r\n<li>la pile des appels (stack trace) menant \u00e0 une invocation de m\u00e9thode<\/li>\r\n<li>Un thread dump complet<\/li>\r\n<li>L&rsquo;identifiant et le nom du thread<\/li>\r\n<li>L&rsquo;identifiant de corr\u00e9lation utilis\u00e9 par WebLogic Server (ECID) s&rsquo;il est disponible<\/li>\r\n<li>L&rsquo;identifiant de l&rsquo;utilisateur s&rsquo;il est authentifi\u00e9<\/li>\r\n<li>etc&#8230;<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Vigie g\u00e9n\u00e8re des logs dans lesquelles sont stock\u00e9es les informations recueillies au sein de la JVM. La compression et la rotation des fichiers de logs sont g\u00e9r\u00e9es automatiquement par l&rsquo;outil.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Impact sur le comportement des applications<\/h2>\r\n\r\n\r\n\r\n<p>Quel impact sur l&rsquo;application ?<br \/>Vigie a pour vocation d&rsquo;\u00eatre utilis\u00e9 sur les environnements de tests ou de d\u00e9veloppement.<br \/>Il peut (et a d\u00e9j\u00e0 \u00e9t\u00e9) \u00eatre utilis\u00e9 sur des environnements de production, m\u00eame fortement sollicit\u00e9s, \u00e0 condition de limiter son champs op\u00e9rationnel.<br \/>Il dispose \u00e9galement de garde-fous qui peuvent limiter la quantit\u00e9 de traces g\u00e9n\u00e9r\u00e9es afin de ne pas impacter les performances ou saturer les syst\u00e8mes de fichiers.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Contact<\/h2>\r\n\r\n\r\n\r\n<p>Si vous voulez en savoir plus, n&rsquo;h\u00e9sitez pas \u00e0 prendre contact avec moi via le <a href=\"http:\/\/corsaire-consulting.fr\/blog\/index.php\/contact\/\">formulaire de contact<\/a>.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Passez vos applications Java au microscope \u00e9lectronique. La \u00ab\u00a0Vigie\u00a0\u00bb est n\u00e9e d&rsquo;un besoin dans mes activit\u00e9s de consultant Java\/JEE.L&rsquo;une de mes missions consiste \u00e0 diagnostiquer et r\u00e9soudre des probl\u00e8mes de fonctionnement, de robustesse ou de performance d&rsquo;applications java. Une des difficult\u00e9s rencontr\u00e9es pendant ces analyses est le manque d&rsquo;informations. L&rsquo;application est une bo\u00eete noire, son [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":387,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-45","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/pages\/45","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=45"}],"version-history":[{"count":31,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/pages\/45\/revisions"}],"predecessor-version":[{"id":408,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/pages\/45\/revisions\/408"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media\/387"}],"wp:attachment":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=45"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}