티스토리 뷰

Spring Boot에 Sentry 끼얹기 [2]회사에서 진행한 프로젝트에 sentry를 연동하면서 정리한 글이다.

프로젝트에서는 Gradle을 사용했으며, Spring boot 2.1.0, log4j2를 사용했다.

 

이전 글에서는 Spring boot에 Sentry를 설정하는 방법과 Timezone 변경하는 방법에 대해 다뤘다.

 

Spring Boot에 Sentry 끼얹기 [1]

회사에서 진행한 프로젝트에 sentry를 연동하면서 정리한 글이다. 프로젝트에서는 Gradle을 사용했으며, Spring boot 2.1.0, log4j2를 사용했다. 먼저 Spring boot 2.1.0 버전부터 지원을 한다. 위 버전 아래는

kkoon9.tistory.com

이번에는 Scope와 Breadcrumbs를 사용하여 에러에 정보를 sentry에 보내는 작업을 알아보자.

Scope & Breadcrumbs

💡
Breadcrumbs란, 핸젤과 그레텔에서 따온 용어로,
사이트나 웹 앱에서 유저의 위치를 보여주는 부차적인 내비게이션 시스템을 뜻한다고 한다.

 

Java SDK는 "scope"라는 개념을 구현하여 Breadcrumbs과 같은 이벤트에 추가 정보를 첨부할 수 있도록 지원한다.

범위는 웹 프레임워크의 전체 수명 또는 응용 프로그램의 요구에 더 적합한 다른 요청에 대한 단일 요청일 수 있다.

Breadcrumbs를 사용하여 응용 프로그램에서 발생한 action을 보여줄 수 있다.

⇒ 외부 API 요청이 있었는지, 사용자가 응용 프로그램에서 무언가를 클릭했는지 여부 등

Default로는 스코프당 마지막 100개의 브레드 크럼이 저장되고 향후 이벤트와 함께 전송된다.

Sentry에 request 정보를 보내보자.

프로젝트에서는 breadcrumbs을 이용하여 해당 request의 query, body를 함께 전송했다.

[POST일 때]

post일 때에는 request body와 URI, URL을 센트리에 함께 보내준다.

 

[GET일 때]

get일 때에는 queryString을 센트리에 함께 보내준다.

 

다음 코드는 production 환경에만 센트리 알림을 가게 설정한 코드다.

ProductSupplyContext context = ProductSupplyContextHolder.getContext();
HttpServletRequest request = context.getHttpServletRequest();

if(context.getApplicationActive().equalsIgnoreCase("production")) {
        // Add extra data to future events in this scope.
        Sentry.configureScope(scope -> {
            scope.setExtra("method", request.getMethod());

            if (!CommonUtil.isEmpty(request.getQueryString())) {
                scope.setExtra("queryString", request.getQueryString());
            }
            if (!CommonUtil.isEmpty(request.getRequestURI())) {
                scope.setExtra("requestURI", request.getRequestURI());
            }
            if (!CommonUtil.isEmpty(request.getRequestURL())) {
                scope.setExtra("requestURL", request.getRequestURL().toString());
            }
            if (request.getParameterMap().size() != 0) {
                for (String key : request.getParameterMap().keySet()) {
                    scope.setExtra(key, request.getParameter(key));
                }
            }
            try {
                scope.setExtra("requestBody", getBody(request));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        });
        Sentry.captureException(e);
    }

}

HttpServletRequest에는 body 정보를 가져오는 메서드가 없어서 추가로 만들어줬다.

public static String getBody(HttpServletRequest request) throws IOException {
    if (CommonUtil.isEmpty(request)) {
        return "";
    }
    try (InputStream inputStream = request.getInputStream();
         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {

        StringBuilder stringBuilder = new StringBuilder();
        char[] charBuffer = new char[128];
        int bytesRead;
        while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
            stringBuilder.append(charBuffer, 0, bytesRead);
        }
        return stringBuilder.toString();
        } catch (IOException ex) {
            throw ex;
        }
    }
}

이펙티브 자바에 나오는 아이템 9를 활용해서 리팩터링을 진행했다.

 

아이템[9]. try-finally보다는 try-with-resources를 사용하라

자바 라이브러리에는 close 메서드를 호출하여 직접 닫아줘야 하는 자원이 많습니다. InputStream, OutputStream, java.sql.Connection 등이 예로 있습니다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수

kkoon9.tistory.com

 

'Sping Framework' 카테고리의 다른 글

Spring Cloud Sleuth [1] - 용어  (0) 2022.04.04
Spring Boot에서 에러 처리하기  (0) 2022.04.03
Spring Boot에 Sentry 끼얹기 [1]  (0) 2022.03.26
Mono [1]  (0) 2022.02.04
MonoSink  (0) 2022.02.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함