首页 > 解决方案 > Spring 1.X 中的 Sentry 根本不起作用

问题描述

我们有一个 spring 1.5.17 应用程序,并试图简单地集成 Sentry。因为这是 Spring 的旧版本(不可能升级),所以我们在这里Legacy SDK 1.7遵循 Sentry 的指示。这很简单。

配置

这里是 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.propertiessrc/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 并确认代码从未遇到此断点。

在此处输入图像描述

我试图通过在@RestControllerie 中抛出虚拟错误来触发断点。

@GET
@Path("/test")
public Object throwError(){
  LOGGER.error("ERROR BEING LOGGED");
  throw new RuntimeException("ERROR THROWN");
}

虽然控制台日志中肯定会抛出此错误,但它不会触发.capture()代码路径。

记录?

相关线程提到了一些与日志模块有关的内容,但我不明白这是如何相关的。 sentry-spring依赖项正在加载所有应用程序需求并且正在初始化客户端,但从未真正调用过!

无论如何,我尝试添加各种日志记录依赖项(例如,本哨兵文档中描述的 logback )无济于事。我的配置中可能缺少什么!?!?

万一这很重要,我们确实使用 spring-boot-starter-logging ...

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

请注意,当我添加sentry-logback依赖项时,应用程序不会加载。

在此处输入图像描述

标签: javaspringspring-bootsentry

解决方案


看来您使用的是 JAX-RS 而不是 Spring MVC。没有开箱即用的 JAX-RS - Sentry 集成。

要将异常转发到 Sentry,您还可以使用sentry-logback集成。您可以配置 Logback 以将任何记录器错误转发到 Sentry。没有 Spring 集成的缺点是错误没有使用来自 HTTP 请求的上下文信息进行修饰。


推荐阅读