이전 포스팅에서 Promethues와 Grafana를 연동하여 모니터링 시스템을 구축해보았다.
SpringBoot가 제공하는 마이크로미터(MicroMeter) 모듈은 CPU사용률이나 메모리사용률 같은 데이터는 기본으로 제공한다. 기본으로 제공하는 메트릭이 아닌 개발자가 원하는 데이터도 메트릭으로 등록할 수 있다. 이번 포스팅에서는 메트릭 등록을 위한 예제를 만들어보고 다음 포스팅부터는 실제 메트릭 등록을 해보겠다.
데이터를 메트릭으로 등록하려면 3가지 형태 중 하나로 등록해야 한다. ( 기본 3가지이다. )
1) 카운터 ( Counter )
시간에 따라 '증가'만하는 데이터이다. 주문수는 항상 증가한다. 중간에 감소하지 않는다.
2) 게이지 ( Gauage )
시간에 따라 '증가'와 '감소'를 반복하는 데이터이다. 재고량은 쌓였다가 줄었다가 반복한다.
3) 타이머 ( Timer )
시간과 관련된 데이터이다. 실행횟수,실행시간의 합, 최장실행시간 등 시간과 관련된 정보를 제공한다.
간단한 예제 프로그램 만들기
주문을 하면 재고량이 줄고
주문취소를 하면 재고량이 늘어나는 프로그램을 만들거다.
주문수와 취소수,
두 가지 데이터를 카운터로 마이트로미터(MicroMeter)에 등록한다.
먼저 간단한 프로그램부터 만들어 보자.
SpringBoot 프로젝트를 생성한다.
프로젝트 디렉토리 구조는 위와 같다.
DemoApplication 클래스
@Import(OrderConfig.class)
@SpringBootApplication(scanBasePackages = "com.example.demo.controller")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Import를 이용하여 OrderServiceConfig를 따로 읽어 OrderService 구현체를 Bean으로 등록한다. 그리고 @SpringBootApplication은 컴포넌트 스캔기능이 있으므로 controller 디렉토리만 스캔하도록 설정한다.
OrderConfig 클래스 ( 설정 클래스 )
@Configuration
public class OrderConfig {
@Bean
public OrderService orderService(){
return new OrderServiceV0();
}
}
OrderService 인터페이스
public interface OrderService {
public void order();
public void cancel();
public AtomicInteger getStock();
}
OrderServiceV0 클래스 ( 인터페이스 구현체 )
@Slf4j
public class OrderServiceV0 implements OrderService{
private AtomicInteger stock = new AtomicInteger(100); //재고량 : 100개 ( 멀티스레드 환경 MUTEX구현 )
@Override
public void order() {
log.info("주문...");
stock.decrementAndGet(); //재고감소
}
@Override
public void cancel() {
log.info("주문취소...");
stock.incrementAndGet(); //재고증가
}
@Override
public AtomicInteger getStock() {
return stock;
}
}
OrderController 클래스 ( 컨트롤러 클래스 )
@RestController
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@GetMapping("/order")
public String order(){
orderService.order();
return "order";
}
@GetMapping("/cancel")
public String cancel(){
orderService.cancel();
return "cancel";
}
@GetMapping("/stock")
public int stock(){
return orderService.getStock().get();
}
}
프로젝트를 실행하여 정상 작동하는지 확인해본다.
그럼 다음 포스팅부터 카운터, 게이지, 타이머를 실제로 등록해보겠다.
참고자료
'SPRING > Spring Boot' 카테고리의 다른 글
[SpringBoot] 커스텀 메트릭(Metric) 등록하기 -Timer (0) | 2023.05.18 |
---|---|
[SpringBoot] 커스텀 메트릭(Metric) 등록하기 - 카운터(Counter) (0) | 2023.05.16 |
[SpringBoot] 메트릭(Metric) 이란? (0) | 2023.05.11 |
[SpringBoot] 엑츄에이터(Actuator)(3) - 로그 및 HTTP 기록 확인하기 (0) | 2023.05.11 |
[SpringBoot] 엑츄에이터(Actuator)(2) - info 엔드포인트 (0) | 2023.05.11 |