마이크로미터를 사용해서 메트릭을 직접 등록하는 방법을 알아보자. 먼저 주문수, 취소수를 대상으로 카운터 메트릭을 등록해 보자..
MeterRegistry
- 마이크로미터 기능을 제공하는 핵심 컴포넌트
- 스프링을 통해서 주입 받아서 사용하고, 이곳을 통해서 카운터, 게이지 등을 등록한다.
Counter(카운터)
Metric types | Prometheus
An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.
prometheus.io
- 단조롭게 증가하는 단일 누적 측정항목
- 단일 값
- 보통 하나씩 증가
- 누적이므로 전체 값을 포함(total)
- 프로메테우스에서는 일반적으로 카운터의 이름 마지막에 _total 을 붙여서 my_order_total 과 같이 표현함
- 값을 증가하거나 0으로 초기화 하는 것만 가능
- 마이크로미터에서 값을 감소하는 기능도 지원하지만, 목적에 맞지 않음
- 예) HTTP 요청수
OrderServiceV1
@Slf4j
public class OrderServiceV1 implements OrderService {
private final MeterRegistry registry;
private AtomicInteger stock = new AtomicInteger(100);
public OrderServiceV1(MeterRegistry registry) {
this.registry = registry;
}
@Override
public void order() {
log.info("주문");
stock.decrementAndGet();
Counter.builder("my.order")
.tag("class", this.getClass().getName())
.tag("method", "order")
.description("order")
.register(registry).increment();
}
@Override
public void cancel() {
log.info("취소");
stock.incrementAndGet();
Counter.builder("my.order")
.tag("class", this.getClass().getName())
.tag("method", "cancel")
.description("cancel")
.register(registry).increment();
}
@Override
public AtomicInteger getStock() {
return stock;
}
}
- Counter.builder(name) 를 통해서 카운터를 생성한다. name 에는 메트릭 이름을 지정한다.
- tag 를 사용했는데, 프로메테우스에서 필터할 수 있는 레이블로 사용된다.
- 주문과 취소는 메트릭 이름은 같고 tag 를 통해서 구분하도록 했다.
- register(registry) : 만든 카운터를 MeterRegistry 에 등록한다. 이렇게 등록해야 실제 동작한다.
- increment() : 카운터의 값을 하나 증가한다.
정리하면 각각의 메서드를 하나 호출할 때마다 카운터가 증가한다.
OrderConfigV1
@Configuration
public class OrderConfigV1 {
@Bean
public OrderService orderService(MeterRegistry registry){
return new OrderServiceV1(registry);
}
}
ActuatorApplication - 수정
@Import(OrderConfigV1.class)
@SpringBootApplication(scanBasePackages = "hello.controller")
public class ActuatorApplication {
public static void main(String[] args) {
SpringApplication.run(ActuatorApplication.class, args);
}
@Bean
public InMemoryHttpExchangeRepository httpExchangeRepository() {
return new InMemoryHttpExchangeRepository();
}
}
- OrderConfigV0 -> OrderConfigV1 이 설정되도록 변경한다.
- 주문과 취소를 각각 한번씩 실행한 다음에 메트릭을 확인해보자. (각각 실행해야 메트릭이 등록된다.)
- 실행하지 않는다면 메트릭이 추가되지 않는다.
액츄에이터 메트릭 확인
http://localhost:8080/actuator/metrics/my.order : 엑츄 에이터 메트릭 확인
http://localhost:8080/actuator/metrics/my.order?tag:method.order : 엑츄 에이터 메트릭 method.order 태그 확인
http://localhost:8080/actuator/metrics/my.order?tag:method.cancel : 엑츄 에이터 메트릭 method.cancel 태그 확인
- 메트릭을 확인해보면 method로 구분할 수 있다.
프로메테우스 포멧 메트릭 확인
http://localhost:8080/actuator/prometheus: 프로메테우스 포맷 메트릭 확인
# HELP my_order_total order
# TYPE my_order_total counter
my_order_total{class="hello.order.v1.OrderServiceV1",method="order",} 1.0
my_order_total{class="hello.order.v1.OrderServiceV1",method="cancel",} 1.0
- 메트릭 이름이 my.order -> my_order_total 로 변경된 것을 확인할 수 있다.
- 프로메테우스는 . -> _ 로 변경한다.
- 카운터는 마지막에 _total 을 붙인다. 프로메테우스는 관례상 카운터 이름의 끝에 _total 을 붙인다
- method 라는 tag , 레이블을 기준으로 데이터가 분류되어 있다.
그라파나 등록 - 주문수, 취소수
앞서 만들어둔 hello-dashboard 에 주문수, 취소수 그래프를 추가하자

Panel options
- Title : 주문수
PromQL
- increase(my_order_total{method="order"}[1m]) Legend : {{method}}
- increase(my_order_total{method="cancel"}[1m]) Legend : {{method}}
참고: 카운터는 계속 증가하기 때문에 특정 시간에 얼마나 증가했는지 확인하려면 increase() , rate() 같은 함수와 함께 사용하는 것이 좋다.
'스프링 부트(핵심 원리와 활용)' 카테고리의 다른 글
| Ch09. 모니터링 메트릭 활용 - 메트릭 등록(Timer) (0) | 2023.05.09 |
|---|---|
| Ch09. 모니터링 메트릭 활용 - 메트릭 등록(@Counted) (0) | 2023.05.09 |
| Ch09. 모니터링 메트릭 활용 - 메트릭 등록(예제 만들기) (0) | 2023.05.09 |
| Ch08. 마이크로미터, 프로메테우스, 그라파나 - 그라파나(메트릭을 통한 문제 확인) (0) | 2023.05.09 |
| Ch08. 마이크로미터, 프로메테우스, 그라파나 - 그라파나(공유 대시보드 활용) (0) | 2023.05.08 |