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 请求的上下文信息修饰。