-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Describe the bug
When redeploying our servlet in standalone Tomcat, we see this warning in the logs:
This FunctionCounter has been already registered (MeterId{name='tomcat.servlet.error', tags=[tag(name=jsp)]}), the registration will be ignored. Note that subsequent logs will be logged at debug level.
This seems to be caused either by ignoring the WebModule key when querying the MBeans with the pattern Catalina:j2eeType=Servlet,name=*,* or by not including the WebModule as a tag for the metric.
When starting Tomcat initially, the query returns these beans:
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=dispatcherServletRegistration,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=groovyPagesServlet,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=jsp,J2EEApplication=none,J2EEServer=none
But when redeploying the servlet, many more are found and name is no longer unique without also considering WebModule:
Catalina:j2eeType=Servlet,WebModule=//localhost/,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/,name=jsp,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/docs,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/docs,name=jsp,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=CompressionFilterTestServlet,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=CookieExample,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=HelloWorldExample,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=RequestHeaderExample,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=RequestInfoExample,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=RequestParamExample,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=ServletToJsp,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=SessionExample,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=async0,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=async1,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=async2,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=async3,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=bytecounter,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=jsp,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=numberwriter,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=responsetrailer,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=simpleimagepush,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/examples,name=stock,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/host-manager,name=HTMLHostManager,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/host-manager,name=HostManager,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/host-manager,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/host-manager,name=jsp,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/manager,name=HTMLManager,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/manager,name=JMXProxy,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/manager,name=Manager,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/manager,name=Status,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/manager,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/manager,name=jsp,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=default,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=dispatcherServletRegistration,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=groovyPagesServlet,J2EEApplication=none,J2EEServer=none
Catalina:j2eeType=Servlet,WebModule=//localhost/our-servlet,name=jsp,J2EEApplication=none,J2EEServer=none
Note that if TomcatMetrics discovers some JMX beans initially, it won't register its listener and thus doesn't take action whenever the additional beans are registered. Otherwise, I would expect the warning to occur already before redeploying the servlet.
Environment
- Micrometer version: 1.15.6
- Micrometer registry: prometheus
- OS: macOS, Rocky Linux
- Java version:
openjdk version "17.0.17" 2025-10-21
OpenJDK Runtime Environment (build 17.0.17+10)
OpenJDK 64-Bit Server VM (build 17.0.17+10, mixed mode, sharing)
openjdk version "17.0.15" 2025-04-15 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.15.0.6-1) (build 17.0.15+6-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.15.0.6-1) (build 17.0.15+6-LTS, mixed mode, sharing)
To Reproduce
How to reproduce the bug:
- Run a Java servlet with Micrometer where metrics are registered with
TomcatMetrics, e.g. as done by default in a Spring Boot application with Micrometer. - Redeploy the servlet.
Expected behavior
Either one of these (not sure which is the correct one):
- Metrics are only registered for the JMX beans where the
WebModulematches the current servlet. - Metrics are disambiguated with a
WebModuletag.