我们有一个 spring 1.5.17 应用程序,正在尝试简单地集成 Sentry。因为这是 Spring 的旧版本(不,不可能升级),所以我们遵循 Sentry 的
Legacy SDK 1.7
指示这里。这非常简单。
这是pom.我们还使用其他 spring 库,例如logging/actuator/jpa,但为了清楚起见没有显示。都是一样的春季版本。
<dependency>
<groupId>io.sentry</groupId>
<artifactId>sentry-spring</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.17.RELEASE</version>
</dependency>
另外,在
sentry.properties
下添加了src/main/resources
文件。
enabled=true
dsn=***
environment=uat
sample.rate=1.0
stacktrace.app.packages=com.pls
stacktrace.hidecommon=false
创建了一个样板配置文件,按照哨兵文档覆盖两个 bean。
@Configuration
public class SentryConfig {
@Bean
public HandlerExceptionResolver sentryExceptionResolver() {
return new io.sentry.spring.SentryExceptionResolver();
}
@Bean
public ServletContextInitializer sentryServletContextInitializer() {
return new io.sentry.spring.SentryServletContextInitializer();
}
}
通过断点,我确认这些 bean 正在初始化,并且它们正确地从
sentry.properties
获取属性。一个相关线程,我发现如果我手动进行SentryClient.captureEvent(event)
调用,那么事件会显示在哨兵中。 这意味着哨兵客户端已正确设置并工作,但 spring 实际上并未调用 .captureEvent()
。
为了证实我的怀疑,我进入了 SentryExceptionResolver bean 并确认代码从未遇到此断点。
我尝试通过在
@RestController
即中抛出虚拟错误来触发断点。
@GET
@Path("/test")
public Object throwError(){
LOGGER.error("ERROR BEING LOGGED");
throw new RuntimeException("ERROR THROWN");
}
虽然控制台日志中肯定会抛出此错误,但它不会触发
.capture()
代码路径。
相关线程提到了一些与日志记录模块有关的内容,但我不明白这是如何相关的。
sentry-spring
依赖项正在加载所有应用程序需求,并且客户端正在初始化,只是从未实际调用!!
无论如何,我尝试添加各种日志依赖项(例如,如本sentry文档中所述的logback),但无济于事。我的配置中可能缺少什么!?!?
如果重要的话,我们确实使用 spring-boot-starter-logging...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
请注意,当我添加
sentry-logback
依赖项时,应用程序不会加载。
看来您正在使用 JAX-RS 而不是 Spring MVC。没有开箱即用的 JAX-RS - Sentry 集成。
要将异常转发到 Sentry,您还可以使用
sentry-logback
集成。您可以配置 Logback 将任何记录器错误转发到 Sentry。没有 Spring 集成的缺点是错误不会用 HTTP 请求中的上下文信息进行修饰。