이번엔 게이지에 대해서 알아보자!
만들어뒀던 /stock 이 게이지로 표현하기 딱 알맞은 녀석이다.
@Bean
public MyStockMetric myStockMetric(OrderService orderService, MeterRegistry registry) {
return new MyStockMetric(orderService, registry);
}
@Slf4j
static class MyStockMetric {
private OrderService orderService;
private MeterRegistry registry;
public MyStockMetric(OrderService orderService, MeterRegistry registry) {
this.orderService = orderService;
this.registry = registry;
}
@PostConstruct
public void init() {
Gauge.builder("my.stock", orderService, service -> {
log.info("stock gauge call");
return service.getStock().get();
}).register(registry);
}
}
오우... 게이지 메트릭은 등록하는 방식이 좀 다르네..?
일단 @Bean 으로 등록할 건데 MyStockMetic 클래스를 생성 하고.... orderService 에 람다를 사용해서 재고를 확인한다.

ToDoubleFunction 이 뭔지는 모르겠지만..

이렇게 10초마다 프로메테우스에서 이걸 콜해서 재고를 파악하고 있는 것 같다.
내가 생각한 동작 원리가 맞는 지 궁금해서 ChatGPT에게 물어봤다.
MyStockMetric이 생성되면 init() 이 실행 되는데 이때Gauge를 만든다. 그리고 프로메테우스에서 특정 시간마다 메트릭을 수집하는데 이 때service -> {...}이 실행된다. 맞아??

람다는 아직 익숙하지 않아서 꼬이면 바로 헷갈린다.. ㅋㅋ 그래도 내가 생각한게 맞아서 다행이다.
/actuator/metric/my.stock 접근

게이지는 아주아주 간단하게 나온다. 기본 재고 100을 보여주고 있다. (아직 /order, /cancel 호출 안해서 기본값 그대로)

# TYPE my_stock gauge 게이지로 생성된 것도 확인!!
단순하게 기본 재고 값인 100.0 을 보여주고 있다

이전 Timer 에서도 봤지만 게이지의 그래프는 아주아주 쉽게 만들 수 있다!
my_stock을 쿼리에 입력하기만 하면 끝~!!
/order와 /cancel을 호출하면 그래프가 위아래로 움직이는걸 확인 할 수 있다.
이번에는 static class 도 생략을 해보자!
@Bean
public MeterBinder stockSize(OrderService orderService) {
return registry -> Gauge
.builder("my.stock", orderService, service -> {
log.info("stock gauge call");
return service.getStock().get();
})
.register(registry);
}
와우... 클래스도 그냥 람다로 빠바박!!
그리고 중요한 거!! 아까는 MyStockClass 를 반환하는 Bean 이었다.
지금은 잘 보면 MeterBinder로 바뀐 걸 볼 수 있다.

그렇다고 한다. 이 녀석을 사용해서 자동으로 등록을 하기 때문에 클래스도 필요없고 아주 깔끔하게 코드를 작성할 수 있다!!
게이지는 앞서 봤던 Counter 나 Timer 처럼 유저의 요청으로 인해 메트릭 데이터가 생성되는게 아니라 프로메테우스가 메트릭을 수집하러 왔을 때 메트릭 데이터를 확인해서 넘겨주는 것이 아주 다른 점이다.
그러니까 Counter나 Timer같은 녀석은 유저가 특정 행동을 했을 때의 결과를 수집하는 것이고
Gauge는 시스템 정보처럼 꾸준히 감시하고 관리하는 것.
편의점에 손님이 와서 물건을 사가는 것과 직원이 계속해서 재고가 있나~ 확인하는 것 같은 느낌이라 보면 되겠다 ㅎㅎ
스프링 부트 - 핵심 원리와 활용