1. 커스텀 메트릭을 사용하는 이유

    1. 기본적으로 CPU, 커넥션 등의 공통 메트릭은 제공
    2. 하지만, 각 시스템 별로 주문, 입장 등의 메트릭을 관리하려고 할 때, 시스템별로 메트릭이 달리짐
    3. 이에 따라 커스텀 메트릭을 작성하여 시스템 별로 관리
  2. 예제로 재고 관리 코드 작성

    OrderService 구현체 작성

    OrderService 구현체 작성

    OrderService 구현체 빈 등록

    OrderService 구현체 빈 등록

    OrderController 에서 OrderService 사용하도록 작성

    OrderController 에서 OrderService 사용하도록 작성

  3. 마이크로미터를 사용해 메트릭 등록

    1. MeterRegistry

      1. 마이크로미터 기능을 제공하는 컴포넌트
      2. 스프링을 통해 빈을 주입받을 수 있으며, 이를 통해 카운터/게이지 등을 등록
    2. 카운터

      1. 단조롭게 증가만 하는 단일 누적 항목
      2. 보통 하나씩 증가, 누적이므로 전체 값을 포함(total)
      3. 프로메테우스에서는 일반적으로 카운터의 이름 마지막에 _total을 붙여서 my_order_total과 같이 표현
      4. 값이 증가하거나 0으로 초기화만 가능
      5. 카운터값을 감소시킬 수는 있으나 취지에 맞지 않음
      6. 예) http 요청수, log발생
    3. 카운터 메트릭 생성 코드

      각종 정보가 들어간 Counter 메트릭 생성하고 를 통해 증가

      각종 정보가 들어간 Counter 메트릭 생성하고 increment()를 통해 증가

      my.order 메트릭 조회

      my.order 메트릭 조회

      프로메테우스 메트릭 조회

      프로메테우스 메트릭 조회

      프로메테우스 메트릭 그라파나 적용

      프로메테우스 메트릭 그라파나 적용

      1. Counter.builder(name)를 통해서 카운터 생성 name은 메트릭 이름
      2. tag를 사용하는데 프로메테우스에서 필터할 수 있는 레이블로 사용
      3. 주문/취소 메트릭 이름을 같게 하고 tag로 구분
      4. registry(registry) 를 통해 카운터를 MeterRegistry에 등록
      5. increment() 카운터의 값을 증가시킴
      6. 이렇게 코드로 작성하면 서버 실행시 바로 메트릭에 등록되지 않기 때문에 최소 한번 카운트를 누적시켜야함(의문)
      7. http://localhost:8080/actuator/metrics/{name}으로 조회
      8. http://localhost:8080/actuator/prometheus 에서 프로메테우스 타입으로 조회된느데 . 대신 _ 가 사용되고 counter 메트릭이므로 _total이 붙음
      9. 그라파나에서 적용할 때 카운터 값을 increase()를 통해 증가 수치를 나타내도록함
  4. @Counted를 이용한 간단한 메트릭 등록

    적용 코드 예시 그냥 @Counted 어노테이션만 사용

    적용 코드 예시 그냥 @Counted 어노테이션만 사용

    AOP를 적용하기 위한 Bean 등록

    AOP를 적용하기 위한 Bean 등록

    my.order 메트릭 조회(커스텀 메트릭보다 다양한 tag 기본 제공)

    my.order 메트릭 조회(커스텀 메트릭보다 다양한 tag 기본 제공)

    프로메테우스 메트

    프로메테우스 메트

    1. 앞서 만들 메트릭의 단점은 비즈니스 로직에 메트릭 관리 로직이 함께 쓰인다는 점
    2. 이런 부분을 분리하기 위해 AOP를 사용하면 됨(미리 만들어 제공)
    3. @Counted 어노테이션을 워하는 메서드에서 적용하며, 애트리뷰트로 메트릭 이름 작성해주면됨(tag를 method 기준으로 분리해줌)
    4. 추가적으로 AOP 적용을 위해 Bean을 등록해줘야함 CountedAspect 타입
  5. 타이머 메트릭

    1. 타이머는 시간을 측정해주는 메트릭

    2. 카운터와 유사하지만, 실행 시간이 함께 측정됨

    3. 3가지 내용을 한번에 측정

      1. seconds_count: 누적 실행 수(카운터)
      2. seconds_sum: 실행 시간 합(sum)
      3. seconds_max: 최대 실행 시간(가장 오래 걸린 실행 시간 → 게이지)
      4. seconds_max의 경우 내부에 타임 윈도우 개념이 있어서 1~3분마다 최대 실행 시간 갱신
      5. seconds_sum / seconds_count 를 통해 평균 실행시간을 구할수도 있음
    4. 커스텀 타이머 메트릭

      주의할 점은 cancel메서드 전체가 측정되는 것이 아닌 record 부분만 측정, 다양한 값을 측정하기 위해 random으로 스레드 sleep

      주의할 점은 cancel메서드 전체가 측정되는 것이 아닌 record 부분만 측정, 다양한 값을 측정하기 위해 random으로 스레드 sleep

      3가지 부분을 측정하는 Timer 메트릭스

      3가지 부분을 측정하는 Timer 메트릭스

      프로메테우스 메트릭스도 3가지

      프로메테우스 메트릭스도 3가지

      평균 실행 시간 패널이며 increase를 통해 구간별로 확인할 수 있도록 함(취향)

      평균 실행 시간 패널이며 increase를 통해 구간별로 확인할 수 있도록 함(취향)

  6. @Timed를 통한 메트릭 등록

    @Timed어노테이션 클래스 레벨 작성(모든 메서드에 적용되므로 에도 적용

    @Timed어노테이션 클래스 레벨 작성(모든 메서드에 적용되므로 getStock()에도 적용

    AOP적용을 위한 TImedAspect 빈 작성(MeterRegistry 객체 필수)

    AOP적용을 위한 TImedAspect 빈 작성(MeterRegistry 객체 필수)

    1. @Counted와는 달리 메서드, 클래스 둘 다 적용 가능한 어노테이션
    2. 클래스 레벨에서 작성하면 하위 메서드에 대해 모두 적용
    3. @Counted와 마찬가지로 AOP 적용을 위해 TimedAspect 빈을 작성해야함
  7. 게이지 메트릭 등록

    1. 게이지

      1. 오르내릴 수 있는 단일 숫자 값의 메트릭
      2. 값의 현재 상태를 확인하기 위해 사용
      3. 값의 증가와 감소가 가능
      4. 예) 차량의 속도, CPU 사용량
    2. 게이지 메트릭 작성

      처음에 게이지를 생성해주고 넘겨준 객체, 함수를 이용해서 현재 값을 가져오는 방식

      처음에 게이지를 생성해주고 넘겨준 객체, 함수를 이용해서 현재 값을 가져오는 방식

      게이지 메트릭 코드 단순화할 수 있는 방식

      게이지 메트릭 코드 단순화할 수 있는 방식

  8. 정 리

    1. 마이크로미터의 사용법
      1. 메트릭을 100% 정확한 값을 본다기 보다 대략적인 값으로 추세를 보는 용도
      2. 약간의 오차는 감수할 수 있는 데이터에 사용
    2. 마이크로미터 핵심 기능
      1. Counter, Timed, Gauge, Tags
    3. MeterRegistry
      1. 마이크로미터 기능을 제공하는 핵심 컴포넌트
      2. 스프링을 통해 주입 받아 사용, 이를 통해 커스텀 메트릭 등록
    4. Counter
      1. 단조롭게 증가만 하는 메트릭
      2. 값의 증가 또는 초기화만 가능함
    5. Gauge
      1. 임의로 오르내릴 수 있는 단일 숫자 값
      2. 값의 현재 상태 확인 가능
    6. Timer
      1. 시간을 측정하는 도구
      2. 카운터와 유사하며, 실행 시간도 함께 측정 가능
      3. 3가지 내용 한번에 측정 → 누적 실행 수, 실행 시간의 합, 최대 실행 시간
    7. Tag
      1. 데이터를 나눠서 보기위한 파라미터
      2. Tag를 잘 활용하기 위해서는 카디널리티가 낮은(중복이 많은)데이터에 활용해야함
      3. 카디널리티가 높을 수록 데이터 분리가 많이 이루어지기 때문