[모니터링] 프로메테우스 적용

Coastby·2023년 3월 22일
1

성능테스트

목록 보기
1/4

프로메테우스 적용

Prometheus

Prometheus는 SoundCloud 사에서 만든 오픈소스 시스템 모니터링 및 경고 툴이다.

많은 회사에서 사용 중이며 활발한 커뮤니티가 있다. 현재는 독립 오픈 소스 프로젝트이며 어떤 회사와도 독립적이다.

Prometheus는 측정 항목을 time series data로 수집하고 저장한다. 즉, 측정 항목 정보는 레이블이라는 선택적 키-값 쌍과 함께 기록된 타임스탬프와 함께 저장된다.

Prometheus는 시간에 따라 기록하는데 적합하다. 기계 중심 모니터링과 고도로 동적인 서비스 지향 아키텍쳐 모니터링에 모두 적합하다. 마이크로 서비스에서 다차원 데이터 수집 및 쿼리 지원은 특별한 강점이다.

또한 Prometheus는 중단 중에 신속하게 문제를 진단할 수 있도록 하는 시스템으로 안정성을 위해 설계되었다. 각 Prometheus는 독립형이며 네트워크 스토리지 또는 기타 원격 서비스에 의존하지 않느다. 인프라의 다른 부분이 손상되었을 때 이를 사용할 수 있으며 이를 사용하기 위해 광범위한 인프라를 설정할 필요가 없다.

특징

  • 메트릭 이름과 키/값 쌍으로 식별되는 시계열 데이터가 있는 다차원 데이터 모델
  • PromQL, 이 차원성을 활용하는 유연한 쿼리 언어
  • 분산 스토리지에 의존하지 않음; 단일 서버 노드는 자율적입니다.
  • 시계열 수집은 HTTP를 통한 풀 모델을 통해 발생합니다.
  • 푸시 시계열은 중간 게이트웨이를 통해 지원됩니다.
  • 대상은 서비스 검색 또는 정적 구성을 통해 검색됩니다.
  • 다양한 그래프 및 대시보드 지원 모드

Metric 이란?

일반적인 말로는 numeric measurement이다. time series의 의미는 시간 경과에 따라 기록됨을 의미한다. 사용자가 측정하고자 하는 것은 애플리케이션마다 다를 수 있다. 웹 서버의 경우 요청 시간일 수 있고 데이터베이스의 경우 활성 연결 수 또는 활성 쿼리 수 등일 수 있다.

구성요소

  • Prometheus 서버 : time series data를 스크랩하고 저장
  • Client Library : 어플리케이션 코드 계측
  • Pushgateway : 단기 작업 (short-lived jobs) 지원
  • Exporters : HAProxy, StatsD, Graphite 등과 같은 서비스 목적
  • Alertmanager : 경고 처리
  • Support tools

Prometheus는 단기 작업을 위해 직접 또는 중간 푸시 게이트웨이를 통해 구성된 작업에서 측정항목을 스크랩한다. 스크랩한 모든 샘플을 로컬에 저장하고 이 데이터에 대한 규칙을 실행하여 기존 데이터에서 새 time series를 집계 및 기록하거나 경고를 생성한다. Grafana 또는 기타 API 소비자를 사용하여 수집된 데이터를 시각화할 수 있다.

  • Jobs/exporters :
    실제로 metric을 수집하는 프로세스이다.
    이 exporter가 metric을 수집하고 HTTP 통신을 통해 metric 데이터를 가져갈 수 있게 /actuator/metrics라는 HTTP endpoint를 제공한다.
  • Prometheus server :
    이 exporter의 엔드포인트로 HTTP GET 요청을 보내 metric 정보를 수집한다.
  • 수집한 정보를 Prometheus가 제공하는 간단한 웹 뷰를 통해 조회할 수 있고 그 안에서 테이블 및 그래프 형태로 볼 수 있다.
  • 대부분 Grafana라는 Data Visualization Tool을 이용하여 시각화하고 있다.

Prometheus 적용하기

현재 프로젝트는 ec2에 docker로 띄워져있는 상태이며, 도메인 주소로 들어갈 수 있다.

그리고 Prometheus는 같은 ec2에 다른 docker로 띄울 것이다.

프로젝트 설정

  1. 기존의 프로젝트에 build.gradle에 의존성을 추가한다.

    dependencies {
        ...
    
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        implementation 'io.micrometer:micrometer-core'
        implementation 'io.micrometer:micrometer-registry-prometheus'
    
        ...
    }
  2. application.yml에 다음과 같이 설정한다.

    spring:
      application:
        name: monitoring
    
    management:
      endpoint:
        metrics:
          enabled: true  # endpoint를 활성화한다.
        prometheus:
          enabled: true
    
      endpoints:  # Actuator가 제공하는 endpoint를 열어준다.
        web:
          exposure:
            include: health, info, metrics, prometheus
    
      metrics:
        tags:
          application: ${spring.application.name}
  3. 설정 적용을하고 http://{project 주소}/actuator로 요청하면 아래와 같은 JSON을 볼 수 있다.

    이를 통해 yaml에서 열어준 endpoint들이 활성화된 것을 알 수 있다.

    • /actuator : actuator가 제공하는 url을 볼 수 있다.
    • /actuator/metrics : 메트릭 목록을 보여준다.
    • /actuator/prometheus : micrometer를 통해 수집된 metric들을 볼 수 있다.
    {
      "_links": {
        "self": {
          "href": "http://daengnyang.store/actuator",
          "templated": false
        },
        "prometheus": {
          "href": "http://daengnyang.store/actuator/prometheus",
          "templated": false
        },
        "health-path": {
          "href": "http://daengnyang.store/actuator/health/{*path}",
          "templated": true
        },
        "health": {
          "href": "http://daengnyang.store/actuator/health",
          "templated": false
        },
        "info": {
          "href": "http://daengnyang.store/actuator/info",
          "templated": false
        },
        "metrics-requiredMetricName": {
          "href": "http://daengnyang.store/actuator/metrics/{requiredMetricName}",
          "templated": true
        },
        "metrics": {
          "href": "http://daengnyang.store/actuator/metrics",
          "templated": false
        }
      }
    }

Prometheus 설치

프로메테우스를 설치하는데 다양한 방법이 있으며, 우리는 간단히 docker를 이용하여 실행시켰다.

📌 주의 사항 : 프로메테우스 이미지는 볼륨을 사용하여 실제 메트릭을 저장한다. 프로덕션 배포의 경우 볼륨 마운트를 사용하여 데이터를 쉽게 관리하는 것이 좋다.

  1. prometheus.yml 파일을 작성한다.

    프로메테우스 서버는 이 yml 파일을 통해 기본적인 설정을 하고 어떤 exporter로부터 메트릭 정보를 수집할 것인지 확인한다.

    scrape_configs : exporter를 지정한다.

    job_name으로 이름은 지정하고, exporter의 경로를 targets, metrics_path, scheme으로 설정한다.

    default yml 파일에서 job만 추가하였다.

    # 기본적인 전역 설정 
    global:
      scrape_interval:     15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
      evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
      # 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.
    
    # Alertmanager 설정
    alerting:
      alertmanagers:
      - static_configs:
        - targets:
          # - alertmanager:9093
    
    # 규칙을 처음 한번 로딩하고 'evaluation_interval'설정에 따라 정기적으로 규칙을 평가한다.
    rule_files:
      # - "first_rules.yml"
      # - "second_rules.yml"
    
    # 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
    scrape_configs:
      # 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
    	- job_name: "prometheusaaaaaa"
    		# 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
        # 'scheme'라는 설정의 기본 값은 'http'이다.
        static_configs:
          - targets: ["localhost:9090"]
    
      - job_name: 'daengnyang' # 잡 이름
        metrics_path: '/actuator/prometheus' # 메트릭을 수집할 path 설정
        static_configs:
          - targets: ['{project_IP_주소}:{port_번호}']
  2. 프로메테우스를 도커로 배포한다.

    위에서 작성한 prometheus.yml 파일과 컨테이너 내부의 prometheus.yml 파일을 bind-mount를 이용하여 동기화시켰다. 본인이 작성한 경로에 유의해서 작성한다.

    docker run \
    		-d \
        	-p 9090:9090 \
       		-v /home/ubuntu/prometheus.yml:/etc/prometheus/prometheus.yml \
    		--name prometheus \
        	prom/prometheus

    📌 Prometheus 컨테이너가 종료되면 수집하던 metric 데이터는 날라간다. 따라서 이를 보존하기 위해 volume-mount를 이용하여 ec2에 저장하는 것을 추천한다.

  3. 브라우저를 통해 Prometheus 대시보드로 접속해본다.

    http://<Prometheus를 띄운 서버의 public ip>:9090

    Status 탭 - Target 으로 들어가면 아래와 같은 화면이 보인다.

  4. 기본적으로 들어있는 쿼리를 Execute 해보기

    Graph 탭 - 검색창에 원하는 항목 검색 - Execute

참고 :

https://prometheus.io/
https://devbksheen.tistory.com/180
https://covenant.tistory.com/244

profile
훈이야 화이팅

0개의 댓글