{"id":405,"date":"2015-11-16T14:49:00","date_gmt":"2015-11-16T14:49:00","guid":{"rendered":"http:\/\/onlinelab.info\/?p=405"},"modified":"2015-11-16T14:49:00","modified_gmt":"2015-11-16T14:49:00","slug":"introducing-javamelody-for-server-monitoring","status":"publish","type":"post","link":"https:\/\/www.asianux.org.vn\/index.php\/2015\/11\/16\/introducing-javamelody-for-server-monitoring\/","title":{"rendered":"Introducing JavaMelody for Server Monitoring"},"content":{"rendered":"<p>The goal of <a href=\"https:\/\/code.google.com\/p\/javamelody\/\" target=\"_blank\" rel=\"noopener\">JavaMelody<\/a> is to monitor Java or Java EE application servers in QA and production environments.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/javamelody.googlecode.com\/svn\/trunk\/javamelody-core\/src\/site\/resources\/screenshots\/graphs.png\" alt=\"JavaMelody Sample Graph\" title=\"\"><\/p>\n<p>The really nice thing is sthe storage of historical data &#8211; you can have a look at the same graphs spanning a week, a month or a year without setting up any additional infrastructure. Therefore JavaMelody is installed on every production system I work on.<\/p>\n<h1>Securing JavaMelody Installation<\/h1>\n<p>If you want BASIC authentication with username and password, but do no want to use a realm and &#8220;security-constraint&#8221; in web.xml, you can add the parameter &#8220;authorized-users&#8221; in web.xml, in context or in system properties like the other javamelody parameters (since v1.53). For example in your WEB-INF\/web.xml file:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-xml\"><span class=\"nt\">&lt;filter&gt;<\/span>\n        <span class=\"nt\">&lt;filter-name&gt;<\/span>monitoring<span class=\"nt\">&lt;\/filter-name&gt;<\/span>\n        <span class=\"nt\">&lt;filter-class&gt;<\/span>net.bull.javamelody.MonitoringFilter<span class=\"nt\">&lt;\/filter-class&gt;<\/span>\n        <span class=\"nt\">&lt;init-param&gt;<\/span>\n                <span class=\"nt\">&lt;param-name&gt;<\/span>authorized-users<span class=\"nt\">&lt;\/param-name&gt;<\/span>\n                <span class=\"nt\">&lt;param-value&gt;<\/span>user1:pwd1, user2:pwd2<span class=\"nt\">&lt;\/param-value&gt;<\/span>\n        <span class=\"nt\">&lt;\/init-param&gt;<\/span>\n<span class=\"nt\">&lt;\/filter&gt;<\/span><\/code><\/pre>\n<\/div>\n<h1>Security Manager<\/h1>\n<p>If you are running into an active security manager the following snippets helps<\/p>\n<div class=\"highlight\">\n<pre><code class=\"language-text\">grant codeBase \"file:${catalina.home}\/webapps\/&lt;your_webapp&gt;\/WEB-INF\/lib\/javamelody-x.jar\" {\n        permission java.security.AllPermission;\n};\ngrant codeBase \"file:${catalina.home}\/webapps\/&lt;your_webapp&gt;\/WEB-INF\/lib\/jrobin-1.5.9.1.jar\" {\n        permission java.security.AllPermission;\n};    \u00cf<\/code><\/pre>\n<\/div>\n<h1>Disabling JavaMelody<\/h1>\n<p>You can disable JavaMelody using<\/p>\n<ul>\n<li><strong>disabled=false<\/strong> using the init parameter in web.xml<\/li>\n<li>pass <strong>-Djavamelody.disabled=true<\/strong> as system property<\/li>\n<\/ul>\n<h1>Avoiding Unique Identifier URLs<\/h1>\n<p>JavaMelody created unique RRD files for each URL and SQL request so if you have thousands of unique URLs we need a lot of file handles and disk storage<\/p>\n<p>The proposed solution is to use the <strong>http-transform-pattern<\/strong> and <strong>sql-transform-pattern<\/strong> parameters. These options work is by replacing any part of the URL that matches the regular expression with a &#8220;$&#8221;.<\/p>\n<p>So setting http-transform-pattern to <strong><em>\\d+<\/em><\/strong> means that the URLs<strong><em>http:\/\/server\/get\/entity\/10<\/em><\/strong> and <strong><em>http:\/\/server\/get\/entity\/20<\/em><\/strong> both have their digits matched by the regular expression, and are then aggregated into the URL<strong><em>http:\/\/server\/get\/entity\/$<\/em><\/strong>. This in turn reduces the number of RRD files, as new ones are no longer created for every id.<\/p>\n<p>For more information check<a href=\"http:\/\/stackoverflow.com\/questions\/19147762\/javamelody-crashing-the-server-with-thousands-of-rrd-files\" target=\"_blank\" rel=\"noopener\">http:\/\/stackoverflow.com\/questions\/19147762\/javamelody-crashing-the-server-with-thousands-of-rrd-files<\/a>.<\/p>\n<h1>A More Complete Example<\/h1>\n<p>A small example working for Wildfly &#8220;Hello World&#8221;<\/p>\n<ul>\n<li>Use javamelody-core-1.54.0<\/li>\n<li>Use &#8220;javamelody:jm123&#8221; for HTTP Basic Authentication<\/li>\n<li>Use &#8220;\/admin\/javamelody&#8221; instead of &#8220;\/monitoring&#8221; to have a common &#8220;admin&#8221; infix for all URLs<\/li>\n<li>Store JavaMelody&#8217;s historical data under &#8220;\/Users\/sgoeschl\/temp\/javamelody\/wildfly-helloworld_klendathu.local&#8221; in my case<\/li>\n<li>Open [http:\/\/localhost:8080\/wildfly-helloworld\/admin\/javamelody|http:\/\/localhost:8080\/wildfly-helloworld\/admin\/javamelody]<\/li>\n<\/ul>\n<h2>Maven Integration<\/h2>\n<div class=\"highlight\">\n<pre><code class=\"language-xml\"><span class=\"c\">&lt;!-- Minimal dependencies for JavaMelody --&gt;<\/span>\n<span class=\"nt\">&lt;dependency&gt;<\/span>\n    <span class=\"nt\">&lt;groupId&gt;<\/span>net.bull.javamelody<span class=\"nt\">&lt;\/groupId&gt;<\/span>\n    <span class=\"nt\">&lt;artifactId&gt;<\/span>javamelody-core<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\n    <span class=\"nt\">&lt;version&gt;<\/span>1.54.0<span class=\"nt\">&lt;\/version&gt;<\/span>\n<span class=\"nt\">&lt;\/dependency&gt;<\/span>\n<span class=\"nt\">&lt;dependency&gt;<\/span>\n    <span class=\"nt\">&lt;groupId&gt;<\/span>org.jrobin<span class=\"nt\">&lt;\/groupId&gt;<\/span>\n    <span class=\"nt\">&lt;artifactId&gt;<\/span>jrobin<span class=\"nt\">&lt;\/artifactId&gt;<\/span>\n    <span class=\"nt\">&lt;version&gt;<\/span>1.5.9<span class=\"nt\">&lt;\/version&gt;<\/span>\n<span class=\"nt\">&lt;\/dependency&gt;<\/span><\/code><\/pre>\n<\/div>\n<h2>Web Application Integration<\/h2>\n<div class=\"highlight\">\n<pre><code class=\"language-xml\"><span class=\"nt\">&lt;web-app<\/span> <span class=\"na\">xmlns=<\/span><span class=\"s\">\"http:\/\/java.sun.com\/xml\/ns\/javaee\"<\/span> <span class=\"na\">xmlns:xsi=<\/span><span class=\"s\">\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"<\/span>\n         <span class=\"na\">xsi:schemaLocation=<\/span><span class=\"s\">\"http:\/\/java.sun.com\/xml\/ns\/javaee http:\/\/java.sun.com\/xml\/ns\/javaee\/web-app_2_5.xsd\"<\/span>\n         <span class=\"na\">version=<\/span><span class=\"s\">\"2.5\"<\/span><span class=\"nt\">&gt;<\/span>\n\n    <span class=\"nt\">&lt;display-name&gt;<\/span>WildFly Quickstart<span class=\"nt\">&lt;\/display-name&gt;<\/span>\n\n    <span class=\"nt\">&lt;filter&gt;<\/span>\n        <span class=\"nt\">&lt;filter-name&gt;<\/span>monitoring<span class=\"nt\">&lt;\/filter-name&gt;<\/span>\n        <span class=\"nt\">&lt;filter-class&gt;<\/span>net.bull.javamelody.MonitoringFilter<span class=\"nt\">&lt;\/filter-class&gt;<\/span>\n        <span class=\"nt\">&lt;init-param&gt;<\/span>\n            <span class=\"c\">&lt;!-- restrict access using HTTP basic authentication --&gt;<\/span>\n            <span class=\"nt\">&lt;param-name&gt;<\/span>authorized-users<span class=\"nt\">&lt;\/param-name&gt;<\/span>\n            <span class=\"nt\">&lt;param-value&gt;<\/span>javamelody:jm123<span class=\"nt\">&lt;\/param-value&gt;<\/span>\n        <span class=\"nt\">&lt;\/init-param&gt;<\/span>\n        <span class=\"nt\">&lt;init-param&gt;<\/span>\n            <span class=\"c\">&lt;!-- set a different URL for monitoring --&gt;<\/span>\n            <span class=\"nt\">&lt;param-name&gt;<\/span>monitoring-path<span class=\"nt\">&lt;\/param-name&gt;<\/span>\n            <span class=\"nt\">&lt;param-value&gt;<\/span>\/admin\/javamelody<span class=\"nt\">&lt;\/param-value&gt;<\/span>\n        <span class=\"nt\">&lt;\/init-param&gt;<\/span>\n        <span class=\"nt\">&lt;init-param&gt;<\/span>\n            <span class=\"c\">&lt;!-- enable\/disable JavaMelody --&gt;<\/span>\n            <span class=\"nt\">&lt;param-name&gt;<\/span>disabled<span class=\"nt\">&lt;\/param-name&gt;<\/span>\n            <span class=\"nt\">&lt;param-value&gt;<\/span>false<span class=\"nt\">&lt;\/param-value&gt;<\/span>\n        <span class=\"nt\">&lt;\/init-param&gt;<\/span>\n        <span class=\"nt\">&lt;init-param&gt;<\/span>\n            <span class=\"c\">&lt;!-- define an storage path for JavaMelodys historical data --&gt;<\/span>\n            <span class=\"nt\">&lt;param-name&gt;<\/span>storage-directory<span class=\"nt\">&lt;\/param-name&gt;<\/span>\n            <span class=\"nt\">&lt;param-value&gt;<\/span>\/Users\/sgoeschl\/temp\/javamelody<span class=\"nt\">&lt;\/param-value&gt;<\/span>\n        <span class=\"nt\">&lt;\/init-param&gt;<\/span>\n    <span class=\"nt\">&lt;\/filter&gt;<\/span>\n    <span class=\"nt\">&lt;filter-mapping&gt;<\/span>\n        <span class=\"nt\">&lt;filter-name&gt;<\/span>monitoring<span class=\"nt\">&lt;\/filter-name&gt;<\/span>\n        <span class=\"nt\">&lt;url-pattern&gt;<\/span>\/*<span class=\"nt\">&lt;\/url-pattern&gt;<\/span>\n    <span class=\"nt\">&lt;\/filter-mapping&gt;<\/span>\n    <span class=\"nt\">&lt;listener&gt;<\/span>\n        <span class=\"nt\">&lt;listener-class&gt;<\/span>net.bull.javamelody.SessionListener<span class=\"nt\">&lt;\/listener-class&gt;<\/span>\n    <span class=\"nt\">&lt;\/listener&gt;<\/span>\n\n<span class=\"nt\">&lt;\/web-app&gt;<\/span><\/code><\/pre>\n<\/div>\n<hr \/>\n<footer>\n<p class=\"byline\"><strong>Introducing JavaMelody for Server Monitoring<\/strong> was published on January 17, 2015.<\/p>\n<\/footer>\n","protected":false},"excerpt":{"rendered":"<p>The goal of JavaMelody is to monitor Java or Java EE application servers in QA and production environments. The really nice thing is sthe storage of historical data &#8211; you can have a look at&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-405","post","type-post","status-publish","format-standard","hentry","category-he-thong"],"_links":{"self":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts\/405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/comments?post=405"}],"version-history":[{"count":0,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts\/405\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/media?parent=405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/categories?post=405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/tags?post=405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}