📚 마이크로미터
- 마이크로미터는 애플리케이션 메트릭 파사드라고 불리는데, 애플리케이션 메트릭(측정 지표)을 마이크로미터가 정한 표준 방법으로 모아서 제공해준다.
- 마이크로미터가 추상화를 통해서 구현체를 갈아끼울 수 있도록 해두었다.
📚 메트릭(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으로 되어 있다면 연동이 안 된 것이다.
프로메테우스 기본 기능
- [필터]
- 레이블을 기준으로 필터를 사용할 수 있다. 필터는 중괄호(
{}) 문법을 사용한다.
- = : 제공된 문자열과 정확히 동일한 레이블 선택
- != : 제공된 문자열과 같지 않은 레이블 선택
- =~ : 제공된 문자열과 정규식 일치하는 레이블 선택
- !~ : 제공된 문자열과 정규식 일치하지 않는 레이블 선택
- [연산자 쿼리와 함수]
- (+) : 덧셈
- (-) : 빼기
- (*) : 곱셈
- (/) : 분할
- (%) : 모듈로
- (^) : 승수/지수
- 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를 복사해서 공유 대시보드를 활용하면 일일이 등록하지 않아도 위와 같이 확인할 수 있다.
- 만들어진 공유 대시보드를 수정하는 것도 가능하다.
📚 메트릭 등록