Spring Boot ‐ 모니터링 메트릭 활용 - dnwls16071/Backend_Summary GitHub Wiki

📚 마이크로미터

  • 마이크로미터는 애플리케이션 메트릭 파사드라고 불리는데, 애플리케이션 메트릭(측정 지표)을 마이크로미터가 정한 표준 방법으로 모아서 제공해준다.
  • 마이크로미터가 추상화를 통해서 구현체를 갈아끼울 수 있도록 해두었다.

📚 메트릭(Metric)

{
  "names": [
    "application.ready.time",
    "application.started.time",
    "disk.free",
    "disk.total",
    "executor.active",
    "executor.completed",
    "executor.pool.core",
    "executor.pool.max",
    "executor.pool.size",
    "executor.queue.remaining",
    "executor.queued",
    "http.server.requests.active",
    "jvm.buffer.count",
    "jvm.buffer.memory.used",
    "jvm.buffer.total.capacity",
    "jvm.classes.loaded",
    "jvm.classes.unloaded",
    "jvm.compilation.time",
    "jvm.gc.live.data.size",
    "jvm.gc.max.data.size",
    "jvm.gc.memory.allocated",
    "jvm.gc.memory.promoted",
    "jvm.gc.overhead",
    "jvm.info",
    "jvm.memory.committed",
    "jvm.memory.max",
    "jvm.memory.usage.after.gc",
    "jvm.memory.used",
    "jvm.threads.daemon",
    "jvm.threads.live",
    "jvm.threads.peak",
    "jvm.threads.started",
    "jvm.threads.states",
    "logback.events",
    "process.cpu.time",
    "process.cpu.usage",
    "process.files.max",
    "process.files.open",
    "process.start.time",
    "process.uptime",
    "system.cpu.count",
    "system.cpu.usage",
    "system.load.average.1m",
    "tomcat.sessions.active.current",
    "tomcat.sessions.active.max",
    "tomcat.sessions.alive.max",
    "tomcat.sessions.created",
    "tomcat.sessions.expired",
    "tomcat.sessions.rejected"
  ]
}
  • 많은 메트릭을 볼 수 있다.
  • 각 메트릭에 대한 설명은 공식문서로 대체한다.

Metrics

📚 다양한 메트릭

JVM 메트릭

  • 메모리 및 버퍼 풀 세부 정보
  • 가비지 수집 관련 통계
  • 쓰레드 활용
  • 로그 및 언로드된 클래스 수
  • JVM 버전 정보
  • JIT 컴파일 시간

시스템 메트릭

  • CPU 지표
  • 파일 디스크립터 메트릭
  • 가동 시간 메트릭
  • 사용 가능한 디스크 공간

애플리케이션 시작 메트릭

  • 애플리케이션을 시작하는데 걸리는 시간
  • 애플리케이션이 요청을 처리할 준비가 되는데 걸리는 시간

스프링 MVC 메트릭

  • 요청 URI
  • HTTP 메서드
  • HTTP Status Code
  • 예외
  • 상태코드를 그룹으로 모아서 확인

데이터 소스 메트릭

  • 최대 커넥션 수
  • 최소 커넥션 수
  • 활성 커넥션 수
  • 대기 커넥션 수

로그 메트릭

  • 로그 레벨에 따른 로그 수

📚 프로메테우스와 그라파나

  • 애플리케이션에서 발생한 메트릭을 그 순간만 확인하는 것이 아니라 과거 이력까지 함께 확인하려면 메트릭을 보관하는 DB가 필요하다.
  • 이렇게 하려면 어디선가 메트릭을 지속해서 수집하고 DB에 저장해야 한다. 프로메테우스가 바로 이런 역할을 담당한다.
  • 프로메테우스가 DB라고 하면, 이 DB에 있는 데이터를 불러 사용자가 보기 편하게 보여주는 대시보드의 역할을 그라파나가 수행한다.
  • 스프링 부트 액츄에이터와 마이크로미터를 사용하면 수많은 메트릭을 자동으로 생성한다. 이 때, 마이크로미터 프로메테우스 구현체는 프로메테우스가 읽을 수 있는 포맷으로 메트릭을 생성한다.
  • 프로메테우스는 이렇게 만들어진 메트릭을 지속해서 수집한다.
  • 프로메테우스는 수집한 메트릭을 내부 DB에 저장한다.
  • 사용자는 그라파나 대시보드 툴을 통해 그래프로 편리하게 메트릭을 조회한다. 이 때, 필요한 데이터는 프로메테우스를 통해서 조회한다.

Prometheus

📚 프로메테우스 활용

  • 프로메테우스가 애플리케이션의 /actuator/prometheus를 호출해서 메트릭을 주기적으로 수집하도록 설정한다.
global:
  scrape_interval: 15s
  evaluation_interval: 15s
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

rule_files:
  scrape_configs:
    - job_name: "prometheus"
      static_configs:
      - targets: ["localhost:9090"]

      - job_name: "spring-actuator"
        metrics_path: '/actuator/prometheus'
        scrape_interval: 1s
        static_configs:
          - targets: ['localhost:8080']

프로메테우스 연동 결과

global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s
alerting:
  alertmanagers:
  - follow_redirects: true
    enable_http2: true
    scheme: http
    timeout: 10s
    api_version: v2
    static_configs:
    - targets: []
scrape_configs:
- job_name: prometheus
  honor_timestamps: true
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - localhost:9090
- job_name: spring-actuator
  honor_timestamps: true
  scrape_interval: 1s
  scrape_timeout: 1s
  metrics_path: /actuator/prometheus
  scheme: http
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - localhost:8080
  • prometheus : 프로메테우스 자체가 제공하는 메트릭 정보이다.
  • spring-actuator : 연동한 애플리케이션의 메트릭 정보이다.
  • State가 UP으로 되어 있다면 정상이고 DOWN으로 되어 있다면 연동이 안 된 것이다.

프로메테우스 기본 기능

  1. [필터]
  • 레이블을 기준으로 필터를 사용할 수 있다. 필터는 중괄호({}) 문법을 사용한다.
    • = : 제공된 문자열과 정확히 동일한 레이블 선택
    • != : 제공된 문자열과 같지 않은 레이블 선택
    • =~ : 제공된 문자열과 정규식 일치하는 레이블 선택
    • !~ : 제공된 문자열과 정규식 일치하지 않는 레이블 선택
  1. [연산자 쿼리와 함수]
  • (+) : 덧셈
  • (-) : 빼기
  • (*) : 곱셈
  • (/) : 분할
  • (%) : 모듈로
  • (^) : 승수/지수
  • sum : 값의 합계
  • sum by : SQL Group By 기능과 유사
  • count : 메트릭 자체의 수 카운트
  • topk : 상위 N개 개수 메트릭 조회
  • offset : 현재 기준으로 특정 과거 시점의 데이터 반환

게이지와 카운터

  • 게이지(Gauge) : 임의로 오르내릴 수 있는 값(Ex. CPU 사용량, 메모리 사용량, 사용중인 커넥션)
  • 카운터(Counter) : 단순하게 증가하는 단일 누적 값(Ex. HTTP 요청 수, 로그 발생 수)
  • 게이지는 크게 고민하지 않고 그대로 사용하면 된다.
  • 계속 누적해서 증가하는 값의 경우 특정 시간에 얼마나 많은 고객의 요청이 들어왔는지 파악하기 어렵다.
  • 이런 문제를 해결하기 위해 increase(), rate()와 같은 함수를 지원한다.
  • increase() : 지정한 시간 단위별로 증가를 확인할 수 있다. -> increase(http_server_requests_seconds_count{uri="/log"}[1m])
  • rate() : 범위 벡터에서 초당 평균 증가율을 계산한다.
  • irate() : rate()와 유사한데 범위 벡터에서 초당 순간 증가율을 계산한다. 급격하게 증가한 내용을 확인하기 좋다.

📚 그라파나 활용

  • ID를 복사해서 공유 대시보드를 활용하면 일일이 등록하지 않아도 위와 같이 확인할 수 있다.
  • 만들어진 공유 대시보드를 수정하는 것도 가능하다.

📚 메트릭 등록