스프링 부트(핵심 원리와 활용)

Ch09. 모니터링 메트릭 활용 - 메트릭 등록(카운터)

webmaster 2023. 5. 9. 01:39
728x90

마이크로미터를 사용해서 메트릭을 직접 등록하는 방법을 알아보자. 먼저 주문수, 취소수를 대상으로 카운터 메트릭을 등록해 보자..

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() 같은 함수와 함께 사용하는 것이 좋다.

728x90