【问题标题】:Sentry in Spring 1.X simply does not workSpring 1.X 中的 Sentry 根本不起作用
【发布时间】:2021-03-04 09:08:01
【问题描述】:

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

配置

这里是 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>

另外,在src/main/resources下添加了sentry.properties文件。

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 获取属性。一个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 依赖项时,应用程序不会加载。

【问题讨论】:

  • 你在那里使用 Spring MVC 吗? @GET@Path 在我看来就像 JAX-RS。不过,Logback 集成应该适合您。尝试 3.x 的最新 sentry-logback:docs.sentry.io/platforms/java/guides/logback
  • 是的 - 你的权利是 JAX-RS。这可以解释为什么没有拾取异常处理程序吗?我会尝试使用合适的弹簧控制器。关于 logback,我会尝试更新的 logback repo,但是你能帮我理解添加这个 logback 依赖项实际上在做什么吗?链接的线程也以这种方式解决,我不明白为什么某些日志记录框架会影响错误处理程序被调用...?
  • @MaciejWalkowiak - 你是对的,因为我正在使用 JAX-RS。谢谢你抓。这是一个继承的项目,我什至没有注意到其中的区别......如果你想发表作为答案,我会接受并给你代表

标签: java spring spring-boot sentry


【解决方案1】:

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

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

【讨论】:

  • 只是好奇 - 你是否对我不能在同一个项目中同时使用 sentry-spring 和 sentry-logback(旧版本 1.7.30)感到惊讶?似乎哨兵弹簧踩在哨兵logback的脚趾上......也许这是哨兵队的问题
  • 我是Sentry团队的,虽然我是3.x版本的,对1.7.x没有太多经验。 AFAIR 应该可以同时使用这两种集成,但也许您想调查源代码:github.com/getsentry/sentry-java/tree/v1.7.30
  • 好的 - 如果这发生在我们的其他服务中,我会尝试做一个小例子并发布支持票或其他东西。也会看源码。可能会搁置它,但最终会回来。再次感谢您的帮助。
猜你喜欢
  • 2017-06-03
  • 2017-12-22
  • 1970-01-01
  • 2019-09-12
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2021-11-19
相关资源
最近更新 更多