Spring 기반 Prometheus + Grafana를 이용한 모니터링 (2)

꾸준하게 달리기~·2023년 8월 1일
0

스프링 + 자바

목록 보기
10/20

들어가기 앞서

스프링 부트 액추에이터는 서버의 매트릭 정보를 알려준다.
마이크로미터는 해당 매트릭 정보를 프로메테우스가 알 수 있도록 약간 변형시켜준다. (. 방식의 경로를 _ 방식으로)
프로메테우스는 마이크로미터가 변형해준 액추에이터의 메트릭 정보를 수집하고,
그라파나는 해당 정보를 그래프, 게이지 등으로 시각화해준다.

스프링부트 액추에이터에 관해 더 자세한 정보를 알고싶다면?
https://velog.io/@dlsrjsdl6505/Spring-Boot-Actuator

프로메테우스와 그라파나의 설치 방법에 대해 알고싶다면?
https://velog.io/@dlsrjsdl6505/Spring-%EA%B8%B0%EB%B0%98-Prometheus-Grafana%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81

(위 두 포스팅을 읽었다는 가정 하에 작성된 포스팅입니다!)

그렇다면 위를 통해 매트릭(정보)를 수집하고 해당 정보를 시각화 했다.
하지만, 가장 중요한 것이 있다.

서버가 망가져도 사진과 같이 지켜만 보고 있을 수는 없다.
서버가 장애가 생겼을 때는 어떻게 인지할 수 있는가?
에 관한 문제이다.



CPU

CPU에 부하를 주기 위해, 다음과 같은 컨트롤러매서드를 만들었다.

@GetMapping("cpu")
    public String cpu() { //일부러 부하를 주기 위해 만든 컨트롤러
        log.info("cpu");
        long value = 0;
        for(int i = 0 ; i < 1000000000000L ; i++) {
            value++;
        }

        return "value = " + value;
    }

서버를 실행시키고

해당 매서드를 실행시키면,

CPU사용량이 급격하게 늘어나는것을 볼 수 있다
(도중에 숫자 줄이느라 서버를 끈것)

해당 이슈가 일어날때, 프로세스를 많이 잡아먹는 로직이 위의 cpu 와 같은 로그로 등장하니, 해당 로직을 찾아 해결해야 한다



JVM memory

JVN memory에 부하를 주기 위해, 다음과 같은 컨트롤러 매서드를 만들었다.

private List<String> list = new ArrayList<>();
    @GetMapping("jvm")
    public String jvm() {
        log.info("jvm");

        for(int i = 0 ; i < 1000000 ; i++) {
            list.add("hello jvm!" + i);
        }

        return "jvm ok";
    }

서버를 실행시키고

해당 매서드를 실행시키면,

JVM의 메모리 사용량이 급격하게 늘어나는것을 볼 수 있다
보통 실무에셔는, 내 코드의 어레이리스트와 같이 어느곳에 데이터가 누적될 때 이런 이슈가 발생한다.
이렇게 급격하게 메모리 사용이 늘어나면, 서버를 내려서 원인을 찾아야 한다.




Connection pool

db와 어플리케이션을 연결시켜주는 객체인 히카리 기반의 커넥션 풀을 닫아주지 않는 다음과 같은 매서드를 작성했다.

    @Autowired
    DataSource dataSource; //히카리 기반 데이터소스 열고 닫지 않을 예정

    @GetMapping("jdbc")
    public String jdbc() throws SQLException {
        log.info("jdbc");
        Connection conn = dataSource.getConnection();
        log.info("connection info = {}", conn);
        //conn.close(); //원래 실행시켜 커넥션 풀을 닫아야 하지만, 커넥션 풀 부하를 위해 닫지 않았다.
        return "connection";
    }

서버를 실행시키고

해당 매서드를 여러번 실행시키면,

작성한 매서드 적용을 위해 갱신한 빈 공간을 제외하고 커넥션 풀이 늘어나는것을 볼 수 있다.
해당 커넥션 풀을 최대치까지 늘린 후 또 커넥션 풀을 얻어버리면,

다른 커넥션 풀이 중지되는 pending 상태가 된다.
해당 상태를 보면 보통 내가 만든것처럼 커넥션 풀이 닫히지 않아서가 아니라, 쿼리문을 날렸는데 해당 쿼리문의 수행이 지연되어 발생하게 된다.
그래서 DB나 쿼리문의 상태를 찾아보아야 한다.




로그 확인

그라파나에서 로그 확인을 위해 다음과 같이 매서드를 작성했다.

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

서버 실행 후 해당 매서드를 여러번 실행시키면,

아래와 같이 에러로그 또한 증가한 것을 알 수 있다.

에러로그가 증가했다 -> 어.. 어디서 문제 발생했는데.. 라고 생각하고,
로그 기록을 찾아보고 어디에서 발생한 로그인지 (위에서는 헬로.컨트롤러.트래픽컨트롤러에서 발생) 파악해야 한다.




마치며

REST API개발도 개발이지만,
서버를 유지. 보수하는 업무도 중요하다.
두말하면 입아플 정도이다.
그래도, 액추에이터나 프로메테우스 메트릭 정보는 글자라서 눈앞이 캄캄했는데,
그라파나를 이용해 서버에 부하를 주고 해당 상황에 취해야 할 행동까지 어느정도 알게 되니
기분이 좋다.

해당 설정, 코드들
https://github.com/ingeon2/actuator_grafana

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글