프로메테우스와 포스트그레스큐엘

PostgreSQL과 Prometheus와의 만남


Prometheus 간단 소개

홈페이지: https://prometheus.io/
하는 일:
  1. 여러 exporter (정보 수집 하는 놈) 들을 지정해서 일정 간격으로 정보를 수집하라고 시키고,
  2. 그 수집한 정보를 자기 데이터베이스(기본값: tsdb)에 저장하고,
  3. 다른 놈(일반적으로 시각화 도구들)이 그 정보를 보고자 하면 제공한다. 
통신방법: HTTP

Prometheus에서 사용하는 각종 exporter들
홈페이지: https://prometheus.io/docs/instrumenting/exporters/
어마어마하다.

모든 exporter들의 실행 방법은 모두 제각각이다.
통상 데이터베이스라면, 해당 데이터베이스 정보와 그 데이터베이스가 실행되는 운영체제 정도가 전부일 것이다.

운영체제 수집기는 node_exporter, PostgreSQL 수집기는 postgres_exporter 가 사람들이 제일 많이 쓰는 것 같다.
필요하다면, 직접 만들어서 쓰는 수고로움을 즐기는 것도 나쁘지는 않을 것 같지만, 여기서는 postgres_exporter 를 소개한다.


postgres_exporter

홈페이지: https://github.com/wrouesnel/postgres_exporter
사용법은 해당 홈페이지에서 소개하고 있다.
프로메테우스 쪽 프로젝트들을 보면 다들 미리 static으로 컴파일 된 아주 큰 실행파일을 제공한다. postgres_exporter도 예외는 아니다.
그냥 그 프로그램이 실행된 운영체제에 맞는 실행 파일을 다운로드 받아서 실행하기만 하면 된다.

데이터베이스 관리자 시각에서 보면, 그냥 하나의 데이터베이스 클라이언트다.
프로메테우스가 되든 다른 무엇인가가 되든, 이 postgres_expoter 에게 정보를 요청하면, (이 놈도 하나의 웹서버이기 때문에, 일반적으로 HTTP URL 호출로 요청한다) 해당 데이터베이스에 접속해 있다가 그 데이터베이스의 각종 정보를 수집해서 요청자에게 HTTP 프로토콜을 이용해서 보낸다.


postgresql 접속 방법 - postgres_exporter 실행방법

접속에 관련 모든 설정은 해당 운영체제 환경 변수 설정으로 한다.
직접 OS 콘솔에서 실행한다. 그에 맞에 설정하고 실행하면 된다.
리눅스라면,
DATA_SOURCE_NAME=postgresql://postgres_exporter:password@localhost:5432/postgres?sslmode=disable
이런식이다.
실행되면, 기본 웹서버 포트인 9187번 포트가 리슨 상태로 웹 서버 하나가 실행된다.
웹 서버니까 curl 같은 거로 확인해서 자료가 보인다면, 정상 진행된 것이다.
curl http://localhost:9187/metrics
프로메테우스가 아니더라도 윗 url을 주기적으로 호출하고, 그 값을 처리해서 시계열 자료에 넣어두고 시각화 해서 보면 된다.
이 글은 PostgreSQL 데이터베이스 성능 자료들을 프로메테우스에 활용하는 방법에 대한 글임으로 이제 프로메테우스로 넘어간다.


prometheus.yml 파일

scrape_configs: 섹션에서 다음처럼 expoter를 하나 더 추가해주고 실행하면 된다.
  - job_name: 'pgexporter'
    static_configs:
    - targets: ['pgexporter:9187']
job_name은 임의의 문자열이고, targets 값은 해당 postgres_exporter 웹서버의 호스트이름(또는 호스트IP)과 그 포트다.
설정하고, 프로메테우스를 실행하면 이번에는 9090 포트로 웹서버가 하나 실행된다.

테스트 URL은
curl http://localhost:9090/targets 
여기서 해당 job으로 등록한 pgexporter가 나오면 된다.


기억해야 할 것들

  • postgres_exporter는 현 시점의 데이터베이스 성능 지표값을 프로메테우스로 보낸다.
  • 프로메테우스는 prometheus.yml 환경설정 파일에서 그 지표값을 어떤 주기로 수집할 것인지를 지정한다.
  • 프로메테우스로 수집된 자료는 따로 지정하지 않으면, prometheus tsdb로 저장된다.

숙제

보다 간편하게 설정하고, 사용하는 docker 환경 이야기는 일부러 뺐다. (이 글을 쓰면서 테스트한 것은 모두 docker 환경이었지만)
이 부분은 실무에서 사용될 때는 컨테이너 통합 환경에서 어떻게 활용될지를 같이 고민해야하기에, 겪어보지 못한 부분이기에 더 자세히 다룰 수 없었다.

프로메테우스 tsdb가 다중 사용자 환경에서 그다지 좋은 성능을 내지 못한다는 이야기가 있다. (경험해 보지 못한 사실) 이 문제를 해결 하려면, tsdb 대신에 보다 시계열 자료를 전문적으로 다루는 데이터베이스를 사용하는 것도 도전해볼 만한 숙제다 .
이왕이면, PostgreSQL 데이터베이스를 쓰겠다면, timescaledb 확장 모듈과, pg_prometheus 확장 모듈을 이용해서, prometheus 기본 데이터베이스를 PostgreSQL로 바꾸는 것도 한 방법일 것이다.

이 글에서는 prometheus 까지만 다뤘다. 실무에서는 prometheus 만으로는 편한 모니터링 도구가 되지 못한다.  즉, 프로메테우스에 저장된 자료를 어떻게 시각화 할 것이냐가 최대 관심사가 될 것이다.  이 부분도 숙제로 남겨둔다.  grafana dashbard가 대세이긴하나, 좀더 깊이 있게 들여다 보면 많은 생각들이 왔다 갔다 해서 그냥 숙제로 남겨둔다.

부록

도커 작업 내역
# db 실행 
docker run -d --name postgres -e POSTGRES_PASSWORD=password postgres
# postgres_exporter 실행
docker run -d --link postgres --name pgexporter \
-e DATA_SOURCE_URI="postgres/postgres?application_name=exporter&sslmode=disable" \
-e DATA_SOURCE_USER=postgres -e DATA_SOURCE_PASS=password \
wrouesnel/postgres_exporter
# prometheus 실행
docker run  -d --link pgexporter --name prometheus prom/prometheus
# prometheus.yml 편집
docker exec -it prometheus vi /etc/prometheus/prometheus.yml
# 위에서 설명한 postgres_exporter 항목 추가
# prometheus 재실행
docker stop prometheus
docker start prometheus
# grafana
docker run -d --link prometheus --name grafana -p 3000:3000 grafana/grafana
# 최종확인, http://그라파나가실행된호스트IP:3000/ 페이지를 웹블로우져로 열고
# 화면왼쪽아래쪽 환경 설정 메뉴 -> Data Sourses 에서 Prometheus를 만들고
# 화면왼쪽위에 + 메뉴 -> Import 에서 grafana.com 에서 가져오기 항목에 9628 입력
# PostgreSQL Database 대쉬보드가 만들어졌으면 열어서 화면 위쪽 가운데 인스턴스 부분을 바꿈
# 끝