java - 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.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
ie 中抛出虚拟错误来触发断点。
@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
依赖项时,应用程序不会加载。
解决方案
看来您使用的是 JAX-RS 而不是 Spring MVC。没有开箱即用的 JAX-RS - Sentry 集成。
要将异常转发到 Sentry,您还可以使用sentry-logback
集成。您可以配置 Logback 以将任何记录器错误转发到 Sentry。没有 Spring 集成的缺点是错误没有使用来自 HTTP 请求的上下文信息进行修饰。
推荐阅读
- c - 尝试从 task_struct 读取进程的寄存器值
- html - 导航栏中的下拉按钮会扭曲导航栏
- python - json.load() 函数不起作用 - Python
- c++ - 为什么不调用模板化的复制构造函数?
- python - TypeError: Iterable command_prefix 或从 get_prefix 返回的列表必须只包含字符串,而不是 Cursor | 不和谐.py
- android - (Kotlin) 在 fragmentList 项上设置 OnclickListener
- matlab - 使用 arrayfun 或其他方式创建动态 matlab 函数
- c# - 如何在逻辑层访问 ClaimsIdentity
- python - 在 def 中找不到文本变量
- python - MoviePy write_videofile 需要几个小时