Sentry environment 설정방법
이번엔 java프로젝트에서 sentry environment 설정 코드를 한번 보려고합니다.
프로젝트를 진행하면서 sentry설정을 하는도중, local에서 계속 production으로(찾고나니 default설정이 production이네요) 작성이 되어있는 부분이 거슬려서 environment 설정은 어떻게 하는지 한번 확인해봤고 이를 기록하고자 합니다.
우선 결론부터 작성하면 저는 아래와 같이 적용하였습니다.
- 리소스 아래에 sentry.properties 를 생성하여 아래 문구 적용
dsn= 본인의 sentry의 dsn를 사용합시다!
environment=local
servername=project이름
- java 실행의 변수를 담는곳에 -Dsentry.environment=${SPRING_PROFILES_ACTIVE} (SPRING_PROFILES_ACTIVE 는 환경에따라 유동적)
위에와 같이 적용하게 되면 local환경에서는 테스트 시에, 별도의 SPRING_PROFILES_ACTIVE를 세팅하지않으면 local이라 작성이되고, 배포를 실제로 하게되면 SPRING_PROFILES_ACTIVE가 세팅이 되어 정상적으로 운영환경에 맞는 environment가 노출됩니다.
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
일단 해결 후, 이게 왜이렇게 동작이 될까가 궁금하니 한번 조사해보았습니다.
우선 sentry에서 environment 를 세팅하는 코드를 먼저 추적해봤습니다. ( logback에 있는 SentryAppender 부터 추적시작)
코드를 찾아보던 도중 봤을땐, SentryOptions 이라는 class에 sentry각종 변수를 기록하고있었고, 이를 provider라는 곳에서 꺼내쓰고 있었습니다.
그러면 이 provider는 어떻게 세팅이 되는가를 찾아봤더니,Sentry구동 시점에 PropertiesProviderFactory.create()가 호출이 되며 세팅이 되고있었고, 아래와 같이 순서대로 provider가 list에 추가 및 저장이 됩니다.
감사하게도 순서가 전부다 작성이 되어있네요!
(https://getsentry.github.io/sentry-java/io/sentry/config/PropertiesProviderFactory.html)
실제로 이 provider에서 꺼내쓰는 경우, 아래와 같이 동작하게됩니다.
// 호출
propertiesProvider.getProperty("environment")
// 내부코드
@Override
public @Nullable String getProperty(@NotNull String property) {
for (final PropertiesProvider provider : providers) {
final String result = provider.getProperty(property);
if (result != null) {
return result;
}
}
return null;
}
list에서 순차적으로 꺼내 쓰는 구조로, provider를 설정한 순서에 따라 값을 찾고, 먼저 발견된 provider의 값을 사용하게 됩니다.
즉 위에와 같이 세팅하게되면, systemProperty로 세팅한 값이 가장 우선순위라서 sentry.properties에 설정된 environment 설정은 무시되는 거였습니다.
local에서 sentry를 띄우는 일을 할 일이 거의 없겠지만, 혹시라도 띄우게 된다면 저렇게 세팅하시거나, 아니면 우선순위에 맞게끔 설정하셔서 쓰는것도 방법이 되겠습니다.