마이크로미터, 프로메테우스, 그라파나


프로덕션 준비 기능
- 지표, 추적, 감사
- 모니터링

- 액추에이터는 프로덕션 준비 기능을 매우 편리하게 사용할  있도록 다양한 편의 기능 제공
  => 마이크로미터, 프로메테우스, 그라파나


액츄에이터 관련 내용 
localhost:8080/actuator
localhost:8080/actuator/health 

management:
  endpoints:
    web:
      exposure:
        include: "*"

액츄에이터 endpoint.
1. 앤드포인트 활성화
2. 앤드포인트 노출

Http를 통해서 웹에 노출할지, jmx에 노출할지.
근데 jmx는 거의 안쓰므로 http에 노출할지말지 선택하면 된다.

엔드포인트 노출

management:
  endpoints:
    web: 
      exposure:
        include: "*"
        exclude: ""

  endpoint:
    health:
      show-details: always

운영서버는 보통 info 로그 레벨을 많이 사용.
서비스 운영중에 급하게 로그를 남겨서 확인하고 싶을 경우
로깅 설정을 변경  다시 서버를 시작해야하지만, loggers 엔드 포인트를 사용하면 바로 변경할  있다.


# 엑츄에이터 보안
-> 엑츄에어티의 엔드포인트는 외부 인터넷의 접근을 막고, 내부에서만 접근 가능한 내부망을 사용한다.

엑츄에이터를 다른 포트에서 실행
-> management.server.port=9292



마이크로미터
- 중간에 사용하는 모니터링 툴을 변경하면 코드를 모두 변경해야하지 않을까?
  -> 이걸 해결한것이 마이크로미터라는 라이브러리이다. (표준 측정 방식)

- 스프링 부트 액츄에이터는 마이크로미터를 기본으로 내장해서 사용한다.
- 마이크로미터라는 추상화가 있기 때문에 스프링은 이것을 활용.
- 로그를 추상화하는 slf4j를 떠올려보면 쉽게 이해가  것이다. (마이크로미터 - 모니터링 관련 추상화)


마이크로미터는 다양한 지표 수집 기능을 이미 만들어서 제공한다.
metrics - 측정 수치 

* 서버 매트릭 유용 (켜놓는것을 추천!)
server:
  tomcat:
    mbeanregistry:
      enabled: true

1. tomcat.threads.config.max
2. tomcat.threads.busy

* 사용자 정의 매트릭
  예를 들어서 주문수, 취소수를 매트릭으로 만들  있다. => 유용하다!
  사용자 정의 매트릭을 만들기 위해서는 마이크로미터의 사용법을 먼저 이해해야한다.

엑츄에이터를 통해서 수많은 매트릭이 자동으로 만들어진다.
-> 하지만, 어딘가에 보관해야 과거의 데이터도 확인할  있다.
-> 매트릭을 보관할 db가 필요하다, 또한 그래프를 통해 한눈에   있도록 확인할  있는 대시보드도 필요하다!

프로메테우스, 그라파나

스프링부트 액츄에이터와 마이크로미터를 사용해서  많은 매트릭을 자동으로 생성한다.
어디선가 매트릭을 지속해서 수집하고 db에 저장한다 -> 프로메테우스
사용자가 보기 편하게 보여주는 대시보드가 필요하다 -> 그라파나

https://prometheus.io/download/
-> os(darwin - 맥사용) 설치
-> 터미널에서 parkdongjun@dongjun-park prometheus-2.54.0-rc.0.darwin-amd64 % ./prometheus 실행
-> http://localhost:9090/ url 접속 (프로메테우스는 9090이 기본 포트이다.)

프로메테우스 - 애플리케이션 설정
프로메테우스가 매트릭을 수집할  있도록 연동해보자!
1. 애플리케이션 설정  implementation 'io.micrometer:micrometer-registry-prometheus'
2. 프로메테우스 설정 (수집 설정)

# 프로메테우스 url 확인
http://localhost:18099/htx/api/actuator/prometheus


# prometheus.yml에 추가
- job_name: "spring-actuator"
  metrics_path: '/actuator/prometheus'
  scrape_interval: 1s
  static_configs:
    - targets: ['localhost:18099']


# scrape_interval 운영환경에서는 10s ~ 1m 권장

프로메테우스 - 필터 기능
http_server_requests_seconds_count{uri != "/actuator/prometheus"}

프로메테우스 - 게이지와 카운터

게이지 : 임의로 오르내릴  있는  => 그대로 사용
카운터 : 단일 누적  => increase(), rate() 등을 사용해서 표현(특정 시간에 얼마나 고객의 요청이 들어왔는지 확인할  있다.)

시간 단위 요청 그래프 : increase()

프로메테우스의 단점은 한눈에 들어오는 대시보드를 만들어보기 어렵다 => 그라파나 사용해서 해결!


# 그라파나
다운 -> bin -> ./grafana-server 
=> http://localhost:3000/login 

직접 만들  있지만, 미리 만들어진 것을 가져와서 사용할  있다. 
https://grafana.com/grafana/dashboards - 공유 대시보드 활용


# 매트릭 만들기
- 비즈니스 매트릭 => 주문수, 취소수 .
- 주문수, 취소수는 계속 증가하므로 카운터를 사용하자.
- 재고 수량은 증가하거나 감소하므로 게이지를 사용하자.

=> 매트릭이 관리하는 로직이 핵심 비즈니스 로직에 추가된다.
=> 어떻게 해결할까?
=> AOP로 분리하자.

# 실무 모니터링 환경 

모니터링 3단계
1. 대시보드
2. 애플리케이션 추적 - 핀포인트(오픈소스)
3. 로그

제품
마이크로미터, 프로메테우스, 그라파나 

모니터링 대상
시스템 매트릭(CPU,메모리)
애플리케이션 매트릭(톰캣 스레드 , db커넥션 , 애플리케이션 호출 )
비즈니스 매트릭(주문수, 취소수)