You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
계속 요청하면서 대시보드를 확인해보면 JVM 메모리 사용량이 계속 증가하다가 최대치를 넘는 순간 메트릭이 잡히지 않는다.
JVM 내부에서 OOM이 발생했기 때문이다.
기다려보면 애플리케이션 로그에서 다음과 같은 오류를 확인할 수 있다.
java.lang.OutOfMemoryError: Java heap space
ERROR Logs , logback_events_total 메트릭에서 ERROR 로그가 급증하는 것을 확인할 수 있다.
메트릭 등록 - 예제 만들기
앞서 보았듯이 CPU 사용량, 메모리 사용량, 톰캣 쓰레드, DB 커넥션 풀과 같이 공통으로 사용되는 기술 메트릭은 이미 등록되어 있다. 우리는 이런 이미 등록된 메트릭을 사용해서 대시보드를 구성하고 모니터링 하면 된다.
여기서 더 나아가서 비즈니스에 특화된 부분을 모니터링 하고 싶으면 어떻게 해야할까? 예를 들어서 주문수, 취소수, 재고 수량 같은 메트릭 들이 있다. 이 부분은 공통으로 만들 수 있는 부분은 아니고, 각각의 비즈니스에 특화된 부분들이다.
이런 메트릭들도 시스템을 운영하는데 상당히 도움이 된다. 예를 들어서 취소수가 갑자기 급증하거나 재고 수량이 임계치 이상으로 쌓이는 부분들은 기술적인 메트릭으로 확인할 수 없는 우리 시스템의 비즈니스 문제를 빠르게 파악하는데 도움을 준다.
예를 들어서 택배회사에 문제가 생겨서 고객들이 많이 기다리다가 지쳐서 취소수가 증가해도 CPU, 메모리 사용량 같은 시스템 메트릭에는 아무런 문제가 발생하지 않는다. 이럴 때 비즈니스 메트릭이 있으면 이런 문제를 빠르게 인지할 수 있다.
비즈니스에 관한 부분은 각 비즈니스 마다 구현이 다르다. 따라서 비즈니스 메트릭은 직접 등록하고 확인해야 한다.
여기서는 우리 비즈니스의 실시간 주문수, 취소수 또 실시간 재고 수량을 메트릭으로 등록하고 확인해보자. 각각의 메트릭은 다음과 같이 정의했다.
주문수, 취소수
상품을 주문하면 주문수가 증가한다.
상품을 취소해도 주문수는 유지한다. 대신에 취소수를 증가한다.
재고 수량
상품을 주문하면 재고 수량이 감소한다.
상품을 취소하면 재고 수량이 증가한다.
재고 물량이 들어오면 재고 수량이 증가한다.
주문수, 취소수는 계속 증가하므로 카운터를 사용하자.
재고 수량은 증가하거나 감소하므로 게이지를 사용하자.
OrderService
packagehello.order;
importjava.util.concurrent.atomic.AtomicInteger;
//주문, 취소, 재고 수량을 확인할 수 있는 주문 서비스 인터페이스이다.publicinterfaceOrderService {
voidorder();
voidcancel();
AtomicIntegergetStock();
}
앞서 만든 OrderServiceV1 의 가장 큰 단점은 메트릭을 관리하는 로직이 핵심 비즈니스 개발 로직에 침투했다는 점
이다. 이런 부분을 분리하려면 어떻게 해야할까? 바로 스프링 AOP를 사용하면 된다. 직접 필요한 AOP를 만들어서 적용해도 되지만, 마이크로미터는 이런 상황에 맞추어 필요한 AOP 구성요소를 이미 다 만들어두었다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
그라파나 - 메트릭을 통한 문제 확인
CPU 사용량 초과
TrafficController - cpu() 추가
실행
http://localhost:8080/cpu
(여러 번 요청하고 JVM 메모리 사용량을 확인하자)
결과
대시보드를 확인해보면 CPU 사용량이 증가하는 것을 확인할 수 있다. 아마 요청 하나당 코어 하나를 100% 사용할 것이다. 더 많이 요청하면 더 많은 CPU를 사용한다.
JVM 메모리 사용량 초과
TrafficController - jvm() 추가
실행
http://localhost:8080/jvm
(여러 번 요청하고 JVM 메모리 사용량을 확인하자)
결과
계속 요청하면서 대시보드를 확인해보면 JVM 메모리 사용량이 계속 증가하다가 최대치를 넘는 순간 메트릭이 잡히지 않는다.
JVM 내부에서 OOM이 발생했기 때문이다.
기다려보면 애플리케이션 로그에서 다음과 같은 오류를 확인할 수 있다.
java.lang.OutOfMemoryError: Java heap space
커넥션 풀 고갈
TrafficController - jdbc() 추가
실행
http://localhost:8080/jdbc
(10번 이상 실행하자)
결과
Active 커넥션이 커넥션 풀의 최대 숫자인 10개를 넘어가게 되면, 커넥션을 획득하기 위해 대기(Pending)하게 된다.
그래서 커넥션 획득 부분에서 쓰레드가 대기하게 되고 결과적으로 HTTP 요청을 응답하지 못한다.
DB 커넥션을 획득하기 위해 대기하던 톰캣 쓰레드가 30초 이상 DB 커넥션을 획득하지 못하면 다음과 같은 예외가 발생하면서 커넥션 획득을 포기한다.
Connection is not available, request timed out after 30004ms.
에러 로그 급증
애플리케이션에서 ERROR 레벨의 로그가 급증한다면 심각한 문제가 발생한 것으로 이해할 수 있다.
TrafficController - errorLog() 추가
실행
http://localhost:8080/error-log
(여러번 실행하자)
결과
ERROR Logs , logback_events_total 메트릭에서 ERROR 로그가 급증하는 것을 확인할 수 있다.
메트릭 등록 - 예제 만들기
여기서는 우리 비즈니스의 실시간 주문수, 취소수 또 실시간 재고 수량을 메트릭으로 등록하고 확인해보자. 각각의 메트릭은 다음과 같이 정의했다.
주문수, 취소수
재고 수량
OrderService
OrderService
OrderConfigV0
OrderController
메트릭 등록1 - 카운터
MeterRegistry
Counter(카운터)
주문수, 취소수, 서비스에 카운터 메트릭을 적용해 보자
OrderServiceV1
정리하면 각각의 메서드를 하나 호출할 때 마다 카운터가 증가한다.
OrderConfigV1
ActuatorApplication - 수정
프로메테우스 포멧 메트릭 확인

그라파나 등록 - 주문수, 취소수
Panel options
PromQL
참고: 카운터는 계속 증가하기 때문에 특정 시간에 얼마나 증가했는지 확인하려면 increase() , rate() 같은 함수
와 함께 사용하는 것이 좋다.
메트릭 등록2 -@counted
이다. 이런 부분을 분리하려면 어떻게 해야할까? 바로 스프링 AOP를 사용하면 된다. 직접 필요한 AOP를 만들어서 적용해도 되지만, 마이크로미터는 이런 상황에 맞추어 필요한 AOP 구성요소를 이미 다 만들어두었다.
OrderServiceV2
OrderConfigV2
ActuatorApplication - 변경
Beta Was this translation helpful? Give feedback.
All reactions