ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 핵심 기능 5 - 모니터링 & 관리 (Prometheus)
    BackEnd/Spring Boot 2023. 5. 16. 23:00
    반응형

    전체 구조

    • 스프링 부트 액츄에이터와 마이크로미터를 사용하면 수 많은 메트릭을 자동으로 생성합니다. 마이크로미터 프로메테우스 구현체는 프로메테우스가 읽을 수 있는 포멧으로 메트릭을 생성합니다.
    • 프로메테우스는 이렇게 만들어진 메트릭을 지속해서 수집합니다.
    • 프로메테우스는 수집한 메트릭을 내부 DB에 저장합니다.
    • 사용자는 그라파나 대시보드 툴을 통해 그래프로 편리하게 메트릭을 조회합니다. 이때 필요한 데이터는 프로메테우스를 통해서 조회합니다.

     

    프로메테우스(Prometheus)

      애플리케이션에서 발생한 메트릭을 그 순간만 확인하는 것이 아니라 과거 이력까지 함께 확인하려면 메트릭을 보관하는 데이터베이스가 필요합니다. 이렇게 하려면 어디선가 메트릭을 지속해서 수집하고 데이터베이스에 저장해야 합니다. 프로메테우스가 바로 이런 역할을 담당합니다.

     

    프로메테우스 설치

    https://prometheus.io/download/

     

      Mac은 처음 실행하면 개발자를 확인할 수 없기 때문에 'prometheus'을(를) 열 수 없습니다. 알럿이 뜹니다. 시스템 환경설정 → 보안 및 개인 정보 보호 → 일반 탭 아래 확인된 개발자가 ... prometheus 사용을 차단했습니다. 문구 우측에 있는 [확인 없이 허용] 버튼을 눌러 승인합니다.

     

    프로메테우스 실행

    • http://localhost:9090

     

    애플리케이션 설정

      프로메테우스가 애플리케이션의 메트릭을 가져갈 수 있도록 애플리케이션에서 프로메테우스 포멧에 맞추어 메트릭을 만듭니다. 마이크로미터 프로메테우스 구현 라이브러리를 추가하면 스프링 부트와 액츄에이터가 자동으로 마이크로미터 프로메테우스 구현체를 등록해서 동작하도록 설정해줍니다. 액츄에이터에 프로메테우스 메트릭 수집 엔드포인트가 자동으로 추가됩니다.

     

    build.gradle

    implementation 'io.micrometer:micrometer-registry-prometheus' //추가

     

    실행

    • http://localhost:8080/actuator/prometheus

     

    포멧 차이

    • 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: 최대 시간(가장 오래 걸린 요청 수)  

     

    프로메테우스 수집 설정

      프로메테우스가 애플리케이션의 /actuator/prometheus를 호출해서 메트릭을 주기적으로 수집하도록 설정합니다. 프로메테우스 폴더에 있는 prometheus.yml 파일을 다음과 같이 수정합니다.

     

    prometheus.yml

    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:                      # 수집하는 서버의 IP, PORT를 지정합니다.
          - targets: ['localhost:8080']

    (주의) scrape_interval: 예제에서는 1s로 했지만, 수집 주기의 기본 값은 1m 입니다. 수집 주기가 너무 짧으면 애플리케이션 성능에 영향을 줄 수 있으므로 운영에서는 10s ~ 1m 정도를 권장합니다.

     

    프로메테우스 연동 확인

      설정이 끝났으면 프로메테우스 서버를 종료하고 다시 실행합니다.

     

      프로메테우스 메뉴 → Status → Configuration에 들어가서 prometheus.yml에 입력한 부분이 추가되어 있는지 확인합니다.

    • http://localhost:9090/config

     

      프로메테우스 메뉴 → Status → Targets에 들어가서 연동이 잘 되었는지 확인합니다.

    • http://localhost:9090/targets

     

      검색창에 http_server_requests_seconds_count를 입력하고 실행합니다.

    

    • 태그, 레이블: error, exception, instance, job, method, outcome, status, uri는 각각의 메트릭 정보를 구분해서 사용하기 위한 태그입니다. 마이크로미터에서는 이것을 태그(Tag)라 하고, 프로메테우스에서는 레이블(Label)이라고 합니다.
    • 숫자: 결과 행의 마지막에 보면 132, 4와 같은 숫자가 해당 메트릭의 값입니다.
    • Table Tab: Evaluation time을 수정해서 과거 시간 조회 가능합니다.
    • Graph Tab: 메트릭을 그래프로 조회 가능합니다.

     

    필터

      레이블을 기준으로 필터를 사용할 수 있습니다. 필터는 중괄호 {} 문법을 사용합니다.

     

    레이블 일치 연산자

    • = 제공된 문자열과 정확히 동일한 레이블 선택
    • != 제공된 문자열과 같지 않은 레이블 선택
    • =~ 제공된 문자열과 정규식 일치하는 레이블 선택
    • !~ 제공된 문자열과 정규식 일치하지 않는 레이블 선택

     

    예)

    • uri=/log , method=GET 조건으로 필터: http_server_requests_seconds_count{uri="/log", method="GET"}
    • /actuator/prometheus 는 제외한 조건으로 필터: http_server_requests_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 합계
    예) sum(http_server_requests_seconds_count)
    sum by group by 합계
    예) sum by(method, status)(http_server_requests_seconds_count)
    count 메트릭 자체의 수 카운트
    예) count(http_server_requests_seconds_count)
    topk 상위 N개 메트릭 조회
    예) topk(N, http_server_requests_seconds_count)
    오프셋 수정자 http_server_requests_seconds_count offset 10m
    범위 벡터 선택기 http_server_requests_seconds_count[1m]
    [1m], [60s] 같이 표현합니다. 지난 1분간의 모든 기록값을 선택합니다.

     

    게이지(Gauge)

      게이지는 오르고 내리고 하는 값입니다. 게이지는 현재 상태를 그대로 출력하면 됩니다. 예) CPU 사용량, 메모리 사용량, 사용중인 커넥션

     

    카운터(Counter)

      카운터는 단순하게 증가하는 단일 누적 값입니다. 예) HTTP 요청 수, 로그 발생 수

     

      HTTP 요청 메트릭을 그래프로 표현하면 다음과 같습니다.

      이렇게 증가만 하는 그래프에서 특정 시간에 얼마나 많은 고객의 요청이 있었는지 판단하기 위해서는 increase(), rate() 같은 함수를 사용합니다.

     

    increase()

      마지막에 [시간]을 사용해서 범위 벡터를 선택해야 합니다. 예) increase(http_server_requests_seconds_count{uri="/log"}[1m]

     

    rate()

      범위 벡터에서 초당 평균 증가율을 계산합니다. increase()가 숫자를 직접 카운트 한다면, rate()는 여기에 초당 평균을 나누어서 계산합니다.

     

    irate()

      rate와 유사한데, 범위 벡터에서 초당 순간 증가율을 계산합니다. 급격하게 증가한 내용을 확인하기 좋습니다.

     

      더 자세한 내용은 다음 프로메테우스 공식 메뉴얼을 참고하시면 됩니다.

     

    [참고정보]

    스프링 부트 - 핵심 원리와 활용

    반응형

    댓글

Designed by Tistory.