WEB BE Repo/Spring
Prometheus
조금씩 차근차근
2025. 2. 20. 21:46
소개
- 메트릭을 보관할 DB
- 꾸준히 마이크로미터에서 메트릭을 받아와 저장함
- 프로메테우스 아키텍처
- pull metrics
- 데이터를 당겨옴
- Prometheus server
- 프로메테우스의 서버, 두뇌
- Node
- 당겨온 데이터를 저장하는 저장소
- PromQL
- 프로메테우스(DB)에 저장된 데이터를 조회하기 위한 쿼리
- 그라파나와 같은 툴이 사용함
- Alertmanager
- 프로메테우스가 제공하는 알림 툴
- pull metrics
- 프로메테우스는 그 자체로도 DB만큼 방대하다
- 책으로 공부해야 할만큼 방대함
- 추가적인 학습이 필요함
- 따로 알아보면서 공부할 것
- 보안 및 개인정보 보호에서 차단 해제해줘야 함
- 기본 포트는 9090
프로메테우스 설정 방법
- 2가지 설정이 필요함
- 애플리케이션 설정
- 프로메테우스가 애플리케이션의 메트릭을 가져갈 수 있도록
- 애플리케이션에서 프로메테우스 포멧에 맞추어 매트릭 만들기
- 프로메테우스는 json 은 이해하지 못함
- 근데 마이크로미터가 있어서 어차피 거기서 가져오면 됨
- 프로메테우스 설정
- 프로메테우스가 우리 애플리케이션의 메트릭을 주기적으로 수집하도록 설정
- 프로메테우스와 metrics 포멧 차이
- jvm.info -> jvm_info
- 프로메테우스는 "." 대신에 "_" 포맷 사용
- logback.events -> logback_events_total
- 로그 수와 같은 카운터 포맷에는 마지막에 관례상 _total 붙임
- http.server.requests
- 게이지 데이터는 3가지로 분류된다
- http_server_requests_seconds_count
- 요청 수
- http_server_requests_seconds_sum
- 시간 합
- 요청 수의 시간을 합함
- http_server_requests_seconds_max
- 최대 시간
- 가장 오래걸린 요청 수
- jvm.info -> jvm_info
프로메테우스 애플리케이션 설정
- implementation 'io.micrometer:micrometer-registry-prometheus'
- 끝
프로메테우스 프로메테우스 설정
- prometheus.yml 파일 수정
- job_name
- 수집하는 이름
- 임의의 이름 사용하면 됨
- metrics_path
- 수집할 경로 지정
- scrape_interval
- 수집할 주기 설정
- 수집 주기가 너무 짧으면, 애플리케이션의 성능에 영향을 줄 수 있음
- 10s ~ 1m 추천
- static_configs.target
- 수집할 서버의 ip, 포트
- scheme: https
- 요청 보낼 시 https 로 받도록 변경 가능
- job_name
- 수정 반영사항 확인 방법
- localhost:9090/config 확인
- yml 입력 잘 되었는지 확인
- localhost:9090/targets 확인
- 연동이 잘 되었는지 확인
- localhost:9090/config 확인
기본 기능
- 프로메테우스 포맷대로 검색하면 결과 나옴
- ex) http_server_requests_seconds_count
- 예제
- 태그, 레이블
- 마이크로미터에선 TAG라고 부르던 것
- 프로메테우스에선 Label 이라고 부름
- 우측 숫자
- 해당 메트릭의 값
- 태그, 레이블
- Table
- 표 형태
- Evaluation time 을 수정해서 과거 시간 조회 가능
- Graph
- 메트릭을 그래프로 조회 가능
- 필터
- 레이블을 기준으로 필터 사용 가능
- 중괄호 {} 문법 사용
- 레이블 일치 연산자
- =
- 제공된 문자열과 정확히 동일한 레이블 선택
- !=
- 제공된 문자열과 같지 않은 레이블 선택
- =~
- 제공된 문자열과 정규식 일치하는 레이블 선택
- !~
- 제공된 문자열과 정규식 일치하지 않는 레이블 선택
- =
- 예제
- uri=/log, method=GET 조건으로 필터
- http_server_requests_seconds_count{uri="/log", method="GET"}
- /actuator/prometheus 는 제외한 조건으로 필터
- http_server_request_seconds_count{uri!="/actuator/prometheus"}
- method가 GET, POST 인 경우를 포함해서 필터
- http_server_requests_seconds_count{method=~"GET|POST"}
- /actuator 로 시작하는 uri는 제외한 조건으로 필터
- http_server_requests_seconds_count{uri!~"/actuator.*"}
- uri=/log, method=GET 조건으로 필터
- 레이블 일치 연산자
- 연산자 쿼리 & 함수
- 연산자
- +
- /
- %
- 함수
- sum(a)
- 모든 값의 합
- sum by(a, b)
- sql의 group by와 유사함
- count(a)
- 메트릭 자체의 수 카운트
- topk(a, b)
- b의 상위 a개 메트릭 조회
- a offset 10m
- 현재를 기준으로 특정 과거 시점의 데이터 반환
- 범위 벡터 변환기
- http_server_requests_seconds_count[1m]
- 지난 [] 간의 모든 기록값을 선택
- 약간의 가공이 필요.... 뭔지는 나중에 알게된다...?
- sum(a)
- 연산자
게이지
- 임의로 오르내릴 수 있는 값
- 예
- CPU 사용량
- 메모리 사용량
- 사용중인 커넥션
카운터
- 단순하게 증가하는 단일 누적 값
- 예
- HTTP 요청 수
- 로그 발생 수
카운터를 위한 함수
- 카운터는 카운터로써는 인사이트를 얻기가 힘들다.
- 좀 더 다른 형태로 봐야 한다!
- 그래서 3종류의 함수를 지원한다.
- increase(범위 벡터)
- 지정한 시간 단위(범위벡터)별로 증가 수
- increase(http_server_requests_seconds_count{uri="/log"}[1m])
- rate()
- 범위 벡터에서 초당 평균 증가율
- increase() 에서 초당 평균을 나누어 계산
- 초당 얼마나 증가하는지 나타내는 지표
- irate()
- 범위 벡터에서 초당 "순간" 증가율
- 급격하게 증가한 내용을 확인하기 좋음
- 범위 벡터에서 초당 "순간" 증가율
- 카운터는 되도록이면 increase(), rate() 함수로 보자