그라파나로 애플리케이션 상태 확인

이전 글에서 로컬에 프로메테우스 및 그라파나를 설치해보고 적용까지 해보았다.

공유 대시보드 중에는 스프링부트 애플리케이션 상태를 확인할 수 있는 대시보드가 있다.

임의로 몇 가지 장애 상황을 만들어보고 이 대시보드로 애플리케이션 상태를 확인해보았다.

장애 상황은 아래와 같이 설정했다.

  1. JVM 메모리 고갈
  2. 커넥션 풀 고갈
  3. error 로그 급증

사용 기술

  • Spring Boot 3.2.4 / gradle-kotlin
  • Java 17
  • Spring Boot Actuator, Prometheus, Grafana

1. memory 고갈

의도적으로 List에 문자열을 채워 애플리케이션의 힙 메모리를 가득 채워보았다.

예시 코드는 아래와 같다.

해당 엔드포인트를 여러번 호출하면서 그래프 추이를 살펴보았다.

TrafficController

private List<String> list = new ArrayList<>();

@GetMapping("/jvm")
public String jvm() {
    log.info("[jvm]");
    for (int i = 0; i < 1000000; i++) {
        list.add("hi" + i);
    }
    return "jvm success";
}

 

로컬에서 한거라 메모리를 다 채우기 힘들어서 도중에 멈췄지만 아래와 같이 메모리 사용량을 그래프로 확인할 수 있다.


2. Connection pool 고갈

커넥션 풀 고갈을 위해 의도적으로 커넥션을 열고 close() 해주지 않았다.

예시 코드는 아래와 같다.

해당 엔드포인트를 여러번 호출하면서 그래프 추이를 살펴보았다.

TrafficController

@Autowired
DataSource dataSource;

@GetMapping("/jdbc")
public String jdbc() throws SQLException {
    log.info("jdbc");
    Connection conn = dataSource.getConnection();
    // conn.close(); // 커넥션을 닫지 않아본다.
    return "ok";
}

2-1. 정상 상태

Hikari CP 커넥션 풀 기본 설정인 10개 중 8개를 사용해보니 아래와 같은 그래프를 확인할 수 있었다.

2-2. 커넥션 풀 고갈

커넥션 풀을 10개를 다 쓰고 추가로 커넥션 풀이 필요한 요청을 하면 그 요청은 이전 커넥션 풀이 반환될 때 까지 대기상태가 된다.

일정 시간 대기하다가 여전히 사용 가능한 커넥션 풀이 없다면 그 요청은 Timeout이 된다.

요청이 Timeout이 되어 반려되면 아래와 같이 Connection Timeout Count가 올라간다.


3. error 로그 급증

에러 로그를 급증시켜보았다.

예시 코드는 아래와 같다.

해당 엔드포인트를 여러번 호출하면서 그래프 추이를 살펴보았다.

TrafficController

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

 

아래처럼 에러로그가 증가하는 그래프를 확인할 수 있었다.

 

+ Recent posts