{"id":21093,"date":"2022-02-22T08:08:47","date_gmt":"2022-02-22T13:08:47","guid":{"rendered":"https:\/\/www.eginnovations.com\/blog\/?p=21093"},"modified":"2024-07-02T06:51:31","modified_gmt":"2024-07-02T10:51:31","slug":"end-to-end-application-monitoring","status":"publish","type":"post","link":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/","title":{"rendered":"End-to-End Application Monitoring Helps Troubleshoot Application Slowness"},"content":{"rendered":"<div class=\"inner_content\">\n<h2>How to Troubleshoot Java Application Slowness: A Real-World Example<\/h2>\n<p>In this blog, I\u2019ll cover a real-world example of application performance troubleshooting a Java web app, hosted on <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/jboss-monitoring\" target=\"blank\" rel=\"noopener noreferrer\">JBoss Wildfly<\/a> using <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/microsoft-sql-server-performance-monitoring\" target=\"blank\" rel=\"noopener noreferrer\">Microsoft SQL<\/a> as the backend database, including details of the analysis and diagnosis we had to perform in order to identify the root-cause of, and resolve, the performance issue. The issue manifested with symptoms including high CPU in the JBoss JVM, elevated garbage collection and database connection issues including timeouts \u2013 the issue was isolated to an issue in the JDBC database driver used by the application server and not in the database server itself. The full analysis below should give the reader insight into how to identify and eliminate other issues and a deeper understanding of the full stack between the JVM and database, and how even a small component of an application delivery chain, such as a driver, can significantly affect application performance.<\/p>\n<h3>Application Performance was Poor: Where was the Bottleneck?<\/h3>\n<p>The application in question was a Java-based web application, deployed using JBoss Wildfly as the web application server and utilizing Microsoft SQL as the backend database. SQL had been configured in an active\/passive clustering mode for high availability. Java 12 was used for the application and <a href=\"http:\/\/jtds.sourceforge.net\/\" target=\"blank\" rel=\"noopener noreferrer\">jTDS<\/a> was the JDBC driver used by the application to access the database.<\/p>\n<p>The application had been newly deployed in production and had been working acceptably until user load increased. With the increase in load, the application became slower and slower. The customer\u2019s IT team did not have the expertise to assist with the diagnosis and our professional services team was engaged to assist them in identifying the cause of the application slowdown.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/synthetic-monitoring\" rel=\"noopener noreferrer\">Synthetic monitoring<\/a> of the web application using eG Enterprise indicated that there was a problem. While web response times were acceptable, there were many connection timeouts seen and as a result the JBoss web server availability metrics indicated problems occurring multiple times daily (see Figure 1).<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/web-front-end-performance-view.jpg\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-21105\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/web-front-end-performance.jpg?20\" alt=\"Web front-end performance\" width=\"850\" height=\"349\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 1: Web front-end performance measured by synthetic monitoring \u2013 as measured over 4 days<\/div>\n<h3>Troubleshooting Whether the Application Tiers were Slow<\/h3>\n<p>Agents were deployed on all the key tiers of the application to get an inside view of performance. <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/jmx-monitoring\" target=\"blank\" rel=\"noopener noreferrer\">JMX (Java Management Extensions)<\/a> was used to track the Java virtual machine performance. CPU usage of the JBoss JVM was seen to have spiked significantly with increased load (see Figure 2).<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/measurement-cup-usage-view.jpg\" data-rel=\"lightbox-image-1\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21106 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/measurement-cup-usage.jpg?20\" alt=\"measurement of Java CPU usage\" width=\"500\" height=\"384\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 2: Measurement of the CPU usage of the Java virtual machine of the JBoss application server<\/div>\n<p>Analysis of the JVM\u2019s garbage collectors indicated that garbage collection was taking more time than previously. Garbage collections can also increase if there is a memory leak in the application; however, our analysis did not find evidence to indicate that there was a memory leak. Excessive garbage collections can increase a JVM\u2019s CPU usage, so CPU usage could have been an effect and garbage collection the trigger for this. The next question was why GC activity had gone up?<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/garbage-collection-view.jpg\" data-rel=\"lightbox-image-2\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21107 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/garbage-collection.jpg?20\" alt=\"Java Garbage collection activity\" width=\"500\" height=\"340\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 3: Garbage collection activity inside the JVM<\/div>\n<p>Around the time CPU usage and GC activity had increased, we also observed a significant increase in the number of connections from the application server to the database server. During normal operation of the application, only a small number connections (10 or so) were used. But when the application slowdown happened, almost a thousand connections to the database were in use. This seemed to indicate that there was a problem in the either the database tier or communication with that tier.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/database-connections-view.jpg\" data-rel=\"lightbox-image-3\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21108 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/database-connections.jpg?20\" alt=\"Database connections from JBoss tier\" width=\"500\" height=\"330\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 4: Database connections from the JBoss tier to the SQL database server<\/div>\n<p><a href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring\/free-trial\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21367 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner.jpg\" alt=\"End-to-End monitoring of applications\" width=\"850\" height=\"160\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner-300x56.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner-768x145.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner-800x151.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner-310x58.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/E2E-banner-140x26.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/a><\/p>\n<h3>Is the Database Tier Slow?<\/h3>\n<p>When this finding was reported, the database team were adamant that the database tier itself was functioning correctly. All the monitoring and diagnosis tools they were using did not indicate any slowness on their database servers.<\/p>\n<p>The SQL database had been configured in an active\/passive cluster and SSL was enabled for all connections. Domain authentication was configured so only domain authenticated users could access the database server.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/cpu-utilization-view.jpg\" data-rel=\"lightbox-image-4\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-21109\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/cpu-utilization.jpg?20\" alt=\"CPU utilization of database cluster\" width=\"500\" height=\"320\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 5: CPU utilization of the database cluster shows there is no resource bottleneck in the database tier<\/div>\n<p>Monitoring of resource utilization levels on the database servers did indicate that the database team was correct and provided data to validate their conclusions. CPU utilization was well below 1% (see Figure 5). There was also no evidence of any long running queries, query blocking, high I\/O activity like full table scans, etc. So where was the issue? This was the perplexing question.<\/p>\n<p>External monitoring of the database server gave a clue. See Figure 6. This indicated that when a connection to the database server was initiated, a query was issued and the response processed, over 99% of the time was spent in connection establishment. The query itself was executed very quickly. This was surprising to all the teams involved.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/database-resonse-times-view.jpg\" data-rel=\"lightbox-image-5\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21110 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/database-resonse-times.jpg?20\" alt=\"Database response time details\" width=\"850\" height=\"466\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 6: Breakdown of database response time as shown in the eG Enterprise console. You can see that the connection establishment time is several times higher than the query processing time.<\/div>\n<h3>Where was the Problem Then?<\/h3>\n<p>Although the database tier was working well, there were thousand plus connections used by the application to access the database tier. To investigate this further, we checked the status of Java threads in the application server\u2019s JVM. We could see several hundred threads were stuck waiting on the jTDS JDBC driver (see Figure 7). Reading the stack traces bottom up, we could see that when the application used the JDBC driver to connect to the database, the driver had issued a call to the getMAC function which in turn used Java\u2019s NetworkInterface class. All of the Java threads on the application server were waiting on the Java NetworkInterface class.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21111 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections.jpg\" alt=\"Java threads running in an application server\" width=\"850\" height=\"296\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections-300x104.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections-768x267.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections-800x279.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections-310x108.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/thread-connections-140x49.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/p>\n<div class=\"img_caption\">Figure 7: Several hundred threads in the application server were waiting to establish connections to the database tier<\/div>\n<div class=\"link_list_style\" style=\"padding: 1px 25px 5px; margin-bottom: 30px;\">\n<h3 style=\"margin-bottom: -15px;\">What is a Database Driver?<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-21112 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/java-applicaton-connections.png\" alt=\"How JDBC works\" width=\"240\" height=\"310\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/java-applicaton-connections.png 240w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/java-applicaton-connections-232x300.png 232w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/java-applicaton-connections-140x181.png 140w\" sizes=\"auto, (max-width: 240px) 100vw, 240px\" \/><\/p>\n<p style=\"margin-bottom: 15px;\">A database driver is a software component that enables an application to interact with a database the database server. The drivers used depends upon the language used for the application. Under-the-hood, a database driver converts the SQL queries issued by an application into a protocol language that enables it to communicate with a database server and accept the returned results from the query back into the application.<\/p>\n<p style=\"margin-bottom: 15px;\">To connect with individual databases from a Java application, the JDBC (Java Database Connectivity API) requires drivers for each database. The JDBC driver gives out the connection to the database and implements the protocol for transferring the query and result between client and database.<\/p>\n<p style=\"margin-bottom: 15px;\">JDBC technology drivers fit into one of four categories.<\/p>\n<ol>\n<li>JDBC-ODBC bridge<\/li>\n<li>Native-API driver<\/li>\n<li>Network-Protocol driver (Middleware driver)<\/li>\n<li>Database-Protocol driver (Pure Java driver) or thin driver.<\/li>\n<\/ol>\n<\/div>\n<p>The Java thread analysis corroborated our other evidence &#8211; that for some reason, connecting to the database server was taking far more time than the execution of a query on the database tier. The fact that the Java threads were waiting on a local method call (java.net.NetworkInterface.getByInetAddress0) and not on the database server indicated that the performance bottleneck seemed to be on the application server end, i.e. within the JDBC driver used by the application server and not in the database server itself.<\/p>\n<h3>Diagnosing and Resolving the Application Performance Issue<\/h3>\n<p>We were able to identify the issue by analyzing the JDBC driver&#8217;s code. Every time a connection was required to the database, the socket\u2019s local address was obtained and through it the local network interface address was obtained (see lines 296 of Figure 8). The hardware address for this network interface was determined and the driver was communicating this information back to the database server (see lines 297 of Figure 8). This was being done because SQL server is licensed by unique clients accessing it and the database driver is identifying the client using the MAC address of the network interface it is using.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21113 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code.jpg\" alt=\"JDBC database driver code causes performance bottleneck\" width=\"850\" height=\"709\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code-300x250.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code-768x641.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code-800x667.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code-310x259.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-database-driver-code-140x117.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/p>\n<div class=\"img_caption\">Figure 8: The jTDS database driver code that caused the performance bottleneck<\/div>\n<p>What we discovered was that if the system on which the jTDS driver was executing (i.e., the client system accessing the database server) had a few network interfaces, finding the MAC address could be done in a few milliseconds. However, as the number of network interface cards on the client system increased, so did the time taken to find the MAC address!<\/p>\n<table class=\"hand-table\">\n<tbody>\n<tr>\n<td style=\"width: 70px;\"><img loading=\"lazy\" decoding=\"async\" alt=\"hand-icon\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/07\/hand-left.png\" width=\"58\" height=\"58\" border=\"0\" \/><\/td>\n<td style=\"padding-left: 0px; padding-top: 20px;\">So the performance bottleneck was in the database driver used by the application server and not in the database server itself!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A closer look at the code revealed that the IP address to hardware address resolution is done every time a new connection is established. The application server used database connection pooling. During normal circumstances, connections were pre-loaded in the pool and the application performance was good because connection establishment was done when the application started and not when users accessed the application. When the application server had high load, additional connections were needed, and it was at this time that new connections were attempted to the database server. It was when there were additional requests to be processed, the database connection establishment became a problem and it was this that caused the slowness in application access.<\/p>\n<table class=\"hand-table\">\n<tbody>\n<tr>\n<td style=\"width: 70px;\"><img loading=\"lazy\" decoding=\"async\" alt=\"hand-icon\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/07\/hand-left.png\" width=\"58\" height=\"58\" border=\"0\" \/><\/td>\n<td style=\"padding-left: 0px; padding-top: 20px;\">To resolve the problem, the database driver code was modified. A mapping of local IP address to hardware address was maintained in a memory cache in the database driver. Since the application only used the same local address each time, it meant that the hardware address was obtained from the memory cache itself. This saved significant time during database connection establishment.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Another option, to address the same problem, would have been to detect the MAC address manually and to specify this in the jTDS URL format. See the jTDS URL format below and a specification of how the MAC address can be provided in the URL itself.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21114 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address.jpg\" alt=\"jTDS driver for Java applications\" width=\"850\" height=\"204\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address-300x72.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address-768x184.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address-800x192.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address-310x74.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/jtds-url-mac-address-140x34.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/p>\n<p>After our change, you can see from Figure 9 that response times for accessing the SQL database cluster decreased significantly. There were also fewer SQL connection problems as seen by SQL availability remaining at 100%.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/performance-sql-database-view.jpg\" data-rel=\"lightbox-image-6\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21115 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/performance-sql-database.jpg?20\" alt=\"Performance of the SQL database cluster\" width=\"850\" height=\"285\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 9: Performance of the SQL database cluster after the JDBC driver change. Notice the significant reduction in availability issues and in database response time<\/div>\n<p>Improvements were seen in the web application\u2019s availability as well. Notice from Figure 10 that there have been no application availability drops after the JDBC driver modification discussed above. The number of simultaneous database connections used also dropped significantly and this directly resulted in a drop in CPU utilization of the application\u2019s JVM \u2013 see Figure 11.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/webapplicaton-access-view.jpg\" data-rel=\"lightbox-image-7\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-21116\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/webapplicaton-access.jpg?20\" alt=\"Web application access availability\" width=\"500\" height=\"320\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 10: Web application access availability also improved after the JDBC driver change<\/div>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/cpu-time-reduction-big.jpg\" data-rel=\"lightbox-image-8\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-21117 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/02\/cpu-time-reduction.jpg?noeresize\" alt=\"JVM CPU usage reduction\" width=\"500\" height=\"375\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 11: Significant reduction in CPU time used by the application server&#8217;s JVM<\/div>\n<p><a href=\"https:\/\/www.eginnovations.com\/white-paper\/java-application-performance\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-19985 size-full\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3.jpg\" alt=\"Troubleshoot Java application issues\" width=\"850\" height=\"200\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3-300x71.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3-768x181.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3-800x188.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3-310x73.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2018\/08\/java-whitepaper-3-140x33.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/a><\/p>\n<h3>End-to-End Monitoring: A Must for Effectively Resolving Performance Issues<\/h3>\n<p>The real-world example I have covered in this blog highlights the challenges in diagnosing and resolving performance issues with multi-tier applications.<\/p>\n<table class=\"hand-table\">\n<tbody>\n<tr>\n<td style=\"width: 70px;\"><img loading=\"lazy\" decoding=\"async\" alt=\"hand-icon\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/07\/hand-left.png\" width=\"58\" height=\"58\" border=\"0\" \/><\/td>\n<td style=\"padding-left: 0px; padding-top: 20px;\">The slowdown in this example resulted from an inefficiency in the JDBC database driver, an inconspicuous component in the application architecture. Yet, the impact of this inconspicuous component on application performance was huge.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Modern applications make use of many third-party libraries, drivers, modules, public domain components, and so on. As we saw in our example, inefficiencies in any of these components can greatly impact application performance. Pinpointing the application component that is responsible for a problem is a key to addressing the problem. To effectively monitor and troubleshoot application performance issues, it is important that every component of the application delivery chain must be monitored and performance anomalies highlighted.<\/p>\n<p>We have shown how monitoring several key parameters and thread-level insights were important in identifying the problem in the example we provided. <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-transaction-monitoring\" rel=\"noopener noreferrer\">Application transaction tracing for Java,<\/a> <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/microsoft-net-monitoring\" rel=\"noopener noreferrer\">Microsoft .NET<\/a>, and <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/php-monitoring-performance-tuning\" rel=\"noopener noreferrer\">PHP<\/a> applications can also provide great insights into any code-level, database, or third party component bottlenecks that impact application performance.<\/p>\n<p>eG Enterprise includes extensive monitoring capabilities for more than 200+ application technologies and a large number of underlying infrastructure platforms. To view a complete list of supported platforms, see <a href=\"https:\/\/www.eginnovations.com\/product\/technologies\" rel=\"noopener noreferrer\">https:\/\/www.eginnovations.com\/product\/technologies<\/a><\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/eg-enterprise-work-model-view.jpg\" data-rel=\"lightbox-image-9\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-21118\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/eg-enterprise-work-model.jpg?22\" alt=\"eG Enterprise work model\" width=\"850\" height=\"300\" border=\"0\" \/><\/a><\/p>\n<div class=\"img_caption\">Figure 12: How eG Enterprise works<\/div>\n<p>Figure 12 highlights how eG Enterprise works. Performance metrics are collected using different means. From logs, from WMI, from performance counters, using APIs, etc. These metrics are analyzed and any performance anomalies are flagged. An <a href=\"https:\/\/www.eginnovations.com\/blog\/aiops-tools-capabilities\/\" rel=\"noopener noreferrer\">AIOps engine analyzes the anomalies<\/a> from each tier of the application delivery chain and correlates between these anomalies to determine where the root-cause of the problem lies. Intelligent and automated diagnosis makes it possible for even help desk staff to effectively triage problems and get the right domain experts involved. Doing so reduces the mean time to repair (MTTR) and enhances application availability and user satisfaction.<\/p>\n<h3>For More Information:<\/h3>\n<ul>\n<li>Download our comprehensive survey on APM usage trends and data from: <a href=\"https:\/\/www.eginnovations.com\/ebooks\/application-performance-monitoring-survey\" rel=\"noopener noreferrer\">Application Performance Monitoring in the New Normal | eG Innovations<\/a><\/li>\n<li><a href=\"https:\/\/www.eginnovations.com\/ebooks\/aiops-solutions-strategies\" rel=\"noopener noreferrer\">Download our AIOps Solutions &amp; Strategies eBook now<\/a><\/li>\n<li>If you enjoyed this Postmortem blog post \u2013 you may enjoy this similar one, <a href=\"https:\/\/www.eginnovations.com\/blog\/troubleshooting-web-application-performance\/\" rel=\"noopener noreferrer\">Troubleshooting Web Application Performance &amp; SSL Issues<\/a><\/li>\n<li>An overview of <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-application-monitoring\" rel=\"noopener noreferrer\">Java Performance Monitoring Tools,<\/a> which enable you to prioritize problems automatically and provide actionable notifications<\/li>\n<li>How to Troubleshoot Java CPU Usage Issues: <a href=\"https:\/\/www.eginnovations.com\/blog\/troubleshoot-java-cpu-issues\/\" rel=\"noopener noreferrer\">Troubleshoot Java CPU Usage | JVM High CPU Threads<\/a><\/li>\n<li><a href=\"https:\/\/www.eginnovations.com\/blog\/top-10-java-performance-problems\/\" rel=\"noopener noreferrer\">Top 10 Java Performance Problems<\/a> \u2013 An in-depth guide to the most common Java issues and identifying them<\/li>\n<li><a href=\"https:\/\/www.eginnovations.com\/white-paper\/ssl-monitoring\" rel=\"noopener noreferrer\">Monitoring SSL Certificates in Business-Critical Applications<\/a> (eginnovations.com)<\/li>\n<li><a href=\"https:\/\/www.eginnovations.com\/blog\/aiops-tools-capabilities\/\" rel=\"noopener noreferrer\">AIOps Tools \u2013 8 Proactive Monitoring Tips | eG Innovations<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>How to Troubleshoot Java Application Slowness: A Real-World Example In this blog, I\u2019ll cover a real-world example of application performance troubleshooting a Java web app, hosted on JBoss Wildfly using Microsoft SQL as the backend database, including details of the analysis and diagnosis we had to perform in order to identify the root-cause of, and [&hellip;]<\/p>\n","protected":false},"author":48,"featured_media":21128,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_lmt_disableupdate":"no","_lmt_disable":"","footnotes":""},"categories":[371,366,27],"tags":[349,1182,52,1768,115,1152,979,1767,142,500,1770,568,1769,176,569,570,1203,636,1766,749],"class_list":["post-21093","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-performance-monitoring-apm","category-end-to-end-monitoring-e2e","category-java-monitoring","tag-apm","tag-appdynamics","tag-application-performance-monitoring","tag-appoptics","tag-cloud-monitoring","tag-datadog","tag-dynatrace","tag-end-to-end-apm","tag-end-to-end-monitoring-e2e","tag-java-application","tag-java-cpu","tag-java-database-issues","tag-java-heap-memory","tag-java-monitoring","tag-jdbc-drivers","tag-jdbc-performance","tag-newrelic","tag-observability","tag-troubleshoot-application","tag-troubleshoot-slowness"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>End-to-End Application Monitoring to Troubleshoot Slowness<\/title>\n<meta name=\"description\" content=\"Read this real-world example of end-to-end monitoring of application performance. Learn how to identify root causes of application slowness.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"End to End Application Monitoring \u2013 Java Database Problems | eG Innovations\" \/>\n<meta property=\"og:description\" content=\"Read about this real-world example of application performance troubleshooting in a Java web application, hosted on JBoss Wildfly. Find out how to identify root causes of application performance issues.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/\" \/>\n<meta property=\"og:site_name\" content=\"eG Innovations\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/eGInnovations\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-22T13:08:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-02T10:51:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-fb.jpg\" \/>\n<meta name=\"author\" content=\"Chitra R\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"End to End Application Monitoring \u2013 Java Database Problems | eG Innovations\" \/>\n<meta name=\"twitter:description\" content=\"Read about this real-world example of application performance troubleshooting in a Java web application, hosted on JBoss Wildfly. Find out how to identify root causes of application performance issues.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-fb.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:site\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chitra R\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"End-to-End Application Monitoring to Troubleshoot Slowness","description":"Read this real-world example of end-to-end monitoring of application performance. Learn how to identify root causes of application slowness.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/","og_locale":"en_US","og_type":"article","og_title":"End to End Application Monitoring \u2013 Java Database Problems | eG Innovations","og_description":"Read about this real-world example of application performance troubleshooting in a Java web application, hosted on JBoss Wildfly. Find out how to identify root causes of application performance issues.","og_url":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/","og_site_name":"eG Innovations","article_publisher":"https:\/\/www.facebook.com\/eGInnovations","article_published_time":"2022-02-22T13:08:47+00:00","article_modified_time":"2024-07-02T10:51:31+00:00","og_image":[{"url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-fb.jpg","type":"","width":"","height":""}],"author":"Chitra R","twitter_card":"summary_large_image","twitter_title":"End to End Application Monitoring \u2013 Java Database Problems | eG Innovations","twitter_description":"Read about this real-world example of application performance troubleshooting in a Java web application, hosted on JBoss Wildfly. Find out how to identify root causes of application performance issues.","twitter_image":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-fb.jpg","twitter_creator":"@eginnovations","twitter_site":"@eginnovations","twitter_misc":{"Written by":"Chitra R","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#article","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/"},"author":{"name":"Chitra R","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/859ddbe6b9e93bdc2ed8653bf25ee211"},"headline":"End-to-End Application Monitoring Helps Troubleshoot Application Slowness","datePublished":"2022-02-22T13:08:47+00:00","dateModified":"2024-07-02T10:51:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/"},"wordCount":2201,"commentCount":0,"publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-thumbnail.jpg","keywords":["apm","appdynamics","application performance monitoring","AppOptics","Cloud Monitoring","datadog","Dynatrace","end-to-end APM","end-to-end monitoring","Java application","Java CPU","Java Database issues","Java heap memory","Java Monitoring","JDBC drivers","JDBC performance","NewRelic","observability","troubleshoot application","troubleshoot slowness"],"articleSection":["Application Performance Monitoring (APM)","End-to-End Monitoring (E2E)","Java Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/","url":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/","name":"End-to-End Application Monitoring to Troubleshoot Slowness","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#primaryimage"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-thumbnail.jpg","datePublished":"2022-02-22T13:08:47+00:00","dateModified":"2024-07-02T10:51:31+00:00","description":"Read this real-world example of end-to-end monitoring of application performance. Learn how to identify root causes of application slowness.","breadcrumb":{"@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#primaryimage","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-thumbnail.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2022\/01\/E2E-thumbnail.jpg","width":362,"height":235},{"@type":"BreadcrumbList","@id":"https:\/\/www.eginnovations.com\/blog\/end-to-end-application-monitoring\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.eginnovations.com\/blog\/"},{"@type":"ListItem","position":2,"name":"End-to-End Application Monitoring Helps Troubleshoot Application Slowness"}]},{"@type":"WebSite","@id":"https:\/\/www.eginnovations.com\/blog\/#website","url":"https:\/\/www.eginnovations.com\/blog\/","name":"eG Innovations","description":"IT Performance Monitoring Insights","publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.eginnovations.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.eginnovations.com\/blog\/#organization","name":"eG Innovations","alternateName":"eg innovations","url":"https:\/\/www.eginnovations.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","width":362,"height":235,"caption":"eG Innovations"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/eGInnovations","https:\/\/x.com\/eginnovations"]},{"@type":"Person","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/859ddbe6b9e93bdc2ed8653bf25ee211","name":"Chitra R","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/eb8b8e6e2ccdb4e31be60650037cbc13?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb8b8e6e2ccdb4e31be60650037cbc13?s=96&d=mm&r=g","caption":"Chitra R"},"url":"https:\/\/www.eginnovations.com\/blog\/author\/chitra-r\/"}]}},"modified_by":"eG Innovations","_links":{"self":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/21093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/comments?post=21093"}],"version-history":[{"count":0,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/21093\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media\/21128"}],"wp:attachment":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media?parent=21093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/categories?post=21093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/tags?post=21093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}