Prometheus

2 분 소요

Prometheus

프로메테우스는 오픈소스 기반의 모니터링 시스템이다.

ELK와 같은 로깅이 아니라, 대상 시스템으로부터 각종 모니터링 지표를 수집하여 저장하고 검색할 수 있는 시스템이다.

구조가 간단해서 운영이 쉽고, 강력한 쿼리 기능을 가지고 있으며, 그라파나(Grafana)를 통한 시각화를 지원한다. 무엇보다 넓은 오픈소스 생태계를 기반으로 해서, 많은 시스템을 모니터링할 수 있는 다양한 플러그인을 가지고 있는 것이 가장 큰 장점이다.

특히 이런 간편함 때문에 쿠버네티스의 메인 모니터링 시스템으로 많이 사용되면서 요즘 특히 더 주목을 받고 있다.

기본 구조

메트릭 수집

수집을 하려는 대상 시스템이 Target system이다. MySQL이나, Tomcat 또는 VM과 같이 여러가지 자원이 모니터링 대상이 될 수 있다. 이 대상 시스템에서 메트릭을 프로메테우스로 전송하기 위해서는 Exporter라는 것을 사용한다.

pulling 방식

프로메테우스가 Target system에서 메트릭을 수집하는 방식은 풀링 방식을 사용한다. 프로메테우스가 주기적으로 Exporter로부터 메트릭을 읽어와서 수집하는 방식이다. 보통 모니터링 시스템의 에이전트들은 에이전트가 모니터링 시스템으로 메트릭을 보내는 푸시 방식을 사용한다. 특히 푸시 방식은 서비스가 auto-scale 등으로 가변적일 경우에 유리하다. 풀링 방식의 경우 모니터링 대상이 가변적으로 변경될 경우, 모니터링 대상의 IP주소들을 알 수 없기 때문에 어려운 점이 있다.

이러한 문제를 해결하기 위한 방안이 서비스 디스커버리라는 방식인데, 특정 시스템이 현재 기동중인 서비스들의 목록과 IP주소를 가지고 있으면 된다. 예를 들어 앞에서 VM들을 내부 DNS에 등록해놓고 새로운 VM이 생성될때에도 DNS에 등록을 하도록 하면, DNS에서 현재 기동중인 VM목록을 얻어와서 그 목록의 IP들로 풀링을 하면 되는 구조이다.

Service Discovery

프로메테우스도 서비스 디스커버리 시스템과 통합을 하도록 되어있다. 앞에서 언급한 DNS나 서비스 디스커버리 전용 솔루션인 Hashicorp사의 Consul 또는 쿠버네티스를 통해서 모니터링해야할 타켓 서비스의 목록을 가지고 올 수 있다.

Exporter

Exporter는 모니터링 에이전트로 타겟 시스템에서 메트릭을 읽어서, 프로메테우스가 풀링을 할 수 있도록 한다. 또한, 단순이 HTTP GET으로 메트릭을 텍스트 형태로 프로메테우스에 리턴한다. 요청 당시의 데이터를 리턴하는 것일 뿐, Exporter 자체는 기존값(히스토리)을 저장하는 등의 기능은 없다.

Retrieval

서비스 디스커버리 시스템으로부터 모니터링 대상 목록을 받아오고, Exporter로부터 주기적으로 그 대상으로부터 메트릭을 수집하는 모듈이 프로메테우스 내의 Retrieval 이라는 컴포넌트이다.

저장

이렇게 수집된 정보는 프로메테우스 내의 메모리로컬 디스크에 저장된다. 뒷단에 별도의 데이터 베이스를 사용하지 않고 그냥 로컬 디스크에 저장하는데, 그로 인해서 설치가 매우 쉽다는 장점이 있지만 반대로 스케일링이 불가능하다는 단점을 가지고 있다. 대상 시스템이 늘어날수록 메트릭 저장 공간이 많이 필요한데, 단순히 디스크를 늘리는 방법 밖에 없다.

프로메테우스는 구조상 HA(High Avilability)를 위한 이중화나 클러스터링이 불가능하다. (클러스터링 대신 샤딩을 사용한다. HA는 복제가 아니라 프로메테우스를 두 개 띄워서 같은 타겟을 동시에 같이 저장하는 방법을 사용한다. 이 문제를 해결하기 위해서는 Thanos라는 오픈소스를 사용하면 된다고 한다.)

서빙

이렇게 저장된 메트릭은 PromQL 쿼리 언어를 이용해서 조회가 가능하고, 이를 외부 API나 프로메테우스 웹콘솔을 이용해서 서빙이 가능하다. 또한 Grafana 등과 통합하여 대시보드를 구성하는 것이 가능하다.

이 외에도 메트릭을 수집하기 위한 gateway, 알람을 위한 Alert manager 등의 컴포넌트 등이 존재한다.

참고자료

이 게시글은 조대협님의 블로그를 참고했으며 학습용으로 작성 됨.