Prometheus

강민욱·2023년 9월 4일
0

monitoring

목록 보기
1/1

1. 목표

모니터링을 위한 개발이 필요해서 리서치를 하던 중 prometheus라는 오픈소스를 알게되어 그것을 기반으로 개발을 하기로 했다.

prometheus의 architect이다.

대략적으로 설명하자면 jobs exporter들을 promethus에 등록하여 모니터링 항목(metric이라 부름)을 수집하고 해당 데이터들을 Stroage에 저장하는데 모니터링은 시간의 흐름이 중요하므로 시간에 따라 저장이 되는 Time series DB(시계열 DB)를 사용한다. 관계형DB(RDB)의 한계를 극복하기 위해 등장하였다. 그리고 해당 DB를 PromQL이라는 쿼리를 사용하여 내가 원하는 모니터링 항목을 추출한다. exporter와 prometheus간에는 http 통신을 이용하여 데이터를 전달받는다.
UI에는 Grafana라는 좋은 오픈소스가 있어서 사용해도 되지만, 오픈소스가 추가되면 될수록 종속성이 증가할수도 있기 때문에 따로 React로 UI를 제작하였다.
Alertmanager는 metric중에 수치를 설정하여서 해당수치에 대한 결과값이 생기면 alert을 발생시키는데 webhook 형태로 slack에 등록하여 메시지를 전달할수도 있고 mail을 발송할 수도 있다.
하지만 설정파일의 형태가 yml로 되어있어 동적으로 조건설정이 불가능하고 또 조건이 변경되면 Prometheus 서비스 자체를 재시작해야 하는 한계가 있어서 사용하지 않았다.
linux 계열의 서버, O/S metric 정보를 얻기위한 node_exporter (Windows계열일 경우는 Windows_exporter, NVIDIA GPU 계열일 경우는 Prometheus-dcgm을 사용하면 된다)
postgresql metric 정보를 얻기위한 PG exporter 2가지를 사용하였다.

2. Prometheus 설치

https://github.com/prometheus/prometheus/releases에서 알맞은 version을 사용하면 된다.

(1) 다운로드 wget을 사용함
wget https://github.com/prometheus/prometheus/releases/download/v2.43.0/prometheus-2.43.0.linux-amd64.tar.gz

(2) 압축해제
tar -zvxf prometheus-2.43.0.linux-amd64.tar.gz

(3) 실행
실행방법은 3가지이다 Docker로 설치했을 경우는 docker container를 run할 것이고 service로 등록하여 실행하는 방법, 간단한 shell을 만들어 nohub으로 실행하는 방법이 있는데 delivery를 DB 엔지니어들이 해야하므로 docker는 처음부터 제외했고 환경변수등도 한꺼번에 지정할 수 있도록 shell로 만들어 nohub으로 실행하는 방법을 선택했다.

혹시나 service를 등록하고 싶다면 해당 url을 참조하면 좋을 거 같다.
https://chhanz.github.io/linux/2019/01/18/linux-how-to-create-custom-systemd-service/

nohub (설치된경로)/promethus 로 실행하는데

주로 사용하는 옵션은

--config.file="prometheus.yml" job 등록, scrap 시간등을 설정하는 config파일의 이름을 지정할 때 사용한다. 사용하지 않으면 실행경로의 prometheus.yml을 찾는다.

--web.listen-address="0.0.0.0:9090" port를 지정할 때 사용, 사용하지 않으면 디폴트 port는 9090이다.
설치된 ip:9090으로 접속해서, 아래의 화면 나왔다면 일단 promethus 설치는 완료이다.

3. node_exporter 설치

cpu 사용량, memory등 server의 피지컬적인 정보를 수집하기 위해 사용한다.

(1) 다운로드 wget 이용
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz

(2) 압축해제
tar -zvxf node_exporter-1.5.0.linux-amd64.tar.gz

(3) 실행

nohub (설치된 경로) / node_exporter로 실행

주로 사용하는 옵션은
--web.listen-address=0.0.0.0:9111 port를 지정할 때 사용, 사용하지 않으면 디폴트 port는 9100이다.
설치된ip:지정한port/metrics (ex> http://127.0.0.1:9111/metrics) 접근해서 아래와 같은 창이 뜬다면 성공이다.

(4) Prometheus 연동
위의 node_exporter는 결국 prometheus의 하나의 job이고 추적할 metric이다. 따라서 prometheus에 등록되어야 하는데 위 설정에서 얘기했던 prometheus.yml에 등록하면 된다.


- job_name: 'node_exporter’
        scrape_interval: 1s

        static_configs:
        - targets: ["127.0.0.1:9111"]

job_name을 지정하고
scrape_interval은 해당 metric을 쌓는 시간이다. 지금은 1s(초)를 지정했으니 interval 1분으로 하면 60개가 나온다. tartgets는 metic주소이다. 해당 주소와 HTTP 통신을 수행한다.
status target 메뉴이다. state가 up을 정상적으로 등록된걸 알 수 있다.

(5) metric 확인

시간대별로 해당 metric이 수집되는걸 알 수 있다. 1초씩 데이터를 쌓는걸로 설정하고 10초동안 데이터를 조회해서 9개가 나왔다(왜 10개가 아니라 9개인지는 모르겠다.) []를 사용하면 현 시점에 검색조건 시간전까지 metric을 출력한다.

4. pg_exporter 설치

target DB를 설정하여 해당 DB에 query를 통하여 metric을 수집할 수 있다.

(1) 다운로드 wget 이용
wget https://github.com/Vonng/pg_exporter/releases/download/v0.5.0/pg_exporter_v0.5.0_linux-amd64.tar.gz

(2) 압축해제
tar -zvxf pg_exporter_v0.5.0_linux-amd64.tar.gz

(3) 실행
node_exporter와 다르게 시작전에 환경변수 지정이 필요하다.


export DATA_SOURCE_NAME=postgresql://id:pw@ip:port/database?sslmode=disable
export PG_EXPORTER_CONFIG='/home/monitoring/pg_exporter/'

ex> export DATA_SOURCE_NAME=postgresql://test:test@127.0.0.1:5434/test?sslmode=disable
nohub (설치된경로)/ pg_exporter로 실행하는데 pg_exporter.yml란 파일이 같이 있다 이 파일은 수집할 metric을 query를 사용해야 될 경우 등록하면 된다.

주로 사용하는 옵션은
--extend.query-path=./queries.yml query.yml 등록파일의 경로와 이름을 설정할 수 있다.
--web.listen-address=":9666” port를 지정하는데 아래의 targets에서 사용될 값이다.

(4) Prometheus 연동


- job_name: 'pg_exporter’
        scrape_interval: 1s

        static_configs:
        - targets: ["127.0.0.1:9666"]

아래와 같이 내가 설정한 9666번으로 나왔다면 성공

(5) query 등록
위에서 얘기한 query.yml에 수집한 metric 항목 query를 등록할 수 있다.


pg_session:
        query: "select count(1) as active_count  from pg_stat_activity where state='active';"

metrics:
	- active_count:
        usage: "COUNTER"
        description: "count of active state session"

pg_session이란 metric의 이름을 지정하고, 해당 metric을 수집할 수 있는 쿼리를 입력한다.
그리고 usage에 해당 항목의 type을 설정한다.(COUNTER, GAUGE, LABEL)

위와 같이 pg_session_active_count란 metric이 생기고 execute를 눌렀을 때 값이 나온다면 성공

여기까지 Prometheus, node_exporter, pg_exporter의 연동을 마치겠습니다.

profile
백엔드 개발자

0개의 댓글