WEB BE Repo/Spring

Prometheus

조금씩 차근차근 2025. 2. 20. 21:46

소개

  • 메트릭을 보관할 DB
    • 꾸준히 마이크로미터에서 메트릭을 받아와 저장함

프로메테우스 아키텍처

  • 프로메테우스 아키텍처 
    • pull metrics
      • 데이터를 당겨옴
    • Prometheus server
      • 프로메테우스의 서버, 두뇌
    • Node
      • 당겨온 데이터를 저장하는 저장소
    • PromQL
      • 프로메테우스(DB)에 저장된 데이터를 조회하기 위한 쿼리
      • 그라파나와 같은 툴이 사용함
    • Alertmanager
      • 프로메테우스가 제공하는 알림 툴
  • 프로메테우스는 그 자체로도 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
        • 최대 시간
        • 가장 오래걸린 요청 수

프로메테우스 애플리케이션 설정

  • implementation 'io.micrometer:micrometer-registry-prometheus'

프로메테우스 프로메테우스 설정

  • prometheus.yml 파일 수정
    • job_name
      • 수집하는 이름
      • 임의의 이름 사용하면 됨
    • metrics_path
      • 수집할 경로 지정
    • scrape_interval
      • 수집할 주기 설정
      • 수집 주기가 너무 짧으면, 애플리케이션의 성능에 영향을 줄 수 있음
        • 10s ~ 1m 추천
    • static_configs.target
      • 수집할 서버의 ip, 포트
    • scheme: https
      • 요청 보낼 시 https 로 받도록 변경 가능
  • 수정 반영사항 확인 방법
    • localhost:9090/config 확인
      • yml 입력 잘 되었는지 확인
    • localhost:9090/targets 확인
      • 연동이 잘 되었는지 확인

기본 기능

  • 프로메테우스 포맷대로 검색하면 결과 나옴
  • 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.*"}
  • 연산자 쿼리 & 함수
    • 연산자
      • +
      •  
      •  
      • /
      • %
    • 함수
      • 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]
        • 지난 [] 간의 모든 기록값을 선택
        • 약간의 가공이 필요.... 뭔지는 나중에 알게된다...?

게이지

  • 임의로 오르내릴 수 있는 값
    • CPU 사용량
    • 메모리 사용량
    • 사용중인 커넥션

카운터

  • 단순하게 증가하는 단일 누적 값
    • HTTP 요청 수
    • 로그 발생 수

 

카운터를 위한 함수

  • 카운터는 카운터로써는 인사이트를 얻기가 힘들다.
  • 좀 더 다른 형태로 봐야 한다!
  • 그래서 3종류의 함수를 지원한다.

  • increase(범위 벡터)
    • 지정한 시간 단위(범위벡터)별로 증가 수
    • increase(http_server_requests_seconds_count{uri="/log"}[1m])

  • rate()
    • 범위 벡터에서 초당 평균 증가율
    • increase() 에서 초당 평균을 나누어 계산
      • 초당 얼마나 증가하는지 나타내는 지표

  • irate()
    • 범위 벡터에서 초당 "순간" 증가율
      • 급격하게 증가한 내용을 확인하기 좋음
  • 카운터는 되도록이면 increase(), rate() 함수로 보자