{"id":473,"date":"2019-04-13T11:27:19","date_gmt":"2019-04-13T09:27:19","guid":{"rendered":"https:\/\/corsaire-consulting.fr\/blog\/?p=473"},"modified":"2019-04-13T11:27:19","modified_gmt":"2019-04-13T09:27:19","slug":"integration-weblogic-server-et-prometheus-via-weblogic-monitoring-exporter","status":"publish","type":"post","link":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/2019\/04\/13\/integration-weblogic-server-et-prometheus-via-weblogic-monitoring-exporter\/","title":{"rendered":"Int\u00e9gration WebLogic Server et Prometheus via WebLogic Monitoring Exporter"},"content":{"rendered":"<p>Cet article pr\u00e9sente un petit retour d&rsquo;exp\u00e9rience sur l&rsquo;int\u00e9gration de WebLogic Server avec l&rsquo;outil de monitoring de plus en plus populaire et open-source, <a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a>. L&rsquo;int\u00e9gration technique est r\u00e9alis\u00e9e via le composant open-source <a href=\"https:\/\/github.com\/oracle\/weblogic-monitoring-exporter\" target=\"_blank\" rel=\"noopener noreferrer\">WebLogic Monitoring Exporter<\/a>.<\/p>\n<p>L&rsquo;objectif n&rsquo;est pas de d\u00e9tailler cette int\u00e9gration mais d&rsquo;exprimer mon feedback sur ce composant. Plusieurs articles, comme <a href=\"https:\/\/blogs.oracle.com\/weblogicserver\/use-prometheus-and-grafana-to-monitor-weblogic-server-on-kubernetes\" target=\"_blank\" rel=\"noopener noreferrer\">celui-l\u00e0<\/a>, exposent d\u00e9j\u00e0 comment r\u00e9aliser cette int\u00e9gration.<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a> est une solution de monitoring open-source que je croise de plus en plus au fil de mes interventions. Il est tr\u00e8s r\u00e9pandu dans les architectures micro-services et particuli\u00e8rement dans les clouds publics ou priv\u00e9s.<\/p>\n<p>Le principe de fonctionnement est assez simple : Chaque service doit exposer ses m\u00e9triques via une API HTTP. Ces m\u00e9triques sont lues r\u00e9guli\u00e8rement par <a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a> et sont stock\u00e9es dans sa base de donn\u00e9es de type <em><span style=\"text-decoration: underline;\">Time-Series<\/span><\/em>. Ces donn\u00e9es peuvent ensuite \u00eatre consult\u00e9es via la console int\u00e9gr\u00e9e \u00e0 <a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a> ou via un outil tel que <a href=\"https:\/\/grafana.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Grafana<\/a>.<\/p>\n<p>Il est \u00e9galement possible de b\u00e2tir une strat\u00e9gie d&rsquo;<em>alerting<\/em> bas\u00e9e sur les donn\u00e9es recueillies.<\/p>\n<h1>Fonctionnement<\/h1>\n<p>L&rsquo;exposition des m\u00e9triques se fait gr\u00e2ce \u00e0 un <em>exporter<\/em> d\u00e9ploy\u00e9 au sein du service \u00e0 superviser. <a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a> dispose de plusieurs <a href=\"https:\/\/prometheus.io\/docs\/instrumenting\/exporters\/\" target=\"_blank\" rel=\"noopener noreferrer\"><em>exporters<\/em> pour les produits les plus courants<\/a>.<\/p>\n<p>WebLogic n&rsquo;apparait pas dans cette <a href=\"https:\/\/prometheus.io\/docs\/instrumenting\/exporters\/\" target=\"_blank\" rel=\"noopener noreferrer\">liste<\/a> mais il existe un projet open source sous Git Hub qui impl\u00e9mente un <em>exporter<\/em> sp\u00e9cifique pour WebLogic Server : <a href=\"https:\/\/github.com\/oracle\/weblogic-monitoring-exporter\" target=\"_blank\" rel=\"noopener noreferrer\">WebLogic Monitoring Exporter<\/a>.<\/p>\n<p>Cet exporter se pr\u00e9sente sous la forme d&rsquo;une application web wls-exporter.war qu&rsquo;il faut d\u00e9ployer sur les serveurs WebLogic \u00e0 superviser.<\/p>\n<p>Cette application web expose 2 urls :<\/p>\n<ul>\n<li>\/metrics pour r\u00e9cup\u00e9rer les m\u00e9triques configur\u00e9es<\/li>\n<li>\/configure pour configurer l&rsquo;exporter<\/li>\n<\/ul>\n<h1>Configuration<\/h1>\n<p>L&rsquo;acc\u00e8s aux m\u00e9triques est s\u00e9curis\u00e9, il faut montrer patte blanche. Le plus simple est de cr\u00e9er un utilisateur d\u00e9di\u00e9 \u00e0 <a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a> dans le <em>security realm<\/em> de WebLogic et de l&rsquo;affecter au groupe <em>Monitors<\/em>. Une liaison s\u00e9curis\u00e9e avec TLS est recommand\u00e9e.<\/p>\n<p>L&rsquo;acc\u00e8s \u00e0 la page de configuration (\/configure) n&rsquo;est pas s\u00e9curis\u00e9, l&rsquo;acc\u00e8s \u00e0 la consultation de la configuration est libre. Par contre, la modification de la configuration via l&rsquo;envoi d&rsquo;un nouveau fichier (appel HTTP POST) <span style=\"text-decoration: underline;\">est s\u00e9curis\u00e9e<\/span>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-504\" src=\"https:\/\/corsaire-consulting.fr\/blog\/wp-content\/uploads\/2019\/04\/weblogicmonitoringexporter_configure-300x145.png\" alt=\"\" width=\"300\" height=\"145\" srcset=\"https:\/\/corsaire-consulting.fr\/blog\/wp-content\/uploads\/2019\/04\/weblogicmonitoringexporter_configure-300x145.png 300w, https:\/\/corsaire-consulting.fr\/blog\/wp-content\/uploads\/2019\/04\/weblogicmonitoringexporter_configure-768x371.png 768w, https:\/\/corsaire-consulting.fr\/blog\/wp-content\/uploads\/2019\/04\/weblogicmonitoringexporter_configure-1024x495.png 1024w, https:\/\/corsaire-consulting.fr\/blog\/wp-content\/uploads\/2019\/04\/weblogicmonitoringexporter_configure.png 1350w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>La configuration de l&rsquo;exporter est embarqu\u00e9e directement dans l&rsquo;application web (wls-exporter.war) et il est possible de la remplacer ou de la comp\u00e9ter via la page de configuration (\/configure).<\/p>\n<p>[pastacode lang=\u00a0\u00bbmarkup\u00a0\u00bb manual=\u00a0\u00bbmetricsNameSnakeCase%3A%20true%0Aqueries%3A%0A-%20JVMRuntime%3A%0A%20%20%20%20key%3A%20name%0A%20%20%20%20prefix%3A%20jvm_%0A%20%20%20%20values%3A%20%5BheapFreeCurrent%2C%20heapFreePercent%2C%20heapSizeCurrent%2C%20heapSizeMax%2C%20uptime%2C%20processCpuLoad%5D%0A%0A-%20applicationRuntimes%3A%0A%20%20%20%20key%3A%20name%0A%20%20%20%20workManagerRuntimes%3A%0A%20%20%20%20%20%20prefix%3A%20workmanager_%0A%20%20%20%20%20%20key%3A%20applicationName%0A%20%20%20%20%20%20%0A-%20threadPoolRuntime%3A%0A%20%20%20%20key%3A%20name%0A%20%20%20%20prefix%3A%20threadpool_%0A%20%20%20%20values%3A%20%5BexecuteThreadTotalCount%2C%20throughput%2C%20hoggingThreadCount%2C%20standbyThreadCount%2C%20executeThreads%2C%20executeThreadIdleCount%5D%0A%20%20%0A-%20JTARuntime%3A%0A%20%20%20%20key%3A%20name%0A%20%20%20%20prefix%3A%20jta_%0A%20%20%20%20values%3A%20%5BactiveTransactionsTotalCount%5D%0A\u00a0\u00bb message=\u00a0\u00bbExemple de configuration WebLogic Monitoring Exporter\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>La page Git Hub du composant explique tr\u00e8s bien comment construire le livrable \u00e0 l&rsquo;aide de Maven.<\/p>\n<p>La solution dispose \u00e9galement d&rsquo;un composant compl\u00e9mentaire, <a href=\"https:\/\/github.com\/oracle\/weblogic-monitoring-exporter\/tree\/master\/config_coordinator\" target=\"_blank\" rel=\"noopener noreferrer\">WLS Prometheus Exporter Coordinator<\/a> d\u00e9velopp\u00e9 en GO qui permet de partager la configuration de l&rsquo;exporter quand il est d\u00e9ploy\u00e9 sur plusieurs instances WebLogic, dans un cluster par exemple. Il permet donc de garder toutes les configurations synchronis\u00e9es sur tous les serveurs. Il permet \u00e9galement de modifier \u00e0 chaud cette configuration sur tous les serveurs d&rsquo;un coup sans avoir besoin de red\u00e9ployer l&rsquo;application.<\/p>\n<h1>Retour d&rsquo;exp\u00e9rience<\/h1>\n<p>L&rsquo;approche propos\u00e9e par les <em>exporters<\/em> Prometheus est int\u00e9ressante car elle permet en 1 seul appel HTTP(s) de r\u00e9cup\u00e9rer un ensemble de m\u00e9triques. Ce qui n&rsquo;est pas le cas par exemple si on utilise l&rsquo;<a href=\"https:\/\/docs.oracle.com\/cd\/E24329_01\/web.1211\/e26722\/toc.htm#RESTS150\" target=\"_blank\" rel=\"noopener noreferrer\">API REST Management de WebLogic Server<\/a> car il faudra 1 appel HTTP(s) par m\u00e9trique collect\u00e9e.<\/p>\n<h2>WebLogic Monitoring Exporter versus JMX Exporter<\/h2>\n<p><a href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus<\/a> dispose d&rsquo;un <em>exporter<\/em> officiel \u00ab\u00a0<a href=\"https:\/\/github.com\/prometheus\/jmx_exporter\" target=\"_blank\" rel=\"noopener noreferrer\">JMX Exporter<\/a>\u00a0\u00bb qui permet d&rsquo;exposer les m\u00e9triques souhait\u00e9es depuis une application Java pour peu qu&rsquo;elle dispose d&rsquo;un service JMX. Fonctionnellement cet exporter fait la m\u00eame chose, \u00e0 savoir exposer via HTTP une liste de m\u00e9triques pr\u00e9-configur\u00e9e. Cette configuration n&rsquo;est pas dynamique par contre.<\/p>\n<p>Techniquement, cette solution demande de d\u00e9ployer un agent Java sur chaque JVM ce qui est un peu plus compliqu\u00e9 et offre moins de souplesse que l&rsquo;application web propos\u00e9e par <a href=\"https:\/\/github.com\/oracle\/weblogic-monitoring-exporter\" target=\"_blank\" rel=\"noopener noreferrer\">WebLogic Monitoring Exporter<\/a>. L&rsquo;application web peut \u00eatre d\u00e9ploy\u00e9e, retir\u00e9e, d\u00e9marr\u00e9e stopp\u00e9e \u00e0 la demande et sans arr\u00eat\/relance du serveur WebLogic, ce qui n&rsquo;est pas le cas avec l&rsquo;agent du JMX Exporter.<\/p>\n<h2>Fonctionnement de WebLogic Monitoring Exporter<\/h2>\n<p>La mauvaise surprise !<\/p>\n<h3>Probl\u00e8me #1<\/h3>\n<p>J&rsquo;ai \u00e9t\u00e9 sans doute un peu na\u00eff sur ce coup mais quelle ne fut pas ma surprise en lisant le code et en comprenant comment fonctionne le composant. La r\u00e9cup\u00e9ration des m\u00e9triques se fait via un appel HTTP-POST vers l&rsquo;API Management RESTful du serveur WebLogic (POST \/management\/weblogic\/latest\/serverRuntime\/search). En clair, chaque appel vers \/metrics sur un serveur provoque <em>n<\/em> appels vers lui-m\u00eame pour r\u00e9cup\u00e9rer les m\u00e9triques. Si vous avez par exemple besoin de m\u00e9triques sur JVMRuntime, JTARuntime et ThreadPoolRuntime le composant effectuera 3 appels.<\/p>\n<p>Donc au total, la lecture des donn\u00e9es depuis Prometheus donnera lieu \u00e0 4 appels HTTP :<\/p>\n<ul>\n<li>1 entre Prometheus et le serveur WebLogic<\/li>\n<li>3 entre le serveur WebLogic et lui-m\u00eame (!)<\/li>\n<\/ul>\n<p>A multiplier par le nombre de serveurs WebLogic dans le domaine&#8230;<\/p>\n<p>Pas tr\u00e8s optimis\u00e9 tout \u00e7a, y&rsquo;a moyen de faire mieux.<\/p>\n<h3>Probl\u00e8me #2<\/h3>\n<p>De plus, mes tests sur ce composant ont relev\u00e9 2 probl\u00e8mes pour lesquels j&rsquo;ai ouvert un bug sur le site <a href=\"https:\/\/github.com\/oracle\/weblogic-monitoring-exporter\/issues\" target=\"_blank\" rel=\"noopener noreferrer\">Git Hub du composant :<\/a><\/p>\n<ul>\n<li>Si les serveurs WebLogic tournent sous MS-Windows (si si \u00e7a existe), Prometheus est incapable de \u00ab\u00a0parser\u00a0\u00bb les m\u00e9triques renvoy\u00e9s par l&rsquo;exporter \u00e0 cause des caract\u00e8res de fin de ligne : Prometheus attend une fin de ligne \u00e0 la mode Linux\/Unix, c&rsquo;est \u00e0 dire \\n alors que sous Windows les fins de ligne sont signifi\u00e9es avec les caract\u00e8res \\n\\r (Carriage return, line feed)<\/li>\n<li>Prometheus ne sait \u00ab\u00a0parser\u00a0\u00bb les nombres \u00e0 virgules que si le s\u00e9parateur d\u00e9cimal est le point \u00ab\u00a0.\u00a0\u00bb, ce qui n&rsquo;est pas le cas du fran\u00e7ais qui utilise la virgule&#8230;<\/li>\n<\/ul>\n<p>J&rsquo;ai bon espoir que ces 2 points soient pris en compte et corrig\u00e9s rapidement. Dans le cas contraire, les corrections sont simples \u00e0 r\u00e9aliser soi-m\u00eame sur le code.<\/p>\n<h3>Probl\u00e8me #3<\/h3>\n<p><em>Last but not least<\/em>. L&rsquo;url vers l&rsquo;API RESTful Management de WebLogic est dans le code du composant : \/management\/weblogic\/latest\/serverRuntime\/search<\/p>\n<p>Elle pointe directement vers le contexte serverRuntime de l&rsquo;API REST. En cons\u00e9quence :<\/p>\n<ul>\n<li>J&rsquo;ai pas trouv\u00e9 comment acc\u00e9der aux m\u00e9triques globales du domaine<\/li>\n<li>J&rsquo;ai pas trouv\u00e9 comment acc\u00e9der aux m\u00e9triques du serveur lui-m\u00eame car le mod\u00e8le de configuration impose d&rsquo;aller chercher des informations dans les sous-contextes de serverRuntime (JTARuntime, JVMRuntime, etc&#8230;)<\/li>\n<\/ul>\n<p>De ce fait, il n&rsquo;est pas possible de r\u00e9cup\u00e9rer l&rsquo;\u00e9tat du serveur (RUNNING) par exemple. Une gageure pour un outil de monitoring&#8230;<\/p>\n<p>Je garde un petit espoir d&rsquo;y arriver mais c&rsquo;est pas gagn\u00e9.<\/p>\n<h1>Conclusion<\/h1>\n<p>Le composant est tr\u00e8s jeune ce qui explique sans doute les d\u00e9fauts que je lui ait trouv\u00e9. Je pense que la conception m\u00e9riterait de tirer un meilleur parti des concepts et fonctionnalit\u00e9s offertes par WebLogic pour am\u00e9liorer et optimiser le fonctionnement du composant. Pourquoi, par exemple, interroger tous les serveurs du domaine alors que le serveur d&rsquo;administration \u00e0 lui-seul d\u00e9tient d\u00e9j\u00e0 toutes les informations sur les m\u00e9triques collect\u00e9es ?<\/p>\n<p>Si certains ont des exp\u00e9riences diff\u00e9rentes avec ce composant je serai ravi de lire leurs commentaires sur le sujet et d&rsquo;en discuter.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article pr\u00e9sente un petit retour d&rsquo;exp\u00e9rience sur l&rsquo;int\u00e9gration de WebLogic Server avec l&rsquo;outil de monitoring de plus en plus populaire et open-source, Prometheus. L&rsquo;int\u00e9gration technique est r\u00e9alis\u00e9e via le composant open-source WebLogic Monitoring Exporter. L&rsquo;objectif n&rsquo;est pas de d\u00e9tailler cette int\u00e9gration mais d&rsquo;exprimer mon feedback sur ce composant. Plusieurs articles, comme celui-l\u00e0, exposent d\u00e9j\u00e0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":512,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[7,4],"tags":[79,78,31,80],"class_list":["post-473","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-weblogic","tag-monitoring","tag-prometheus","tag-weblogic","tag-weblogic-monitoring-exporter"],"_links":{"self":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"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=473"}],"version-history":[{"count":25,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/473\/revisions"}],"predecessor-version":[{"id":523,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/473\/revisions\/523"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media\/512"}],"wp:attachment":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}