프로메테우스 시작하기

프로메테우스 시작하기 (Getting started with Prometheus)

프로메테우스를 처음 접하는 사람을 위한 입문 튜토리얼이에요. "프로메테우스가 뭐지?"부터 시작해서 메트릭이 왜 중요한지, 프로메테우스의 기본 구조는 어떤지, 그리고 직접 설치해서 자기 자신의 메트릭을 스크레이프해보는 것까지 한 번에 따라 할 수 있게 구성돼 있어요. 개념과 실습이 함께 있어서 첫발을 떼기 가장 좋은 문서랍니다.

이 튜토리얼을 끝내면 프로메테우스 서버를 실행하고, 설정 파일을 만들고, 프로메테우스 자신과 node exporter의 메트릭을 15초마다 스크레이프하는 기본기를 갖추게 돼요. 옆에 앉아서 같이 따라 해 보는 기분으로 진행할게요.

출처: 문서

본문

프로메테우스란 무엇인가요?

프로메테우스는 시스템 모니터링 및 경고(alarming) 시스템이에요. SoundCloud가 2012년에 오픈소스로 공개했고, Kubernetes 다음으로 Cloud Native Computing Foundation에 가입하고 졸업한 두 번째 프로젝트예요. 프로메테우스는 모든 메트릭 데이터를 시계열(time series)로 저장해요. 즉 메트릭 정보가 기록된 타임스탬프와 함께 저장되고, 레이블(label)이라고 하는 선택적 키-값 쌍도 메트릭과 함께 저장될 수 있어요.

메트릭이란 무엇이고 왜 중요한가요?

메트릭은 전문용어 없이 말하면 측정의 기준이에요. 무엇을 측정할지는 애플리케이션마다 달라요. 웹 서버라면 요청 시간이 될 수 있고, 데이터베이스라면 CPU 사용량이나 활성 연결 수 등이 될 수 있어요.

메트릭은 애플리케이션이 왜 특정 방식으로 동작하는지 이해하는 데 중요한 역할을 해요. 웹 애플리케이션을 운영하는데 누군가가 애플리케이션이 느리다고 말한다면, 애플리케이션에 무슨 일이 일어나고 있는지 알아내려면 정보가 필요해요. 예를 들어 요청 수가 많을 때 애플리케이션이 느려질 수 있어요. 요청 수 메트릭이 있으면 그 이유를 짚어내고, 과부하를 처리하도록 서버 수를 늘릴 수 있어요. 애플리케이션의 메트릭을 정의할 때마다 "탐정 모자를 쓰고" 이런 질문을 해야 해요: 애플리케이션에서 문제가 발생하면 디버그하는 데 어떤 정보가 중요할까?

프로메테우스의 기본 구조

프로메테우스 설정의 기본 구성 요소는:

  • 프로메테우스 서버 (메트릭 데이터를 스크레이프하고 저장하는 서버)
  • 스크레이프될 타깃(target), 예를 들어 메트릭을 노출하는 계측된 애플리케이션이나 다른 애플리케이션의 메트릭을 노출하는 exporter
  • 미리 설정된 규칙에 따라 알림을 발생시키는 Alertmanager

(참고: 이 외에도 프로메테우스는 push_gateway를 갖고 있지만 여기서는 다루지 않아요.)

웹 서버를 예제 애플리케이션으로 생각해보고, 웹 서버가 처리한 API 호출 수 같은 특정 메트릭을 추출하고 싶다고 해봐요. 그래서 프로메테우스 클라이언트 라이브러리로 특정 계측 코드를 추가하고 메트릭 정보를 노출해요. 이제 웹 서버가 메트릭을 노출하므로 프로메테우스가 그것을 스크레이프하도록 구성할 수 있어요. 이제 프로메테우스는 xyz IP 주소의 7500 포트에서 수신하고 있는 웹 서버에서 특정 시간 간격(예: 1분마다)으로 메트릭을 가져오도록 구성돼요.

11:00:00에 서버를 공개한다면 애플리케이션은 요청 수를 계산해 노출하고, 프로메테우스는 동시에 count 메트릭을 스크레이프해 값을 0으로 저장해요.

11:01:00까지 요청 하나가 처리돼요. 서버의 계측 로직은 count를 1로 증가시켜요. 프로메테우스가 메트릭을 스크레이프할 때 이제 count 값은 1이에요.

11:02:00까지 두 개의 요청이 더 처리되어 요청 수는 1+2=3이 돼요. 이처럼 메트릭이 스크레이프·저장돼요.

사용자는 프로메테우스가 메트릭을 스크레이프하는 빈도를 제어할 수 있어요.

타임스탬프 요청 수 (메트릭)
11:00:00 0
11:01:00 1
11:02:00 3

(참고: 이 표는 이해를 돕기 위한 표현일 뿐이에요. 프로메테우스는 이 정확한 형식으로 값을 저장하지 않아요.)

프로메테우스는 스크레이프로 저장된 메트릭을 쿼리할 수 있는 API도 있어요. 이 API는 메트릭을 쿼리하고, 대시보드/차트를 만드는 등에 사용돼요. PromQL이 이 메트릭들을 쿼리하는 데 사용돼요.

요청 수 메트릭으로 만든 간단한 선 그래프는 이런 모습이에요.

여러 유용한 메트릭을 스크레이프해 애플리케이션에서 무슨 일이 일어나고 있는지 이해하고, 그 위에 여러 차트를 만들 수 있어요. 차트를 대시보드로 그룹화하고 애플리케이션의 개요를 얻는 데 사용하세요.

직접 해보기

손을 더럽히고 프로메테우스를 설정해 봐요. 프로메테우스는 Go로 작성됐고, 필요한 것은 운영체제용으로 컴파일된 바이너리뿐이에요. 운영체제에 해당하는 바이너리를 여기에서 다운로드하고 바이너리를 PATH에 추가하세요.

프로메테우스는 자신의 메트릭을 노출하며, 이는 자신이나 다른 프로메테우스 서버가 소비할 수 있어요.

이제 프로메테우스를 설치했으니 다음 단계는 실행하는 것이에요. 필요한 것은 바이너리와 구성 파일뿐이에요. 프로메테우스는 구성에 yaml 파일을 사용해요.

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

위 구성 파일에서 scrape_interval을 언급했어요. 즉 프로메테우스가 메트릭을 스크레이프할 빈도예요. 메트릭을 스크레이프할 이름과 타깃이 있는 scrape_configs를 추가했어요. 프로메테우스는 기본적으로 9090 포트에서 수신합니다. 그래서 targets에 추가해요.

prometheus --config.file=prometheus.yml

이제 프로메테우스가 실행되고 15초마다 자기 자신의 메트릭을 스크레이프해요. 프로메테우스에는 메트릭을 내보내는 표준 exporter가 있어요. 다음으로 머신 메트릭용 exporter인 node exporter를 실행하고 프로메테우스로 같은 것을 스크레이프할 거예요. (node metrics exporter 다운로드.)

터미널에서 node exporter를 실행하세요.

./node_exporter

다음으로 scrape_configs 목록에 node exporter를 추가하세요:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: node_exporter
    static_configs:
      - targets: ["localhost:9100"]

이 튜토리얼에서는 메트릭이 무엇이고 왜 중요한지, 프로메테우스의 기본 구조와 프로메테우스를 실행하는 방법을 살펴봤어요.

더 알아보기 (Learn more)