Spring Boot 3rd-party (Sentry + DataDog + Vault) integration 1. Sentry 연동

예제 코드는 Github repository에서 확인 가능합니다.


Sentry를 Java project에 연동하는 방식이 여러가지 있겠지만 여기서는 Logback과 통합해서 쓰는 식으로 진행하도록 하겠다.

(Sentry 계정이 있다는 가정하에 진행하도록 하겠다.)

Sentry 프로젝트 생성

먼저 특정 애플리케이션을 위한 Sentry Project를 새로 생성하도록 한다.

PlatformJava로 설정하고 Project-name을 지정한 뒤 Create Project를 눌러 프로젝트를 생성한다.

SettingsProjects에 보면 새로 만든 Project가 있는 걸 볼 수 있다.

새로 생성한 프로젝트를 선택하고 SDK SETUPClient Key(DSN)을 클릭하면 DSN을 확인할 수 있다.
이 Key를 사용하여 Sentry와 연동할 수 있다.
(이 Key는 secret 값이므로 외부에 노출되선 안된다)

Sentry Logback 설정

Sentry는 편리하게 Logback - Spring Boot integration library를 제공한다.
다음 dependency를 build.gradle에 추가하자.

1
2
compile 'io.sentry:sentry-logback:1.7.30'
compile 'io.sentry:sentry-spring-boot-starter:1.7.30'

※ sentry-logback, sentry-spring-boot-starter library가 3.0.0 버전이 최근에 새로 나왔다.
설정이 많이 바뀌었으니 해당 버전은 아래를 참고하도록 하자.
https://docs.sentry.io/platforms/java/guides/spring-boot


src/main/resources/logback-spring.xml을 다음과 같이 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>

<!-- Appenders -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- Spring's Console Log Pattern -->
<pattern>CONSOLE: ${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<appender name="Sentry" class="io.sentry.logback.SentryAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<!-- Spring's Console Log Pattern -->
<pattern>SENTRY: ${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- Loggers with Profile -->
<springProfile name="local">
<logger name="io.github.ivvve.thirdparty" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="Sentry"/>
</logger>
</springProfile>
</configuration>

설정에 있는 것 처럼 SentryAppender를 사용하여 Logback과 간단하게 통합할 수 있다.
예제에서는 SentryAppender는 오류 로그만 보내기 위해서 WARN 이상만 로그를 찍도록 설정하였다.

CONSOLE_LOG_PATTERN은 Spring Boot 실행 시 콘솔에 찍히는 로그의 포멧이다.
예제에서는 따로 패턴을 정하지 않고 Spring Boot 기본 패턴을 사용하도록 하겠다.

그리고 Sentry와 연동하기 위해 src/main/resources/application-local.yml을 다음과 같이 설정한다.

sentry.dsn은 앞서 생성한 Senty 프로젝트의 DSN 값을 사용하면되고
sentry-stacktrace.app-packages는 각자 Spring Boot 프로젝트 패키지에 맞게 설정하면 된다.

1
2
3
4
5
6
sentry:
enabled: true
dsn: your dsn
stacktrace:
app-packages:
- io.github.ivvve.thirdparty

실행을 통한 테스트

로그를 확인하기 위해 다음과 같이 기본 main application class에 controller를 추가하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// src/java/io/github/ivvve/thirdparty/ThirdpartyApplication.java

package io.github.ivvve.thirdparty;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class ThirdpartyApplication {

public static void main(String[] args) {
SpringApplication.run(ThirdpartyApplication.class, args);
}

}

@Slf4j
@RestController
class HelloWorldController {
@GetMapping("/debug")
public String debug() {
log.debug("debug");
return "debug";
}

@GetMapping("/info")
public String info() {
log.info("info");
return "info";
}

@GetMapping("/warn")
public String warn() {
log.warn("warn");
return "warn";
}

@GetMapping("/error")
public String error() {
log.error("error");
return "error";
}
}

application.yml을 개발 환경에에 맞게 설정하였기 때문에(application-local.yml) 환경변수 spring.profiles.activelocal로 설정하여 실행해야한다.

나는 IntelliJ의 도움을 받아서 설정하였다.

앱을 실행한 뒤 curl로 /debug, /info, /warn, /error에 요청을 보내보자

1
2
3
4
5
6
7
8
9
10
11
$ curl http://localhost:8080/debug
debug

$ curl http://localhost:8080/info
info

$ curl http://localhost:8080/warn
warn

$ curl http://localhost:8080/error
error

그러면 아래와 같이 console 로그가 찍히는 걸 확인할 수 있다.

그리고 Sentry Issues에 보면 WARN, ERROR 로그가 찍혀있는 걸 확인할 수 있다.
(로깅 최소 레벨을 WARN으로 설정하였기 때문에 WARN, ERROR 만 찍힌다.)

실제 개발 환경에 맞춰 설정값 변경

앞서 과정을 통해 연동이 되는 것을 확인하였지만, local 개발 중에는 Sentry에 로그를 보내고 싶진 않을테니 profile에 따라 설정값을 변경하도록 한다.
(예제는 다음과 같이 local, dev, qa, stage, prod 로 phase를 나눠서 설정하였다.)

src/main/resources/logback-spring.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>

<!-- Appenders -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- Spring's Console Log Pattern -->
<pattern>CONSOLE: ${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<appender name="Sentry" class="io.sentry.logback.SentryAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<!-- Spring's Console Log Pattern -->
<pattern>SENTRY: ${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- Loggers with Profile -->
<springProfile name="local">
<logger name="io.github.ivvve.thirdparty" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
</springProfile>

<springProfile name="dev">
<logger name="io.github.ivvve.thirdparty" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="Sentry"/>
</logger>
</springProfile>

<springProfile name="qa">
<logger name="io.github.ivvve.thirdparty" level="INFO" additivity="false">
<appender-ref ref="Console"/>
<appender-ref ref="Sentry"/>
</logger>
</springProfile>

<springProfile name="stage">
<logger name="io.github.ivvve.thirdparty" level="WARN" additivity="false">
<appender-ref ref="Sentry"/>
</logger>
</springProfile>

<springProfile name="prod">
<logger name="io.github.ivvve.thirdparty" level="WARN" additivity="false">
<appender-ref ref="Sentry"/>
</logger>
</springProfile>
</configuration>

그리고 application-local.yml에서 Spring Boot의 Sentry 설정 자체를 꺼버리자.

1
2
3
4
5
6
sentry:
enabled: false
dsn: your dsn
stacktrace:
app-packages:
- io.github.ivvve.thirdparty

지금까지 Sentry 연동 설정을 하였고 다음은 Spring Boot와 DataDog을 연동하는 방법에 대해 알아보도록 하겠다.

참고: https://docs.sentry.io/platforms/java/

Share