Giter Club home page Giter Club logo

tomcat_exporter's People

Contributors

albybum avatar arixmkii avatar damiansz7 avatar dependabot[bot] avatar nlighten avatar ricardona avatar rswart avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tomcat_exporter's Issues

Looking for docker platform

I want use this for container platform.

My tomcat running in docker environment.

Can you guide me how I can use this without rebuilding tomcat application (docker)

May be I can run this as a separate container and collect metrics from tomcat application (docker).

Getting the ClassCastException exception when added the resource in the context.xml

Getting the ClassCastException exception when added the resource in the context.xml

Caused by: java.lang.ClassCastException: class nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor cannot be cast to class org.apache.tomcat.jdbc.pool.JdbcInterceptor

[2020-11-12 02:02:17,227] Artifact iis:war exploded: Artifact is being deployed, please wait...
12-Nov-2020 14:02:26.881 INFO [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/Users/kalpesh/javawork/trunk/iis/ims_tomcat/webapps/manager]
12-Nov-2020 14:02:31.929 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.jdbc.pool.ConnectionPool.init Unable to inform interceptor of pool start.
	java.lang.ClassCastException: class nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor cannot be cast to class org.apache.tomcat.jdbc.pool.JdbcInterceptor (nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor is in unnamed module of loader java.net.URLClassLoader @6572421; org.apache.tomcat.jdbc.pool.JdbcInterceptor is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @2ff5353f)
		at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:466)
		at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154)
		at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
		at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
		at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:560)
		at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:244)
		at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:96)
		at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:330)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:857)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:160)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:174)
		at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1017)
		at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:557)
		at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:253)
		at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5044)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
		at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
		at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
		at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1727)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)
		at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)
		at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:456)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:405)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)
		at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)
		at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307)
		at java.base/java.security.AccessController.doPrivileged(Native Method)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1406)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
		at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
		at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
		at java.base/java.security.AccessController.doPrivileged(Native Method)
		at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
		at java.base/java.security.AccessController.doPrivileged(Native Method)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
		at java.base/java.lang.Thread.run(Thread.java:834)
12-Nov-2020 14:02:31.934 WARNING [RMI TCP Connection(2)-127.0.0.1] org.apache.naming.NamingContext.lookup Unexpected exception resolving reference
	java.sql.SQLException
		at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:473)
		at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154)
		at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
		at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
		at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:560)
		at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:244)
		at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:96)
		at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:330)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:857)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:160)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
		at org.apache.naming.NamingContext.lookup(NamingContext.java:174)
		at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1017)
		at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:557)
		at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:253)
		at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5044)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
		at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
		at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
		at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1727)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)
		at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)
		at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:456)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:405)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)
		at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)
		at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307)
		at java.base/java.security.AccessController.doPrivileged(Native Method)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1406)
		at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
		at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
		at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
		at java.base/java.security.AccessController.doPrivileged(Native Method)
		at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
		at java.base/java.security.AccessController.doPrivileged(Native Method)
		at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
		at java.base/java.lang.Thread.run(Thread.java:834)
	Caused by: java.lang.ClassCastException: class nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor cannot be cast to class org.apache.tomcat.jdbc.pool.JdbcInterceptor (nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor is in unnamed module of loader java.net.URLClassLoader @6572421; org.apache.tomcat.jdbc.pool.JdbcInterceptor is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @2ff5353f)
		at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:466)
		... 60 more

Tomcat version < 10 with Prometheus version > 11 not supported

Upgrading Tomcat exporter and associated libraries, we got an exceptions :

 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/usr/local/tomcat/webapps/metrics.war]
[...]
Caused by: java.lang.ClassNotFoundException: io.prometheus.client.servlet.common.exporter.ServletConfigurationException

The issue is made by incompatibilities between newer Prometheus libs versions and older Tomcat versions.
💡 This could be a good idea to put that information in README.md file. 💡

Following combinations have been tested:

  • ✅ Tomcat 8.5 <--> simpleclient 0.11
  • ✖️ Tomcat 8.5 <--> simpleclient 0.12
  • ✖️ Tomcat 9.0 <--> simpleclient 0.12
  • ✖️ Tomcat 9.0 <--> simpleclient 0.15
  • ✅ Tomcat 10.0 <--> simpleclient 0.11
  • ✅ Tomcat 10.0 <--> simpleclient 0.12
  • ✅ Tomcat 10.0 <--> simpleclient 0.15

Dockerfile used for tests :

FROM tomcat:9.0-jdk17-openjdk-slim

ENV TOMCAT_SIMPLECLIENT_VERSION=0.12.0
ENV TOMCAT_EXPORTER_VERSION=0.0.15

ADD ["https://search.maven.org/remotecontent?filepath=io/prometheus/simpleclient/${TOMCAT_SIMPLECLIENT_VERSION}/simpleclient-${TOMCAT_SIMPLECLIENT_VERSION}.jar", \
     "/usr/local/tomcat/lib/simpleclient-${TOMCAT_SIMPLECLIENT_VERSION}.jar"]
ADD ["https://search.maven.org/remotecontent?filepath=io/prometheus/simpleclient_common/${TOMCAT_SIMPLECLIENT_VERSION}/simpleclient_common-${TOMCAT_SIMPLECLIENT_VERSION}.jar", \
     "/usr/local/tomcat/lib/simpleclient_common-${TOMCAT_SIMPLECLIENT_VERSION}.jar"]
ADD ["https://search.maven.org/remotecontent?filepath=io/prometheus/simpleclient_hotspot/${TOMCAT_SIMPLECLIENT_VERSION}/simpleclient_hotspot-${TOMCAT_SIMPLECLIENT_VERSION}.jar", \
     "/usr/local/tomcat/lib/simpleclient_hotspot-${TOMCAT_SIMPLECLIENT_VERSION}.jar"]
ADD ["https://search.maven.org/remotecontent?filepath=io/prometheus/simpleclient_servlet/${TOMCAT_SIMPLECLIENT_VERSION}/simpleclient_servlet-${TOMCAT_SIMPLECLIENT_VERSION}.jar", \
     "/usr/local/tomcat/lib/simpleclient_servlet-${TOMCAT_SIMPLECLIENT_VERSION}.jar"]

ADD ["https://search.maven.org/remotecontent?filepath=nl/nlighten/tomcat_exporter_client/${TOMCAT_EXPORTER_VERSION}/tomcat_exporter_client-${TOMCAT_EXPORTER_VERSION}.jar", \
     "/usr/local/tomcat/lib/tomcat_exporter_client-${TOMCAT_EXPORTER_VERSION}.jar"]
ADD ["https://search.maven.org/remotecontent?filepath=nl/nlighten/tomcat_exporter_servlet/${TOMCAT_EXPORTER_VERSION}/tomcat_exporter_servlet-${TOMCAT_EXPORTER_VERSION}.war", \
     "/usr/local/tomcat/webapps/metrics.war"]
docker build -t mytesttomcatexporter . && docker run -it -p 8080:8080 mytesttomcatexporter 

👏 Thank you @hervenicol for the join investigation 👏

Caused by: java.lang.ClassNotFoundException: io.prometheus.cloudwatch.WebServer

Caused by: java.lang.ClassNotFoundException: io.prometheus.cloudwatch.WebServer

[INFO] --- maven-install-plugin:2.4:install (default-install) @ cloudwatch_exporter ---
[INFO] Installing C:\Users\Public\Cloudwatch jar\target\cloudwatch_exporter-0.10.0.jar to C:\Users\David.Carpenter.m2\repository\io\prometheus\cloudwatch\cloudwatch_exporter\0.10.0\cloudwatch_exporter-0.10.0.jar
[INFO] Installing C:\Users\Public\Cloudwatch jar\pom.xml to C:\Users\David.Carpenter.m2\repository\io\prometheus\cloudwatch\cloudwatch_exporter\0.10.0\cloudwatch_exporter-0.10.0.pom
[INFO] Installing C:\Users\Public\Cloudwatch jar\target\cloudwatch_exporter-0.10.0-jar-with-dependencies.jar to C:\Users\David.Carpenter.m2\repository\io\prometheus\cloudwatch\cloudwatch_exporter\0.10.0\cloudwatch_exporter-0.10.0-jar-with-dependencies.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.644 s
[INFO] Finished at: 2021-04-07T16:38:39+01:00
[INFO] ------------------------------------------------------------------------

C:\Users\Public\Cloudwatch jar>java -jar target/cloudwatch_exporter-0.10.0-jar-with-dependencies.jar 9106 example.yml
Error: Could not find or load main class io.prometheus.cloudwatch.WebServer
Caused by: java.lang.ClassNotFoundException: io.prometheus.cloudwatch.WebServer

Im a real newby on this and cant figure what im doing wrong...

Error using the tomcat exporter

Hi Richard,

I got the error below, can you help me?

The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet nl.nlighten.prometheus.tomcat.TomcatMetricsServlet threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)

root cause

java.lang.NoClassDefFoundError: nl/nlighten/prometheus/tomcat/TomcatGenericExports
nl.nlighten.prometheus.tomcat.TomcatMetricsServlet.init(TomcatMetricsServlet.java:17)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)

root cause

java.lang.ClassNotFoundException: nl.nlighten.prometheus.tomcat.TomcatGenericExports
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
nl.nlighten.prometheus.tomcat.TomcatMetricsServlet.init(TomcatMetricsServlet.java:17)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)

Explanation regd the Dimensions of the metrics

Can you please add comments or explanation regd the Dimensions of the Metrics which are bit confusing to understand for people new to prometheus
servlet_request_seconds_bucket{"/foo", "GET", "+Inf",} 1.0 <<- what does '+Inf' and especially 1.0 relates to...

Tomcat 6 died when use tomcat_exporter

Hi,

I have problems on Tomcat version 6.

When I insert your suggest filter tag in [ web.xml ] on Tomcat server and restart service, my tomcat server is unavailable to access. but in newer version such as 7 , 8 it work.!!

how can I do for this case?

thank you.

embed jars?

doing the following causes mvn package to create a .war that's probably excessive (API jars should be dropped) but is drop-in ready without any other .jars. is this the purpose of the message "all metrics are registered using the same class loader"?

Perhaps an alternate approach is to create an uber-jar with all the deps (and no .war) and add the servlet via the top level web.xml using <servlet-class>…

diff --git a/exporter/pom.xml b/exporter/pom.xml
index 0d21acd..31451b9 100644
--- a/exporter/pom.xml
+++ b/exporter/pom.xml
@@ -27,19 +27,31 @@
             <groupId>io.prometheus</groupId>
             <artifactId>simpleclient</artifactId>
             <version>${io.prometheus.simpleclient.version}</version>
-            <scope>provided</scope>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>io.prometheus</groupId>
             <artifactId>simpleclient_common</artifactId>
             <version>${io.prometheus.simpleclient.version}</version>
-            <scope>provided</scope>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.prometheus</groupId>
+            <artifactId>simpleclient_servlet</artifactId>
+            <version>${io.prometheus.simpleclient.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.prometheus</groupId>
+            <artifactId>simpleclient_hotspot</artifactId>
+            <version>${io.prometheus.simpleclient.version}</version>
+            <scope>runtime</scope>
         </dependency>
         <dependency>
             <groupId>nl.nlighten</groupId>
             <artifactId>tomcat_exporter_client</artifactId>
             <version>0.0.9</version>
-            <scope>provided</scope>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>

Delayed metrics

I deployed the Prometheus JMX Exporter and it has a delay option. Our applications generally spike on deployment and this option may be useful for filtering out those initial metrics. Does this tomcat exporter provide a similar option, or something that could be added? Thanks

Is this project still maintained?

Is this project still maintained?

I'm halfway through implementing my own and found this while looking into how to get the thread pool metrics from Tomcat.

I'm thinking of continuing with my own implementation using the Prometheus java client 1.x as well as some other features. Not really interested in the DB pools since HikariCP is superior and has it's own Prometheus exporter.

Add JMX Exporter features?

Hello,

I would like to know if you would be open to a contribution to add features from the https://github.com/prometheus/jmx_exporter into the actual exporter ?
What I have in mind:

  • I don't want to expose an additional http port so I want to avoid the java agent approach of the jmx_exporter
  • in the servlet filter add an optional parameter to point to a jmx_exporter configuration file on the file system that will add a JMX Collector io.prometheus.jmx.JMXCollector

Cheers,
Fabien

Contect deadline exceed (Get https://my_ip/metrics/: context deadline exceeded)

Hello ,

I configured the exporter in my centos 7 , i am able to see details from my browser.

But when i am adding below configuration in promethues, I am getting content deadline exceed error.
I tried to search on internet but didn't come with why i am getting this error, once surprise thing i found that in prometheus its's trying to get connect with https://myip:8080/metrics , while it should need to connect with http. I am attaching the screenshot of error and my configuration, please help me for get rid our from this.

image

My Prom Configuration :

scrape_configs:

  • job_name: support_ticket
    static_configs:

    • targets: ['IP:9100']
  • job_name: java_monitoring
    static_configs:

    • targets: ['IP:8080']

404 after deploying metrics.war

Downloaded jar files of the latest version, moved them to my /opt/tomcat/lib/ folder. Downloaded tomcat_exporter_servlet.war, renamed it to metrics.war, added it to webapps folder that has another application of mine running. http://host:8080/metrics returns 404. Checked my logs and there is nothing significant unlike the 404. How can i resolve this?!!

MaxActive attribute not found

Hello,

Using the exporter with tomcat 8.5.33 I get the exception:

javax.management.AttributeNotFoundException: No such attribute: MaxActive

When I look at the docs of the jdbc connectionpool it looks like the MaxActive attribute should still be there.

Can't see the metrics

Hi I am integrating Tomcat Exporter on one of my servers. I currently see such an error message.

Log message catalina:

22-Jun-2022 19:53:09.780 WARNING [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxProcessors' to '600' did not find a matching property.
22-Jun-2022 19:53:09.783 WARNING [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxProcessors' to '600' did not find a matching property.
22-Jun-2022 19:53:09.784 WARNING [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxProcessors' to '600' did not find a matching property.
22-Jun-2022 19:53:09.796 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host} Setting property 'xmlValidation' to 'false' did not find a matching property.
22-Jun-2022 19:53:09.796 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host} Setting property 'xmlNamespaceAware' to 'false' did not find a matching property.
22-Jun-2022 19:53:09.821 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'allowLinking' to 'true' did not find a matching property.
22-Jun-2022 19:53:09.829 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'allowLinking' to 'true' did not find a matching property.
22-Jun-2022 19:53:09.830 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'allowLinking' to 'true' did not find a matching property.
22-Jun-2022 19:53:09.840 WARNING [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]{Server/Service/Engine/Host/Valve} Setting property 'resolveHosts' to 'false' did not find a matching property.
22-Jun-2022 19:53:09.879 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
22-Jun-2022 19:53:09.889 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
22-Jun-2022 19:53:09.892 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8081"]
22-Jun-2022 19:53:09.892 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
22-Jun-2022 19:53:09.893 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8082"]
22-Jun-2022 19:53:09.893 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
22-Jun-2022 19:53:09.893 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 359 ms
22-Jun-2022 19:53:09.904 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
22-Jun-2022 19:53:09.904 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.15
22-Jun-2022 19:53:15.208 INFO [localhost-startStop-3] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
22-Jun-2022 19:53:15.224 INFO [localhost-startStop-2] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
22-Jun-2022 19:53:15.636 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
22-Jun-2022 19:53:16.473 INFO [localhost-startStop-4] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
22-Jun-2022 19:53:30.460 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
22-Jun-2022 19:53:30.474 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8081"]
22-Jun-2022 19:53:30.478 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8082"]
22-Jun-2022 19:53:30.482 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 20588 ms

lib

ls -la
total 7828
drwxrwxr-x 2 release wibapp 4096 Jun 22 19:29 .
drwxrwxr-x 9 release wibapp 4096 Jun 22 15:10 ..
-rwxrwxr-x 1 release wibapp 18109 May 5 2017 annotations-api.jar
-rwxrwxr-x 1 release wibapp 53135 May 5 2017 catalina-ant.jar
-rwxrwxr-x 1 release wibapp 118638 May 5 2017 catalina-ha.jar
-rwxrwxr-x 1 release wibapp 1606304 May 5 2017 catalina.jar
-rwxrwxr-x 1 release wibapp 74734 May 5 2017 catalina-storeconfig.jar
-rwxrwxr-x 1 release wibapp 269231 May 5 2017 catalina-tribes.jar
-rwxrwxr-x 1 release wibapp 2450404 May 5 2017 ecj-4.6.3.jar
-rwxrwxr-x 1 release wibapp 81439 May 5 2017 el-api.jar
-rwxrwxr-x 1 release wibapp 163118 May 5 2017 jasper-el.jar
-rwxrwxr-x 1 release wibapp 588785 May 5 2017 jasper.jar
-rwxrwxr-x 1 release wibapp 26871 May 5 2017 jaspic-api.jar
-rwxrwxr-x 1 release wibapp 61653 May 5 2017 jsp-api.jar
-rwxrwxr-x 1 release wibapp 244064 May 5 2017 servlet-api.jar
-rwxr-xr-x 1 root root 88558 Aug 29 2021 simpleclient-0.12.0.jar
-rwxr-xr-x 1 root root 8007 Aug 29 2021 simpleclient_common-0.12.0.jar
-rwxr-xr-x 1 root root 24093 Aug 29 2021 simpleclient_hotspot-0.12.0.jar
-rwxr-xr-x 1 root root 87904 Aug 29 2021 simpleclient_servlet-0.12.0.jar
-rwxr-xr-x 1 root root 12940 Aug 29 2021 simpleclient_servlet_common-0.12.0.jar
-rwxrwxr-x 1 release wibapp 10557 May 5 2017 tomcat-api.jar
-rwxrwxr-x 1 release wibapp 777109 May 5 2017 tomcat-coyote.jar
-rwxrwxr-x 1 release wibapp 251070 May 5 2017 tomcat-dbcp.jar
-rwxr-xr-x 1 root root 19586 Oct 31 2021 tomcat_exporter_client-0.0.15.jar
-rwxrwxr-x 1 release wibapp 66795 May 5 2017 tomcat-i18n-es.jar
-rwxrwxr-x 1 release wibapp 40719 May 5 2017 tomcat-i18n-fr.jar
-rwxrwxr-x 1 release wibapp 42072 May 5 2017 tomcat-i18n-ja.jar
-rwxrwxr-x 1 release wibapp 144317 May 5 2017 tomcat-jdbc.jar
-rwxrwxr-x 1 release wibapp 33871 May 5 2017 tomcat-jni.jar
-rwxrwxr-x 1 release wibapp 134645 May 5 2017 tomcat-util.jar
-rwxrwxr-x 1 release wibapp 203782 May 5 2017 tomcat-util-scan.jar
-rwxrwxr-x 1 release wibapp 209736 May 5 2017 tomcat-websocket.jar
-rwxrwxr-x 1 release wibapp 36905 May 5 2017 websocket-api.jar

curl

curl http://localhost:8080/metrics/
<!doctype html><title>HTTP Status [404] – [Not Found]</title><style type="text/css">h1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} h3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style>

HTTP Status [404] – [Not Found]

I am not certainly sure how to resolve this issue... do you have any advices..? It seems like catalina starts up but I do not see any metrics....

tomcat_jdbc_query_seconds always 0 on Tomcat 9.0.14

Here is the sample -

# HELP tomcat_jdbc_query_seconds JDBC query duration
# TYPE tomcat_jdbc_query_seconds histogram
tomcat_jdbc_query_seconds_bucket{status="error",le="0.01",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="0.02",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="0.05",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="0.1",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="0.5",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="1.0",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="5.0",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="10.0",} 4.0
tomcat_jdbc_query_seconds_bucket{status="error",le="+Inf",} 4.0
tomcat_jdbc_query_seconds_count{status="error",} 4.0
tomcat_jdbc_query_seconds_sum{status="error",} 0.0
tomcat_jdbc_query_seconds_bucket{status="success",le="0.01",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="0.02",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="0.05",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="0.1",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="0.5",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="1.0",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="5.0",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="10.0",} 8342.0
tomcat_jdbc_query_seconds_bucket{status="success",le="+Inf",} 8342.0
tomcat_jdbc_query_seconds_count{status="success",} 8342.0
tomcat_jdbc_query_seconds_sum{status="success",} 0.0

Sample config
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" jdbcInterceptors="nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor(logFailed=true,logSlow=true,threshold=1000,buckets=.01|.02|0.05|.1|.5|1|5|10,slowQueryBuckets=1|2.5|5|10|30)"

The metrics application cannot be restarted

If I want to restart the /metrics application (not tomcat, just the application), the application fails to start and I see the following exception:

java.lang.IllegalArgumentException: Collector already registered that provides name: tomcat_session_active_total
	io.prometheus.client.CollectorRegistry.register(CollectorRegistry.java:54)
	io.prometheus.client.Collector.register(Collector.java:139)
	io.prometheus.client.Collector.register(Collector.java:132)
	nl.nlighten.prometheus.tomcat.TomcatMetricsServlet.init(TomcatMetricsServlet.java:17)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1463)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)

Maybe TomcatMetricsServlet could have it's own CollectorRegistry?
Can help with a PR if needed.

ClassNotFoundException: io.prometheus.client.exporter.MetricsServlet

Hi Richard,

I am getting the below error in tomcat logs while accessing metrics path.
I added all the dependencies in lib folder, still getting the error.

14-Mar-2019 05:49:55.565 SEVERE [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Allocate exception for servlet [nl.nlight en.prometheus.tomcat.TomcatMetricsServlet] java.lang.ClassNotFoundException: io.prometheus.client.exporter.MetricsServlet at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1364) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1185) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763)

tomcat_exporter doesn't work

tomcat_exporter doesn't work
Can't understand why?

We use:
Apache Tomcat/8.5.57
java version "1.8.0_261"

files below added to Tomcat8.5\lib
simpleclient_servlet-0.12.0.jar
simpleclient_hotspot-0.12.0.jar
simpleclient_common-0.12.0.jar
simpleclient-0.12.0.jar
tomcat_exporter_client-0.0.14.jar -> renamed to metrics.jar

from log where 'metrics':
23-Sep-2021 10:31:37.785 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [C:\BMC\Tomcat8.5\webapps\metrics.war]
23-Sep-2021 10:31:37.832 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/metrics]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:970)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1840)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: io/prometheus/client/servlet/common/exporter/ServletConfigurationException
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Unknown Source)
at java.lang.Class.getDeclaredFields(Unknown Source)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:110)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:269)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:137)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:69)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:782)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5053)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 10 more
Caused by: java.lang.ClassNotFoundException: io.prometheus.client.servlet.common.exporter.ServletConfigurationException
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 23 more
23-Sep-2021 10:31:37.832 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [C:\BMC\Tomcat8.5\webapps\metrics.war]
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/metrics]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:747)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:970)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1840)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Dependency conflicts: there are conflicting classes in several JAR pairs

Hi, by analyzing tomcat_exporter-master\client\pom.xml, I found a series of dependency conflicts between the libraries transitively introduced by org.apache.tomcat.embed:tomcat-embed-core:8.5.11 and org.apache.tomcat:tomcat-catalina:8.5.24. As the JVM only load the classes present first on the classpath and shadow the other duplicate ones with the same names. The dependency conflict problem brings high risks of "NoSuchMethodException" or "NoSuchMethodError" issues at runtime. The conflicting details are listed below. Maybe the solution is that upgrading org.apache.tomcat.embed:tomcat-embed-core from 8.5.11 to 8.5.24. Please notice that. Thanks!

===============projectPath->nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT@D:\ws\release2\tomcat_exporter-master\client\pom.xml
1. Risk for jar-pair:org.apache.tomcat:tomcat-util-scan:8.5.24:org.apache.tomcat.embed:tomcat-embed-core:8.5.11:
a) Methods that only exist in org.apache.tomcat:tomcat-util-scan:8.5.24:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat:tomcat-catalina:8.5.24::compile->org.apache.tomcat:tomcat-util-scan:8.5.24::compile]
<org.apache.tomcat.util.descriptor.web.XmlEncodingBase: void setCharset(java.nio.charset.Charset)>
<org.apache.tomcat.util.descriptor.web.XmlEncodingBase: void ()>
<org.apache.tomcat.util.descriptor.web.XmlEncodingBase: java.nio.charset.Charset getCharset()>
<org.apache.tomcat.util.digester.Digester: void replaceSystemProperties()>
<org.apache.tomcat.util.digester.Digester: void setPropertySource(org.apache.tomcat.util.IntrospectionUtils$PropertySource)>
<org.apache.tomcat.util.scan.AbstractInputStreamJar: void populateMrMap()>
<org.apache.tomcat.util.scan.StandardJarScanner: void doScanClassPath(org.apache.tomcat.JarScanType,javax.servlet.ServletContext,org.apache.tomcat.JarScannerCallback,java.util.Set)>
<org.apache.tomcat.util.scan.StandardJarScanner: void processURLs(org.apache.tomcat.JarScanType,org.apache.tomcat.JarScannerCallback,java.util.Set,boolean,java.util.Deque)>
<org.apache.tomcat.util.scan.StandardJarScanner: void addClassPath(java.util.Deque)>
b) Methods that only exist in org.apache.tomcat.embed:tomcat-embed-core:8.5.11:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat.embed:tomcat-embed-core:8.5.11::test]
<org.apache.tomcat.util.descriptor.web.SecurityCollection: void setEncoding(java.lang.String)>
<org.apache.tomcat.util.descriptor.web.SecurityCollection: java.lang.String getEncoding()>
<org.apache.tomcat.util.descriptor.web.WebXml: java.lang.String escapeXml(java.lang.String)>

2. Risk for jar-pair:org.apache.tomcat.embed:tomcat-embed-core:8.5.11:org.apache.tomcat:tomcat-catalina:8.5.24:
a) Methods that only exist in org.apache.tomcat.embed:tomcat-embed-core:8.5.11:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat.embed:tomcat-embed-core:8.5.11::test]
<org.apache.catalina.authenticator.BasicAuthenticator$BasicCredentials: void (org.apache.tomcat.util.buf.ByteChunk)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: java.util.Map access$400(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: void addListener(javax.security.auth.message.config.RegistrationListener)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: void access$000(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl,javax.security.auth.message.config.RegistrationListener)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: boolean access$300(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl,javax.security.auth.message.config.RegistrationListener)>
<org.apache.catalina.connector.InputBuffer: void setConverter()>
<org.apache.catalina.connector.OutputBuffer: void setConverter()>
<org.apache.catalina.connector.Request: boolean isPushSupported()>
<org.apache.catalina.connector.Request: org.apache.catalina.servlet4preview.http.Mapping getMapping()>
<org.apache.catalina.connector.Request: org.apache.catalina.servlet4preview.http.PushBuilder getPushBuilder()>
<org.apache.catalina.connector.Request: boolean isSSLAttribute(java.lang.String)>
<org.apache.catalina.connector.RequestFacade: boolean isPushSupported()>
<org.apache.catalina.connector.RequestFacade: org.apache.catalina.servlet4preview.http.PushBuilder getPushBuilder()>
<org.apache.catalina.connector.RequestFacade: org.apache.catalina.servlet4preview.http.Mapping getMapping()>
<org.apache.catalina.core.ApplicationContext: javax.servlet.ServletRegistration$Dynamic addServlet(java.lang.String,java.lang.String,javax.servlet.Servlet)>
<org.apache.catalina.core.ApplicationDispatcher: void (org.apache.catalina.Wrapper,java.lang.String,java.lang.String,java.lang.String,java.lang.String,org.apache.catalina.servlet4preview.http.Mapping,java.lang.String)>
<org.apache.catalina.core.ApplicationHttpRequest: org.apache.catalina.servlet4preview.http.PushBuilder getPushBuilder()>
<org.apache.catalina.core.ApplicationHttpRequest: org.apache.catalina.servlet4preview.http.Mapping getMapping()>
<org.apache.catalina.core.ApplicationHttpRequest: void setMapping(org.apache.catalina.servlet4preview.http.Mapping)>
<org.apache.catalina.core.ApplicationMapping: org.apache.catalina.servlet4preview.http.Mapping getMapping()>
<org.apache.catalina.core.ApplicationPushBuilder: java.lang.String getLastModified()>
<org.apache.catalina.core.ApplicationPushBuilder: boolean push()>
<org.apache.catalina.core.ApplicationPushBuilder: org.apache.catalina.servlet4preview.http.PushBuilder lastModified(java.lang.String)>
<org.apache.catalina.core.ApplicationPushBuilder: org.apache.catalina.core.ApplicationPushBuilder lastModified(java.lang.String)>
<org.apache.catalina.core.ApplicationPushBuilder: void (javax.servlet.http.HttpServletRequest)>
<org.apache.catalina.core.ApplicationPushBuilder: org.apache.catalina.servlet4preview.http.PushBuilder etag(java.lang.String)>
<org.apache.catalina.core.ApplicationPushBuilder: org.apache.catalina.core.ApplicationPushBuilder conditional(boolean)>
<org.apache.catalina.core.ApplicationPushBuilder: org.apache.catalina.servlet4preview.http.PushBuilder conditional(boolean)>
<org.apache.catalina.core.ApplicationPushBuilder: java.lang.String decode(java.lang.String,java.lang.String)>
<org.apache.catalina.core.ApplicationPushBuilder: boolean isConditional()>
<org.apache.catalina.core.ApplicationPushBuilder: org.apache.catalina.core.ApplicationPushBuilder etag(java.lang.String)>
<org.apache.catalina.core.ApplicationPushBuilder: java.lang.String getEtag()>
<org.apache.catalina.filters.RemoteIpFilter$XForwardedRequest: org.apache.catalina.core.ApplicationPushBuilder getPushBuilder()>
<org.apache.catalina.manager.HTMLManagerServlet: void ()>
<org.apache.catalina.servlet4preview.http.HttpServletRequest: boolean isPushSupported()>
<org.apache.catalina.servlet4preview.http.HttpServletRequest: org.apache.catalina.servlet4preview.http.PushBuilder getPushBuilder()>
<org.apache.catalina.servlet4preview.http.HttpServletRequest: org.apache.catalina.servlet4preview.http.Mapping getMapping()>
<org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper: org.apache.catalina.servlet4preview.http.Mapping getMapping()>
<org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper: boolean isPushSupported()>
<org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper: org.apache.catalina.servlet4preview.http.PushBuilder getPushBuilder()>
<org.apache.catalina.servlet4preview.http.PushBuilder: boolean isConditional()>
<org.apache.catalina.servlet4preview.http.PushBuilder: org.apache.catalina.servlet4preview.http.PushBuilder etag(java.lang.String)>
<org.apache.catalina.servlet4preview.http.PushBuilder: boolean push()>
<org.apache.catalina.servlet4preview.http.PushBuilder: java.lang.String getLastModified()>
<org.apache.catalina.servlet4preview.http.PushBuilder: org.apache.catalina.servlet4preview.http.PushBuilder lastModified(java.lang.String)>
<org.apache.catalina.servlet4preview.http.PushBuilder: java.lang.String getEtag()>
<org.apache.catalina.servlet4preview.http.PushBuilder: org.apache.catalina.servlet4preview.http.PushBuilder conditional(boolean)>
<org.apache.catalina.servlets.CGIServlet$CGIRunner: void access$900(org.apache.catalina.servlets.CGIServlet$CGIRunner,java.io.BufferedReader)>
<org.apache.catalina.servlets.CGIServlet: java.lang.Object access$600()>
<org.apache.catalina.servlets.CGIServlet: java.util.regex.Pattern access$500(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: long access$1100(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.lang.String access$000(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: org.apache.juli.logging.Log access$100()>
<org.apache.catalina.servlets.CGIServlet: boolean access$1000(org.apache.catalina.servlets.CGIServlet,javax.servlet.http.HttpServletResponse,int)>
<org.apache.catalina.servlets.CGIServlet: org.apache.tomcat.util.res.StringManager access$200()>
<org.apache.catalina.servlets.CGIServlet: java.util.Hashtable access$300(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.lang.String access$400(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.util.List access$800(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.lang.String access$700(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.ssi.SSIMediator: void ()>
<org.apache.catalina.valves.RemoteAddrValve: boolean getAddConnectorPort()>
<org.apache.catalina.valves.RemoteAddrValve: void setAddConnectorPort(boolean)>
<org.apache.catalina.valves.RemoteHostValve: void setAddConnectorPort(boolean)>
<org.apache.catalina.valves.RemoteHostValve: boolean getAddConnectorPort()>
<org.apache.catalina.valves.rewrite.RewriteValve: void ()>

b) Methods that only exist in org.apache.tomcat:tomcat-catalina:8.5.24:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat:tomcat-catalina:8.5.24::compile]
<org.apache.catalina.Context: void setRequestCharacterEncoding(java.lang.String)>
<org.apache.catalina.Context: java.lang.String getRequestCharacterEncoding()>
<org.apache.catalina.Context: java.lang.String getResponseCharacterEncoding()>
<org.apache.catalina.Context: void setResponseCharacterEncoding(java.lang.String)>
<org.apache.catalina.Pipeline: void findNonAsyncValves(java.util.Set)>
<org.apache.catalina.authenticator.AuthenticatorBase: javax.security.auth.message.config.AuthConfigProvider findJaspicProvider()>
<org.apache.catalina.authenticator.AuthenticatorBase: javax.security.auth.callback.CallbackHandler createCallbackHandler()>
<org.apache.catalina.authenticator.AuthenticatorBase: java.lang.String getJaspicCallbackHandlerClass()>
<org.apache.catalina.authenticator.AuthenticatorBase: void setJaspicCallbackHandlerClass(java.lang.String)>
<org.apache.catalina.authenticator.BasicAuthenticator$BasicCredentials: void (org.apache.tomcat.util.buf.ByteChunk,java.nio.charset.Charset)>
<org.apache.catalina.authenticator.BasicAuthenticator: void setCharset(java.lang.String)>
<org.apache.catalina.authenticator.BasicAuthenticator: java.lang.String getCharset()>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: void addListener(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationListenerWrapper)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: boolean access$700(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl,javax.security.auth.message.config.RegistrationListener)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: java.util.List access$300(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: void access$000(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl,org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationListenerWrapper)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl: java.util.Map access$800(org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl: org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl findRegistrationContextImpl(java.lang.String,java.lang.String)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl: void savePersistentProviders(org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations$Providers,java.util.Map)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl: void savePersistentProvider(org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations$Providers,org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl: void findProvider(javax.security.auth.message.config.AuthConfigProvider,java.util.Map,java.util.List)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl: void addRegistrationContextImpl(java.lang.String,java.lang.String,java.lang.String,org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl$RegistrationContextImpl)>
<org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl: javax.security.auth.message.config.AuthConfigProvider createAuthConfigProvider(java.lang.String,java.util.Map)>
<org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations: void writeOptional(java.lang.String,java.lang.String,java.io.Writer)>
<org.apache.catalina.connector.Connector: java.nio.charset.Charset getURICharset()>
<org.apache.catalina.connector.Request: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder(javax.servlet.http.HttpServletRequest)>
<org.apache.catalina.connector.Request: javax.security.auth.Subject newSubject(java.security.Principal)>
<org.apache.catalina.connector.Request: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder()>
<org.apache.catalina.connector.Request: org.apache.catalina.servlet4preview.http.ServletMapping getServletMapping()>
<org.apache.catalina.connector.Request: java.util.Set getNonAsyncClassNames()>
<org.apache.catalina.connector.Request: java.nio.charset.Charset getCharset()>
<org.apache.catalina.connector.RequestFacade: org.apache.catalina.servlet4preview.http.ServletMapping getServletMapping()>
<org.apache.catalina.connector.RequestFacade: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder(javax.servlet.http.HttpServletRequest)>
<org.apache.catalina.connector.RequestFacade: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder()>
<org.apache.catalina.core.ApplicationContext: void setRequestCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.ApplicationContext: javax.servlet.ServletRegistration$Dynamic addJspFile(java.lang.String,java.lang.String)>
<org.apache.catalina.core.ApplicationContext: int getSessionTimeout()>
<org.apache.catalina.core.ApplicationContext: javax.servlet.ServletRegistration$Dynamic addServlet(java.lang.String,java.lang.String,javax.servlet.Servlet,java.util.Map)>
<org.apache.catalina.core.ApplicationContext: void setSessionTimeout(int)>
<org.apache.catalina.core.ApplicationContext: java.lang.String getRequestCharacterEncoding()>
<org.apache.catalina.core.ApplicationContext: void setResponseCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.ApplicationContext: java.lang.String getResponseCharacterEncoding()>
<org.apache.catalina.core.ApplicationContextFacade: java.lang.String getRequestCharacterEncoding()>
<org.apache.catalina.core.ApplicationContextFacade: int getSessionTimeout()>
<org.apache.catalina.core.ApplicationContextFacade: void setResponseCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.ApplicationContextFacade: java.lang.String getResponseCharacterEncoding()>
<org.apache.catalina.core.ApplicationContextFacade: void setRequestCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.ApplicationContextFacade: void setSessionTimeout(int)>
<org.apache.catalina.core.ApplicationContextFacade: javax.servlet.ServletRegistration$Dynamic addJspFile(java.lang.String,java.lang.String)>
<org.apache.catalina.core.ApplicationDispatcher: void (org.apache.catalina.Wrapper,java.lang.String,java.lang.String,java.lang.String,java.lang.String,org.apache.catalina.servlet4preview.http.ServletMapping,java.lang.String)>
<org.apache.catalina.core.ApplicationFilterChain: void findNonAsyncFilters(java.util.Set)>
<org.apache.catalina.core.ApplicationHttpRequest: org.apache.catalina.servlet4preview.http.ServletMapping getServletMapping()>
<org.apache.catalina.core.ApplicationHttpRequest: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder()>
<org.apache.catalina.core.ApplicationHttpRequest: void setMapping(org.apache.catalina.servlet4preview.http.ServletMapping)>
<org.apache.catalina.core.ApplicationMapping: org.apache.catalina.servlet4preview.http.ServletMapping getServletMapping()>
<org.apache.catalina.core.ApplicationPushBuilder: java.lang.String decodePercentSequence(java.lang.String,java.nio.charset.Charset)>
<org.apache.catalina.core.ApplicationPushBuilder: void push()>
<org.apache.catalina.core.ApplicationPushBuilder: void (org.apache.catalina.connector.Request,javax.servlet.http.HttpServletRequest)>
<org.apache.catalina.core.DefaultInstanceManager: void backgroundProcess()>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: javax.servlet.ServletRegistration$Dynamic addJspFile(java.lang.String,java.lang.String)>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: java.lang.String getResponseCharacterEncoding()>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: java.lang.String getRequestCharacterEncoding()>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: void setResponseCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: int getSessionTimeout()>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: void setSessionTimeout(int)>
<org.apache.catalina.core.StandardContext$NoPluggabilityServletContext: void setRequestCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.StandardContext: void setRequestCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.StandardContext: void setResponseCharacterEncoding(java.lang.String)>
<org.apache.catalina.core.StandardContext: java.lang.String getRequestCharacterEncoding()>
<org.apache.catalina.core.StandardContext: java.lang.String getResponseCharacterEncoding()>
<org.apache.catalina.core.StandardPipeline: void findNonAsyncValves(java.util.Set)>
<org.apache.catalina.filters.CorsFilter: java.lang.String getInitParameter(javax.servlet.FilterConfig,java.lang.String,java.lang.String)>
<org.apache.catalina.filters.HttpHeaderSecurityFilter: void setHstsPreload(boolean)>
<org.apache.catalina.filters.HttpHeaderSecurityFilter: boolean isHstsPreload()>
<org.apache.catalina.filters.RemoteIpFilter$XForwardedRequest: org.apache.catalina.servlet4preview.http.PushBuilder getPushBuilder()>
<org.apache.catalina.loader.WebappClassLoaderBase: boolean hasLoggingConfig()>
<org.apache.catalina.manager.StatusTransformer: java.lang.String filterXml(java.lang.String)>
<org.apache.catalina.realm.JNDIRealm: void setReadTimeout(java.lang.String)>
<org.apache.catalina.realm.JNDIRealm: java.lang.String getReadTimeout()>
<org.apache.catalina.realm.RealmBase: boolean hasRoleInternal(java.security.Principal,java.lang.String)>
<org.apache.catalina.servlet4preview.http.HttpServletRequest: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder()>
<org.apache.catalina.servlet4preview.http.HttpServletRequest: org.apache.catalina.servlet4preview.http.ServletMapping getServletMapping()>
<org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper: org.apache.catalina.servlet4preview.http.ServletMapping getServletMapping()>
<org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper: org.apache.catalina.servlet4preview.http.PushBuilder newPushBuilder()>
<org.apache.catalina.servlet4preview.http.PushBuilder: void push()>
<org.apache.catalina.servlets.CGIServlet$CGIRunner: void access$1000(org.apache.catalina.servlets.CGIServlet$CGIRunner,java.io.BufferedReader)>
<org.apache.catalina.servlets.CGIServlet: java.util.regex.Pattern access$600(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: long access$1200(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: boolean access$000(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.lang.String access$100(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.util.Hashtable access$400(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: boolean access$1100(org.apache.catalina.servlets.CGIServlet,javax.servlet.http.HttpServletResponse,int)>
<org.apache.catalina.servlets.CGIServlet: org.apache.tomcat.util.res.StringManager access$300()>
<org.apache.catalina.servlets.CGIServlet: java.lang.String access$500(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.util.List access$900(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: java.lang.Object access$700()>
<org.apache.catalina.servlets.CGIServlet: java.lang.String access$800(org.apache.catalina.servlets.CGIServlet)>
<org.apache.catalina.servlets.CGIServlet: org.apache.juli.logging.Log access$200()>
<org.apache.catalina.servlets.DefaultServlet: void copy(java.io.InputStream,javax.servlet.ServletOutputStream)>
<org.apache.catalina.servlets.DefaultServlet: void service(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)>
<org.apache.catalina.servlets.DefaultServlet: void copy(java.io.InputStream,java.io.PrintWriter,java.lang.String)>
<org.apache.catalina.servlets.WebdavServlet: java.lang.String rewriteUrl(java.lang.String)>
<org.apache.catalina.session.JDBCStore: boolean getLocalDataSource()>
<org.apache.catalina.session.JDBCStore: void setLocalDataSource(boolean)>
<org.apache.catalina.startup.FailedContext: void setResponseCharacterEncoding(java.lang.String)>
<org.apache.catalina.startup.FailedContext: java.lang.String getResponseCharacterEncoding()>
<org.apache.catalina.startup.FailedContext: java.lang.String getRequestCharacterEncoding()>
<org.apache.catalina.startup.FailedContext: void setRequestCharacterEncoding(java.lang.String)>
<org.apache.catalina.startup.HostConfig: boolean isDeployThisXML(java.io.File,org.apache.catalina.util.ContextName)>
<org.apache.catalina.util.DOMWriter: void (java.io.Writer)>
<org.apache.catalina.util.ParameterMap: boolean containsValue(java.lang.Object)>
<org.apache.catalina.util.ParameterMap: void checkLocked()>
<org.apache.catalina.util.ParameterMap: java.util.Set entrySet()>
<org.apache.catalina.util.ParameterMap: java.lang.Object get(java.lang.Object)>
<org.apache.catalina.util.ParameterMap: int size()>
<org.apache.catalina.util.ParameterMap: boolean isEmpty()>
<org.apache.catalina.util.ParameterMap: java.util.Collection values()>
<org.apache.catalina.util.ParameterMap: boolean containsKey(java.lang.Object)>
<org.apache.catalina.util.ParameterMap: java.util.Set keySet()>
<org.apache.catalina.util.URLEncoder: java.lang.Object clone()>
<org.apache.catalina.util.URLEncoder: void (java.util.BitSet)>
<org.apache.catalina.util.URLEncoder: void setEncodeSpaceAsPlus(boolean)>
<org.apache.catalina.util.URLEncoder: java.lang.String encode(java.lang.String,java.nio.charset.Charset)>
<org.apache.catalina.util.URLEncoder: void removeSafeCharacter(char)>
<org.apache.catalina.valves.CrawlerSessionManagerValve: java.lang.String getCrawlerIps()>
<org.apache.catalina.valves.CrawlerSessionManagerValve: void setCrawlerIps(java.lang.String)>
<org.apache.catalina.valves.RequestFilterValve: void setAddConnectorPort(boolean)>
<org.apache.catalina.valves.RequestFilterValve: boolean getAddConnectorPort()>
<org.apache.catalina.valves.rewrite.Resolver: java.nio.charset.Charset getUriCharset()>
<org.apache.catalina.valves.rewrite.ResolverImpl: java.nio.charset.Charset getUriCharset()>
<org.apache.catalina.webresources.AbstractArchiveResourceSet: boolean isMultiRelease()>
<org.apache.catalina.webresources.AbstractFileResourceSet: boolean isInvalidWindowsFilename(java.lang.String)>
<org.apache.catalina.webresources.AbstractSingleArchiveResourceSet: boolean isMultiRelease()>
<org.apache.catalina.webresources.JarWarResourceSet: void processArchivesEntriesForMultiRelease()>
<org.apache.catalina.webresources.JarWarResourceSet: boolean isMultiRelease()>
<org.apache.catalina.webresources.StandardRoot: boolean isPackedWarFile()>
<org.apache.catalina.webresources.war.WarURLConnection: long getLastModified()>

3. Risk for jar-pair:org.apache.tomcat.embed:tomcat-embed-core:8.5.11:org.apache.tomcat:tomcat-coyote:8.5.24:
a) Methods that only exist in org.apache.tomcat.embed:tomcat-embed-core:8.5.11:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat.embed:tomcat-embed-core:8.5.11::test]
<org.apache.coyote.AbstractProcessor: void doPush(org.apache.coyote.PushToken)>
<org.apache.coyote.http11.AbstractHttp11JsseProtocol: java.lang.String getSslImplemenationShortName()>
<org.apache.coyote.http11.Http11InputBuffer: void (org.apache.coyote.Request,int)>
<org.apache.coyote.http11.Http11OutputBuffer: void (org.apache.coyote.Response,int)>
<org.apache.coyote.http11.Http11Processor: boolean prepareSendfile(org.apache.coyote.http11.OutputFilter[])>
<org.apache.coyote.http11.Http11Processor: boolean isCompressable()>
<org.apache.coyote.http11.Http11Processor: void (int,org.apache.tomcat.util.net.AbstractEndpoint,int,java.util.Set,int,int,java.util.Map)>
<org.apache.coyote.http11.Http11Processor: boolean breakKeepAliveLoop(org.apache.tomcat.util.net.SocketWrapperBase)>
<org.apache.coyote.http2.HpackDecoder: int getMaxMemorySize()>
<org.apache.coyote.http2.Stream$StreamOutputBuffer: boolean access$002(org.apache.coyote.http2.Stream$StreamOutputBuffer,boolean)>
<org.apache.coyote.http2.Stream: org.apache.juli.logging.Log access$300()>
<org.apache.coyote.http2.Stream: int access$500(org.apache.coyote.http2.Stream,int,boolean)>
<org.apache.coyote.http2.Stream: org.apache.tomcat.util.res.StringManager access$100()>
<org.apache.coyote.http2.Stream: org.apache.coyote.Response access$200(org.apache.coyote.http2.Stream)>
<org.apache.coyote.http2.Stream: org.apache.coyote.Request access$600(org.apache.coyote.http2.Stream)>
<org.apache.coyote.http2.Stream: org.apache.coyote.http2.Http2UpgradeHandler access$400(org.apache.coyote.http2.Stream)>
<org.apache.coyote.http2.Stream: boolean push(org.apache.coyote.Request)>
<org.apache.coyote.http2.StreamProcessor: void doPush(org.apache.coyote.PushToken)>
<org.apache.tomcat.util.http.LegacyCookieProcessor$1: void ()>
<org.apache.tomcat.util.http.LegacyCookieProcessor$1: java.lang.Object initialValue()>
<org.apache.tomcat.util.http.LegacyCookieProcessor$1: java.text.DateFormat initialValue()>
<org.apache.tomcat.util.http.Parameters: java.nio.charset.Charset getCharset(java.lang.String)>
<org.apache.tomcat.util.http.parser.Cookie: void parseCookieRfc2109(org.apache.tomcat.util.http.parser.Cookie$ByteBuffer,org.apache.tomcat.util.http.ServerCookies)>
<org.apache.tomcat.util.net.AbstractJsseEndpoint: javax.net.ssl.SSLEngine createSSLEngine(java.lang.String,java.util.List)>
<org.apache.tomcat.util.net.AprSSLSupport: void (org.apache.tomcat.util.net.SocketWrapperBase,java.lang.String)>
<org.apache.tomcat.util.net.NioEndpoint: void access$500(org.apache.tomcat.util.net.NioEndpoint,org.apache.tomcat.util.net.NioChannel,java.nio.channels.SelectionKey)>
<org.apache.tomcat.util.net.NioEndpoint: java.util.concurrent.CountDownLatch access$400(org.apache.tomcat.util.net.NioEndpoint)>
<org.apache.tomcat.util.net.SecureNio2Channel: java.nio.channels.AsynchronousSocketChannel getIOChannel()>
<org.apache.tomcat.util.net.SecureNioChannel: java.nio.channels.SocketChannel getIOChannel()>
<org.apache.tomcat.util.net.jsse.JSSEUtil: java.security.cert.CertPathParameters getParameters(java.lang.String,java.security.KeyStore)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.security.cert.Certificate[] access$700()>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.lang.String access$1100(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: boolean access$600(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: javax.security.cert.X509Certificate[] access$802(org.apache.tomcat.util.net.openssl.OpenSSLEngine,javax.security.cert.X509Certificate[])>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: javax.security.cert.X509Certificate[] access$800(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.security.cert.Certificate[] access$502(org.apache.tomcat.util.net.openssl.OpenSSLEngine,java.security.cert.Certificate[])>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: boolean access$900(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.lang.String access$1102(org.apache.tomcat.util.net.openssl.OpenSSLEngine,java.lang.String)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: org.apache.tomcat.util.net.openssl.OpenSSLSessionContext access$400(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: long access$200(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.security.cert.Certificate[] access$500(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>

b) Methods that only exist in org.apache.tomcat:tomcat-coyote:8.5.24:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat:tomcat-catalina:8.5.24::compile->org.apache.tomcat:tomcat-coyote:8.5.24::compile]
<org.apache.coyote.AbstractProcessor: void doPush(org.apache.coyote.Request)>
<org.apache.coyote.AbstractProtocol: void setConnectionLinger(int)>
<org.apache.coyote.AbstractProtocol: int getConnectionLinger()>
<org.apache.coyote.AbstractProtocol: void setSendReasonPhrase(boolean)>
<org.apache.coyote.AbstractProtocol: int getAcceptCount()>
<org.apache.coyote.AbstractProtocol: boolean getSendReasonPhrase()>
<org.apache.coyote.AbstractProtocol: void setAcceptCount(int)>
<org.apache.coyote.AsyncStateMachine: void asyncMustError()>
<org.apache.coyote.Request: java.nio.charset.Charset getCharset()>
<org.apache.coyote.Request: void setCharset(java.nio.charset.Charset)>
<org.apache.coyote.Response: java.nio.charset.Charset getCharset()>
<org.apache.coyote.ajp.AjpProcessor: void setSendReasonPhrase(boolean)>
<org.apache.coyote.http11.AbstractHttp11JsseProtocol: java.lang.String getSslImplementationShortName()>
<org.apache.coyote.http11.AbstractHttp11Protocol: boolean getSSLDisableCompression()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String[] getCompressibleMimeTypes()>
<org.apache.coyote.http11.AbstractHttp11Protocol: void setAllowHostHeaderMismatch(boolean)>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCACertificateFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSslEnabledProtocols()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCACertificatePath()>
<org.apache.coyote.http11.AbstractHttp11Protocol: boolean getSSLDisableSessionTickets()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCertificateChainFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getTruststorePass()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSslProtocol()>
<org.apache.coyote.http11.AbstractHttp11Protocol: int getSessionTimeout()>
<org.apache.coyote.http11.AbstractHttp11Protocol: boolean getAllowHostHeaderMismatch()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getCiphers()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCertificateKeyFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCipherSuite()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getKeystoreFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: int getTrustMaxCertLength()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getTruststoreType()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCARevocationPath()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getTruststoreAlgorithm()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getCrlFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getTrustManagerClassName()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getKeystoreProvider()>
<org.apache.coyote.http11.AbstractHttp11Protocol: boolean getRejectIllegalHeaderName()>
<org.apache.coyote.http11.AbstractHttp11Protocol: int getSessionCacheSize()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCertificateFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLVerifyClient()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLHonorCipherOrder()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getAlgorithm()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLProtocol()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getClientAuth()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getKeystorePass()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getTruststoreFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: void setRejectIllegalHeaderName(boolean)>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getCompressibleMimeType()>
<org.apache.coyote.http11.AbstractHttp11Protocol: void setCompressibleMimeType(java.lang.String)>
<org.apache.coyote.http11.AbstractHttp11Protocol: int getSSLVerifyDepth()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getKeystoreType()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getUseServerCipherSuitesOrder()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getKeyAlias()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getKeyPass()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLCARevocationFile()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getTruststoreProvider()>
<org.apache.coyote.http11.AbstractHttp11Protocol: java.lang.String getSSLPassword()>
<org.apache.coyote.http11.Http11InputBuffer: void (org.apache.coyote.Request,int,boolean)>
<org.apache.coyote.http11.Http11OutputBuffer: void write(java.lang.String)>
<org.apache.coyote.http11.Http11OutputBuffer: void (org.apache.coyote.Response,int,boolean)>
<org.apache.coyote.http11.Http11Processor: void (int,boolean,boolean,org.apache.tomcat.util.net.AbstractEndpoint,int,java.util.Set,int,int,java.util.Map,boolean)>
<org.apache.coyote.http11.Http11Processor: void prepareSendfile(org.apache.coyote.http11.OutputFilter[])>
<org.apache.coyote.http11.Http11Processor: void setCompressibleMimeTypes(java.lang.String[])>
<org.apache.coyote.http11.Http11Processor: org.apache.tomcat.util.net.SendfileState processSendfile(org.apache.tomcat.util.net.SocketWrapperBase)>
<org.apache.coyote.http11.Http11Processor: boolean isCompressible()>
<org.apache.coyote.http2.ConnectionException: void (java.lang.String,org.apache.coyote.http2.Http2Error,java.lang.Throwable)>
<org.apache.coyote.http2.HeaderSink: void setHeaderException(org.apache.coyote.http2.StreamException)>
<org.apache.coyote.http2.HpackDecoder$HeaderEmitter: void setHeaderException(org.apache.coyote.http2.StreamException)>
<org.apache.coyote.http2.HpackDecoder: int getMaxMemorySizeSoft()>
<org.apache.coyote.http2.Http2Exception: void (java.lang.String,org.apache.coyote.http2.Http2Error,java.lang.Throwable)>
<org.apache.coyote.http2.Http2Protocol: void setInitiatePingDisabled(boolean)>
<org.apache.coyote.http2.Http2UpgradeHandler: void setInitiatePingDisabled(boolean)>
<org.apache.coyote.http2.Stream$StreamInputBuffer: void notifyEof()>
<org.apache.coyote.http2.Stream$StreamInputBuffer: void access$000(org.apache.coyote.http2.Stream$StreamInputBuffer)>
<org.apache.coyote.http2.Stream$StreamOutputBuffer: boolean access$102(org.apache.coyote.http2.Stream$StreamOutputBuffer,boolean)>
<org.apache.coyote.http2.Stream: void setHeaderException(org.apache.coyote.http2.StreamException)>
<org.apache.coyote.http2.Stream: org.apache.coyote.Response access$300(org.apache.coyote.http2.Stream)>
<org.apache.coyote.http2.Stream: org.apache.coyote.Request access$700(org.apache.coyote.http2.Stream)>
<org.apache.coyote.http2.Stream: org.apache.coyote.http2.Http2UpgradeHandler access$500(org.apache.coyote.http2.Stream)>
<org.apache.coyote.http2.Stream: int access$600(org.apache.coyote.http2.Stream,int,boolean)>
<org.apache.coyote.http2.Stream: org.apache.juli.logging.Log access$400()>
<org.apache.coyote.http2.Stream: org.apache.tomcat.util.res.StringManager access$200()>
<org.apache.coyote.http2.Stream: void push(org.apache.coyote.Request)>
<org.apache.coyote.http2.Stream: void receivedData(int)>
<org.apache.coyote.http2.StreamProcessor: void doPush(org.apache.coyote.Request)>
<org.apache.tomcat.util.http.LegacyCookieProcessor$1: void ()>
<org.apache.tomcat.util.http.Parameters: void processParameters(org.apache.tomcat.util.buf.MessageBytes,java.nio.charset.Charset)>
<org.apache.tomcat.util.http.Parameters: java.nio.charset.Charset getCharset(java.lang.String,java.nio.charset.Charset)>
<org.apache.tomcat.util.http.Parameters: void setCharset(java.nio.charset.Charset)>
<org.apache.tomcat.util.http.Parameters: java.nio.charset.Charset getCharset()>
<org.apache.tomcat.util.http.Parameters: void setQueryStringCharset(java.nio.charset.Charset)>
<org.apache.tomcat.util.http.parser.Cookie: void parseCookieRfc2109(org.apache.tomcat.util.http.parser.Cookie$ByteBuffer,org.apache.tomcat.util.http.ServerCookies,int)>
<org.apache.tomcat.util.net.AbstractEndpoint: void reloadSslHostConfigs()>
<org.apache.tomcat.util.net.AbstractEndpoint: int getAcceptCount()>
<org.apache.tomcat.util.net.AbstractEndpoint: void setDomain(java.lang.String)>
<org.apache.tomcat.util.net.AbstractEndpoint: void reloadSslHostConfig(java.lang.String)>
<org.apache.tomcat.util.net.AbstractEndpoint: org.apache.tomcat.util.net.SSLHostConfig removeSslHostConfig(java.lang.String)>
<org.apache.tomcat.util.net.AbstractEndpoint: void setConnectionTimeout(int)>
<org.apache.tomcat.util.net.AbstractEndpoint: void addSslHostConfig(org.apache.tomcat.util.net.SSLHostConfig,boolean)>
<org.apache.tomcat.util.net.AbstractEndpoint: void setAcceptCount(int)>
<org.apache.tomcat.util.net.AbstractEndpoint: void setConnectionLinger(int)>
<org.apache.tomcat.util.net.AbstractEndpoint: int getConnectionLinger()>
<org.apache.tomcat.util.net.AbstractEndpoint: void unregisterJmx(org.apache.tomcat.util.net.SSLHostConfig)>
<org.apache.tomcat.util.net.AbstractEndpoint: java.lang.String getDomain()>
<org.apache.tomcat.util.net.AbstractEndpoint: void registerJmx(org.apache.tomcat.util.net.SSLHostConfig)>
<org.apache.tomcat.util.net.AbstractEndpoint: int getConnectionTimeout()>
<org.apache.tomcat.util.net.AbstractJsseEndpoint: javax.net.ssl.SSLEngine createSSLEngine(java.lang.String,java.util.List,java.util.List)>
<org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper: int getSSLInfoI(int)>
<org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper: byte[] getSSLInfoB(int)>
<org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper: java.lang.String getSSLInfoS(int)>
<org.apache.tomcat.util.net.AprSSLSupport: void (org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper,java.lang.String)>
<org.apache.tomcat.util.net.NioEndpoint: java.util.concurrent.CountDownLatch getStopLatch()>
<org.apache.tomcat.util.net.NioEndpoint: void access$400(org.apache.tomcat.util.net.NioEndpoint,org.apache.tomcat.util.net.NioChannel,java.nio.channels.SelectionKey)>
<org.apache.tomcat.util.net.NioEndpoint: void setStopLatch(java.util.concurrent.CountDownLatch)>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeystoreProvider()>
<org.apache.tomcat.util.net.SSLHostConfig: javax.management.ObjectName getObjectName()>
<org.apache.tomcat.util.net.SSLHostConfig: void setOpenSslConf(org.apache.tomcat.util.net.openssl.OpenSSLConf)>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeystorePassword()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateFile()>
<org.apache.tomcat.util.net.SSLHostConfig: void setRevocationEnabled(boolean)>
<org.apache.tomcat.util.net.SSLHostConfig: org.apache.tomcat.util.net.openssl.OpenSSLConf getOpenSslConf()>
<org.apache.tomcat.util.net.SSLHostConfig: boolean isCertificateVerificationDepthConfigured()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateChainFile()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeystoreFile()>
<org.apache.tomcat.util.net.SSLHostConfig: boolean getRevocationEnabled()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeyAlias()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeyPassword()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getConfigType()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.Long getOpenSslConfContext()>
<org.apache.tomcat.util.net.SSLHostConfig: void setObjectName(javax.management.ObjectName)>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeystoreType()>
<org.apache.tomcat.util.net.SSLHostConfig: java.lang.String getCertificateKeyFile()>
<org.apache.tomcat.util.net.SSLHostConfig: void setOpenSslConfContext(java.lang.Long)>
<org.apache.tomcat.util.net.SSLHostConfigCertificate: void setObjectName(javax.management.ObjectName)>
<org.apache.tomcat.util.net.SSLHostConfigCertificate: javax.management.ObjectName getObjectName()>
<org.apache.tomcat.util.net.SecureNio2Channel: void closeSilently()>
<org.apache.tomcat.util.net.SecureNioChannel: void closeSilently()>
<org.apache.tomcat.util.net.TLSClientHelloExtractor: void readAlpnExtension(java.nio.ByteBuffer,java.util.List)>
<org.apache.tomcat.util.net.TLSClientHelloExtractor: java.util.List getClientRequestedApplicationProtocols()>
<org.apache.tomcat.util.net.jsse.JSSEUtil: java.security.cert.CertPathParameters getParameters(java.lang.String,java.security.KeyStore,boolean)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: boolean access$1100(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: boolean access$200(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: org.apache.tomcat.util.net.openssl.OpenSSLSessionContext access$500(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: javax.security.cert.X509Certificate[] access$902(org.apache.tomcat.util.net.openssl.OpenSSLEngine,javax.security.cert.X509Certificate[])>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.lang.String access$1300(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.security.cert.Certificate[] access$600(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.lang.String access$1202(org.apache.tomcat.util.net.openssl.OpenSSLEngine,java.lang.String)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: void (long,java.lang.String,boolean,org.apache.tomcat.util.net.openssl.OpenSSLSessionContext,boolean,boolean)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: long access$400(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: boolean access$700(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.security.cert.Certificate[] access$602(org.apache.tomcat.util.net.openssl.OpenSSLEngine,java.security.cert.Certificate[])>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: java.security.cert.Certificate[] access$800()>
<org.apache.tomcat.util.net.openssl.OpenSSLEngine: javax.security.cert.X509Certificate[] access$900(org.apache.tomcat.util.net.openssl.OpenSSLEngine)>

4. Risk for jar-pair:org.apache.tomcat.embed:tomcat-embed-core:8.5.11:org.apache.tomcat:tomcat-juli:8.5.24:
Methods that only exist in org.apache.tomcat:tomcat-juli:8.5.24:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat:tomcat-catalina:8.5.24::compile->org.apache.tomcat:tomcat-juli:8.5.24::compile]
<org.apache.juli.AsyncFileHandler: void (java.lang.String,java.lang.String,java.lang.String,int)>
<org.apache.juli.FileHandler: java.util.Date getMaxDaysOffset()>
<org.apache.juli.FileHandler: void access$200(org.apache.juli.FileHandler,java.lang.String,java.lang.Exception,int)>
<org.apache.juli.FileHandler: java.lang.String obtainDateFromPath(java.nio.file.Path)>
<org.apache.juli.FileHandler: void ()>
<org.apache.juli.FileHandler: java.nio.file.DirectoryStream access$000(org.apache.juli.FileHandler)>
<org.apache.juli.FileHandler: int access$100(org.apache.juli.FileHandler)>
<org.apache.juli.FileHandler: java.nio.file.DirectoryStream streamFilesForDelete()>
<org.apache.juli.FileHandler: java.lang.String access$300(org.apache.juli.FileHandler,java.nio.file.Path)>
<org.apache.juli.FileHandler: void (java.lang.String,java.lang.String,java.lang.String,int)>
<org.apache.juli.FileHandler: void clean()>
<org.apache.juli.WebappProperties: boolean hasLoggingConfig()>

5. Risk for jar-pair:org.apache.tomcat.embed:tomcat-embed-core:8.5.11:org.apache.tomcat:tomcat-jni:8.5.24:
Methods that only exist in org.apache.tomcat:tomcat-jni:8.5.24:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat:tomcat-catalina:8.5.24::compile->org.apache.tomcat:tomcat-jni:8.5.24::compile]
<org.apache.tomcat.jni.SSLContext: boolean addClientCACertificateRaw(long,byte[])>
<org.apache.tomcat.jni.SSLContext: java.lang.String[] getCiphers(long)>

6. Risk for jar-pair:org.apache.tomcat.embed:tomcat-embed-core:8.5.11:org.apache.tomcat:tomcat-util:8.5.24:
a) Methods that only exist in org.apache.tomcat.embed:tomcat-embed-core:8.5.11:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat.embed:tomcat-embed-core:8.5.11::test]
<org.apache.tomcat.util.buf.UDecoder: byte convertHexDigit(byte)>

b) Methods that only exist in org.apache.tomcat:tomcat-util:8.5.24:: [nl.nlighten:tomcat_exporter_client:0.0.7-SNAPSHOT::null->org.apache.tomcat:tomcat-catalina:8.5.24::compile->org.apache.tomcat:tomcat-util:8.5.24::compile]
<org.apache.tomcat.util.ExceptionUtils: void preload()>
<org.apache.tomcat.util.buf.ByteChunk: java.lang.Object clone()>
<org.apache.tomcat.util.buf.CharChunk: java.lang.Object clone()>
<org.apache.tomcat.util.buf.MessageBytes: java.lang.Object clone()>
<org.apache.tomcat.util.buf.UDecoder: java.lang.String URLDecode(java.lang.String,java.nio.charset.Charset,boolean)>
<org.apache.tomcat.util.buf.UDecoder: java.lang.String URLDecode(java.lang.String,java.nio.charset.Charset)>
<org.apache.tomcat.util.buf.UriUtil: java.lang.String getWarSeparator()>
<org.apache.tomcat.util.compat.Jre8Compat: int jarFileRuntimeMajorVersion()>
<org.apache.tomcat.util.compat.Jre9Compat: java.lang.String getApplicationProtocol(javax.net.ssl.SSLEngine)>
<org.apache.tomcat.util.compat.Jre9Compat: java.util.jar.JarFile jarFileNewInstance(java.io.File)>
<org.apache.tomcat.util.compat.Jre9Compat: boolean jarFileIsMultiRelease(java.util.jar.JarFile)>
<org.apache.tomcat.util.compat.Jre9Compat: void disableCachingForJarUrlConnections()>
<org.apache.tomcat.util.compat.Jre9Compat: void addBootModulePath(java.util.Deque)>
<org.apache.tomcat.util.compat.Jre9Compat: void setApplicationProtocols(javax.net.ssl.SSLParameters,java.lang.String[])>
<org.apache.tomcat.util.compat.Jre9Compat: int jarFileRuntimeMajorVersion()>
<org.apache.tomcat.util.compat.JreCompat: void addBootModulePath(java.util.Deque)>
<org.apache.tomcat.util.compat.JreCompat: void disableCachingForJarUrlConnections()>
<org.apache.tomcat.util.compat.JreCompat: java.lang.String getApplicationProtocol(javax.net.ssl.SSLEngine)>
<org.apache.tomcat.util.compat.JreCompat: boolean jarFileIsMultiRelease(java.util.jar.JarFile)>
<org.apache.tomcat.util.compat.JreCompat: java.util.jar.JarFile jarFileNewInstance(java.lang.String)>
<org.apache.tomcat.util.compat.JreCompat: int jarFileRuntimeMajorVersion()>
<org.apache.tomcat.util.compat.JreCompat: java.util.jar.JarFile jarFileNewInstance(java.io.File)>
<org.apache.tomcat.util.compat.JreCompat: void setApplicationProtocols(javax.net.ssl.SSLParameters,java.lang.String[])>
<org.apache.tomcat.util.security.PrivilegedSetTccl: void (java.lang.Thread,java.lang.ClassLoader)>

Criação do contexto da aplicação no monitoramento do Pool de conexões do Datasource

Boa noite,

Realizei uma mudança no código adicionando o contexto da aplicação no monitoramento do Pool de conexões.
Caso achem interessante adicionar no aplicativo, posso enviar o código para vocês.

Só não consegui acertar os testes, não estou conseguindo simular esse comportamento sem o Tomcat.

Atenciosamente,
Rodrigo Cesar Perlin (Guina).

Syntax issue in the output

Dear @team,
I trying to install the tomcat exporter. I installed the tomcat exporter with the latest release.
I found that there is some syntax issue in the output.

Tomcat Exporter Output:
tomcat-output

Reference:
Below 2 Exporter outputs are standard exporter supported by Prometheus
Node Exporter Output
node-output

WMI Exporter Output
wmi-output

I found that there is an ',' at the labels in tomcat exporter. Due to this, I am unable to parse the syntax.

Oracle JDBC interceptor is not working

I configured my JDBC as follows:

<Resource name="jdbc/open_database_pooled"
          auth="Container" 
          connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"
          connectionPoolName="open_database_pooled" 
          defaultAutoCommit="false"
          factory="oracle.ucp.jdbc.PoolDataSourceImpl" 
          global="jdbc/open_database_pooled"
          inactiveConnectionTimeout="20" 
          maxPoolSize="50" 
          minPoolSize="10" 
          user="${db.user}" 
          password="secret" 
          url="${jdbc.url}" 
          type="oracle.ucp.jdbc.PoolDataSource"
          validateConnectionOnBorrow="true" 
          sqlForValidateConnection="select 1 from DUAL"
          jdbcInterceptors="nl.nlighten.prometheus.tomcat.TomcatJdbcInterceptor(logFailed=true,logSlow=true,threshold=1000,buckets=.01|.05|.1|1|10,slowQueryBuckets=1|10|30)"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          defaultRowPrefetch="100000"/>

But as you said in the code comment, it wont work. You wrote This interceptor will NOT work for any other connection pool (eg DBCP2)..

Do you have some hints for creating an Oracle JDBC interceptor?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.