sentry-java: Failed to register sentrySpringFilter using Spring Boot 3 and Tomcat 10.1.15

Integration

sentry-spring-boot-starter-jakarta

Java Version

17

Version

6.32.0

Steps to Reproduce

  1. Use a DockerFile with image ‘tomcat:10.1.15-jdk17-temurin-jammy’
  2. Use a spring boot application v. 3.1.5
  3. Specify maven dependency as following
<dependency>
    <groupId>io.sentry</groupId>
    <artifactId>sentry-spring-boot-starter-jakarta</artifactId>
    <version>6.32.0</version>
</dependency>
  1. the following application.properties are defined:
sentry.send-default-pii=true
sentry.release=@project.version@
sentry.environment=local
  1. There is no custom code or any sentry customization in our code
  2. It runs fine using spring boot embedded tomcat
  3. There are some strange warnings logged since updating spring boot to version 3 and changing sentry to the sentry-spring-boot-starter-jakarta package, but i do not think they are reason for the error
2023-11-02 08:21:24.284  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'io.sentry.spring.jakarta.checkin.SentryCheckInAdviceConfiguration' of type [io.sentry.spring.jakarta.checkin.SentryCheckInAdviceConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:24.674  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'io.sentry.spring.jakarta.checkin.SentryCheckInPointcutConfiguration' of type [io.sentry.spring.jakarta.checkin.SentryCheckInPointcutConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:24.682  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sentryCheckInPointcut' of type [org.springframework.aop.support.ComposablePointcut] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:24.690  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'io.sentry.spring.boot.jakarta.SentryAutoConfiguration$HubConfiguration' of type [io.sentry.spring.boot.jakarta.SentryAutoConfiguration$HubConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:24.784  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'io.sentry.spring.boot.jakarta.SentryAutoConfiguration$HubConfiguration$ContextTagsEventProcessorConfiguration' of type [io.sentry.spring.boot.jakarta.SentryAutoConfiguration$HubConfiguration$ContextTagsEventProcessorConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.388  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sentry-io.sentry.spring.boot.jakarta.SentryProperties' of type [io.sentry.spring.boot.jakarta.SentryProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.478  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'contextTagsEventProcessor' of type [io.sentry.spring.jakarta.ContextTagsEventProcessor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.490  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'inAppPackagesResolver' of type [io.sentry.spring.boot.jakarta.InAppIncludesResolver] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.495  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sentryOptionsConfiguration' of type [io.sentry.spring.boot.jakarta.SentryAutoConfiguration$HubConfiguration$Lambda$891/0x00007f099c7ea200] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.779  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sessionDataHolder' of type [org.springframework.aop.scope.ScopedProxyFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2023-11-02 08:21:25.978  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sentryHub' of type [io.sentry.HubAdapter] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.992  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sentryCheckInAdvice' of type [io.sentry.spring.jakarta.checkin.SentryCheckInAdvice] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-02 08:21:25.995  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'sentryCheckInAdvisor' of type [org.springframework.aop.support.DefaultPointcutAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

Expected Result

Application starts registering the Sentry-Filter successfully.

Actual Result

org.springframework.context.ApplicationContextException: Unable to start web server
--
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164) ~[spring-boot-3.1.5.jar:3.1.5]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:610) ~[spring-context-6.0.13.jar:6.0.13]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:738) [spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:440) [spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:174) [spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:154) [spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:96) [spring-boot-3.1.5.jar:3.1.5]
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171) [spring-web-6.0.13.jar:6.0.13]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [catalina.jar:10.1.15]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683) [catalina.jar:10.1.15]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658) [catalina.jar:10.1.15]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:712) [catalina.jar:10.1.15]
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:975) [catalina.jar:10.1.15]
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1952) [catalina.jar:10.1.15]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:10.1.15]
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123) [?:?]
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:776) [catalina.jar:10.1.15]
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426) [catalina.jar:10.1.15]
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1659) [catalina.jar:10.1.15]
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345) [catalina.jar:10.1.15]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893) [catalina.jar:10.1.15]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [catalina.jar:10.1.15]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) [catalina.jar:10.1.15]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) [catalina.jar:10.1.15]
at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:10.1.15]
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) [?:?]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) [catalina.jar:10.1.15]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [catalina.jar:10.1.15]
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [catalina.jar:10.1.15]
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917) [catalina.jar:10.1.15]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) [catalina.jar:10.1.15]
at org.apache.catalina.startup.Catalina.start(Catalina.java:795) [catalina.jar:10.1.15]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347) [bootstrap.jar:10.1.15]
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) [bootstrap.jar:10.1.15]
Caused by: java.lang.IllegalStateException: Failed to register 'filter sentrySpringFilter' on the servlet context. Possibly already registered?
at org.springframework.boot.web.servlet.DynamicRegistrationBean.register(DynamicRegistrationBean.java:122) ~[spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.RegistrationBean.onStartup(RegistrationBean.java:52) ~[spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:236) ~[spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:192) ~[spring-boot-3.1.5.jar:3.1.5]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) ~[spring-boot-3.1.5.jar:3.1.5]
... 49 more
02-Nov-2023 09:24:27.181 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/usr/local/tomcat/webapps/ROOT.war]
java.lang.IllegalStateException: Error starting child
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:686)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:712)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:975)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1952)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:776)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1659)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:845)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:240)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:917)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.startup.Catalina.start(Catalina.java:795)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:419)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:186)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
... 37 more
Caused by: org.springframework.context.ApplicationContextException: Unable to start web server
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:164)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:610)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:738)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:440)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:174)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:154)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:96)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
... 38 more
Caused by: java.lang.IllegalStateException: Failed to register 'filter sentrySpringFilter' on the servlet context. Possibly already registered?
at org.springframework.boot.web.servlet.DynamicRegistrationBean.register(DynamicRegistrationBean.java:122)
at org.springframework.boot.web.servlet.RegistrationBean.onStartup(RegistrationBean.java:52)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:236)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:192)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161)
... 49 more
02-Nov-2023 09:24:27.185 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/ROOT.war] has finished in [134,513] ms
02-Nov-2023 09:24:27.190 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
02-Nov-2023 09:24:27.269 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-127.0.0.1-8009"]
02-Nov-2023 09:24:27.566 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [135199] milliseconds
02-Nov-2023 09:33:36.966 INFO [Thread-3] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
02-Nov-2023 09:33:36.970 INFO [Thread-3] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-127.0.0.1-8009"]
02-Nov-2023 09:33:36.971 INFO [Thread-3] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
02-Nov-2023 09:33:36.972 INFO [Thread-3] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
02-Nov-2023 09:33:36.975 INFO [Thread-3] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-127.0.0.1-8009"]
02-Nov-2023 09:33:36.978 INFO [Thread-3] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
02-Nov-2023 09:33:36.978 INFO [Thread-3] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-127.0.0.1-8009"]
02-Nov-2023 09:33:36.982 WARNING [Thread-3] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.mysql.cj.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
02-Nov-2023 09:33:36.987 WARNING [Thread-3] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base@17.0.9/java.lang.Object.wait(Native Method)
java.base@17.0.9/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:91)
java.base@17.0.9/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
java.base@17.0.9/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base@17.0.9/java.lang.Thread.run(Thread.java:840)```

About this issue

  • Original URL
  • State: closed
  • Created 8 months ago
  • Comments: 15 (9 by maintainers)

Most upvoted comments

@adinauer Works like a charm! Thank you very much for the incredible fast response and the fix!

@gallusenrico @DisplayName522 we’ve just released 6.33.1 which should fix the issue. Please let us know if it helps.

Thanks for reporting, we’ll take a look. I’ve opened https://github.com/getsentry/sentry-java/issues/3068 so we can track.

What we’ve found out so far:

Starting with Spring-Boot 3.1.0 there is an exception instead of a log message, when a filter is already present in the ServletContext (https://github.com/spring-projects/spring-boot/pull/33911). I’ve not been able to get rid of the problem with 3.1.3. Only when using 3.0.12 and older as well as 3.2.0-RC1 and newer worked.

https://github.com/spring-projects/spring-boot/blob/dbe882aced8656b41d673b2542256c227bc528cd/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/DynamicRegistrationBean.java#L113-L125

In case of an embedded Tomcat, as used when running bootJar, SentrySpringServletContainerInitializer is not being used. With a dedicated Tomcat however it is being used. This combined with SpringBootServletInitializer which I extended in SentryDemoApplication causes the duplicates to surface. I presume this has always been the case but only now results in an exception.

Our hunch says, embedded tomcat sets some flag differently to ignore src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer. We’re trying to find out more here. Help appreciated.

It looks like starting with 3.2.x Spring adds filters first and only then SentrySpringServletContainerInitializer is called.

We’ve just opened https://github.com/getsentry/sentry-java/pull/3027 which seems to fix the problem. Needs some more testing before we release it.

Same here. Workaround for my was to downgrade the spring boot version to 3.1.3