SPRING/Spring Boot

[SpringBoot] 커스텀 메트릭(Metric) 등록하기 - 예제 만들기

IT록흐 2023. 5. 15. 22:27
반응형

 

 

[SpringBoot] 메트릭(Metric) 이란?

[SpringBoot] 모니터링 - 엑츄에이터(Actuator)(1) 개발이 완료되면 App을 모니터링해야 한다. ( Production-Ready ) App상태정보, 트래픽, DB상태정보 등등 다양한 모니터링 데이터를 파악해야 하는데 개발자가

lordofkangs.tistory.com

 

[Prometheus] 프로메테우스 연동하기 ( With SpringBoot )

프로메테우스(Prometheus)란? Application을 모니터링하려면 다양한 데이터를 수집해야 한다. 시간이 지남에 따라 추이가 변하는 데이터를 메트릭(Metric)이라고 하는데, CPU사용량, 메모리 사용량 등이

lordofkangs.tistory.com

 

[Grafana] 그라파나 연동하기 ( With SpringBoot, Prometheus )

그라파나(Grafana)란? 시간이 지남에 따라 추이가 변하는 데이터를 메트릭(Metric)이라 부른다. CPU 사용률, 메모리 사용률, 트래픽 등이 메트릭(Metric)에 해당된다. 메트릭은 시간별로 데이터가 수집

lordofkangs.tistory.com

 

 

이전 포스팅에서 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();
    }
}

 

 

프로젝트를 실행하여 정상 작동하는지 확인해본다. 

그럼 다음 포스팅부터 카운터, 게이지, 타이머를 실제로 등록해보겠다.

 


 

참고자료

 

스프링 부트 - 핵심 원리와 활용 - 인프런 | 강의

실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

반응형