Spring 1.X 中的哨兵根本不起作用
Sentry in Spring 1.X simply does not work
我们有一个 spring 1.5.17 应用程序,正在尝试简单地集成 Sentry。因为这是 Spring 的旧版本(没有升级是不可能的),我们遵循 Sentry 的 Legacy SDK 1.7
指示 here。非常简单。
配置
这是 pom.我们也使用其他 spring 库,例如 logging/actuator/jpa,但为清楚起见未显示。都是一样的 spring 版本。
<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>
此外,在 src/main/resources
下添加了 sentry.properties
文件。
enabled=true
dsn=***
environment=uat
sample.rate=1.0
stacktrace.app.packages=com.pls
stacktrace.hidecommon=false
申请
根据 sentry 文档创建了一个覆盖两个 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
获取属性。 related thread,我发现如果我手动进行 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()
代码路径。
日志记录?
related thread 提到了一些与日志模块相关的内容,但我不明白这之间有什么关系。 sentry-spring
依赖项正在加载应用程序所需的所有内容并且正在初始化客户端,只是从未实际调用过!!
无论如何,我尝试添加各种日志记录依赖项(例如 sentry doc 中描述的 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 请求的上下文信息修饰。
我们有一个 spring 1.5.17 应用程序,正在尝试简单地集成 Sentry。因为这是 Spring 的旧版本(没有升级是不可能的),我们遵循 Sentry 的 Legacy SDK 1.7
指示 here。非常简单。
配置
这是 pom.我们也使用其他 spring 库,例如 logging/actuator/jpa,但为清楚起见未显示。都是一样的 spring 版本。
<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>
此外,在 src/main/resources
下添加了 sentry.properties
文件。
enabled=true
dsn=***
environment=uat
sample.rate=1.0
stacktrace.app.packages=com.pls
stacktrace.hidecommon=false
申请
根据 sentry 文档创建了一个覆盖两个 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
获取属性。 related thread,我发现如果我手动进行 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()
代码路径。
日志记录?
related thread 提到了一些与日志模块相关的内容,但我不明白这之间有什么关系。 sentry-spring
依赖项正在加载应用程序所需的所有内容并且正在初始化客户端,只是从未实际调用过!!
无论如何,我尝试添加各种日志记录依赖项(例如 sentry doc 中描述的 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 请求的上下文信息修饰。