[Prometheus] ์์
Prometheus๋ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ค.
์ฟ ๋ฒ๋คํฐ์ค ์ ์ฉ์ ์๋๊ณ , ๋ฒ์ฉ์ด๋ค.
2012๋ ์ ์ฒ์ ๋์๊ณ , Go๋ก ๋ง๋ค์ด์ก๋ค.
๋จ๋ ์ผ๋ก ์ฌ์ฉํ์ง๋ ์๊ณ , ์๊ฐํ๋ฅผ ์ํด์ grafana ๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ๊ณค ํ๋ค.
์ด๋ฒคํธ ์ค์ฌ์ ๋ก๊ทธ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ํนํ๋์ด์์ผ๋ฉฐ, ๊ทธ๋์ ๋ด๋ถ์ ์ผ๋ก ์๊ณ์ด DB๋ฅผ ์จ์ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋ค.
๊ตฌ์กฐ
์ผ๋ฐ์ ์ธ ํ๋ก๋ฉํ ์ฐ์ค ์์คํ ์ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
์กฐ๊ธ ํน์ดํ ๋ถ๋ถ์, ์ฌํ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ค์ ์์ด์ ํธ->๋ชจ๋ํฐ๋ง์๋ฒ ๋ฐฉํฅ์ ๋ฐ์ดํฐ ์ ๋ฌ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์งํ๋๋ฐ ๋ฐํด, ํ๋ก๋ฉํ
์ฐ์ค๋ ๋ชจ๋ํฐ๋ง์๋ฒ->์์ด์ ํธ์ ์ญ์์ผ๋ก ์ง์ ์ ์ํด์ ๋ฐ์ดํฐ๋ฅผ ๊ธ์ด๊ฐ๋ ํํ๋ผ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๊ฐ ๋จธ์ ์ ๊น๋ฆฐ ์์ด์ ํธ๋ฅผ Exporter๋ผ๊ณ ๋ถ๋ฅด๊ณ , ๋ฉํธ๋ฆญ์ ๋ก๊ฒจ์จ๋ค(pull)๊ณ ํํํ๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ ์ฟ ๋ฒ๋คํฐ์ค ์์ด Docker conteiner๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ณ๊ฒ ์จ๋ณด๋ฉด์ ๊ทธ ์ฌ์ฉ๊ตฌ์กฐ๋ฅผ ์ตํ๋ณด๋๋ก ํ๊ฒ ๋ค.
Prometheus ๋์ฐ๊ธฐ
์ฐ์ ํ๋ก๋ฉํ ์ฐ์ค์ ์ค์ ์ ๋ณด๋ฅผ prometheus.yml๋ก ์์ฑํด์ค์ผ ํ๋ค.
# ์ ์ญ ์ค์
global:
scrape_interval: 15s # 15์ด๋ง๋ค ๋งคํธ๋ฆญ์ ์์งํ๋ค. ๊ธฐ๋ณธ์ 1๋ถ.
evaluation_interval: 15s # 15์ด๋ง๋ค ๊ท์น์ ํ๊ฐํ๋ค. ๊ธฐ๋ณธ์ 1๋ถ.
# ์ธ๋ถ ์์คํ
์ ํ์ํ ์ด ์๋ฒ์ ๋ ์ด๋ธ
external_labels:
monitor: 'codelab-monitor'
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
๋ฑ ๊ธฐ๋ณธ์ค์ ๋ง ์๋ ๊ตฌ์ฑ์ด๋ค.
์ ๋๋ก Dockerfile์ ์จ์ ๋ง์์ค๋ค.
FROM prom/prometheus
ADD prometheus.yml /etc/prometheus/

docker build -t prom .

๊ทธ๋ฆฌ๊ณ 9090ํฌํธ๋ก ์คํํด์ฃผ๋ฉด
docker run -p 9090:9090 prom


์ ์์ด ๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ์ด๊ฒ๋ง์ผ๋ก๋ ์๋ฌด๊ฒ๋ ํ ์๊ฐ ์๋ค.
์์งํ ์์ด์ ํธ, exporter๋ฅผ ์ถ๊ฐํด์ค์ผ ํ๋ค.
exporter ์ถ๊ฐํ๊ธฐ
exporter์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. MySQL server exporter, RabbitMQ exporter, HAProxy exporter, Docker Hub exporter, AWS CloudWatch exporter ๋ฑ๋ฑ...
ํ์ง๋ง ์ฌ๊ธฐ์๋ ๊ฐ์ฅ ๋ฒ์ฉ์ ์ด๊ณ ๊ธฐ๋ณธ์ ์ถฉ์คํ Node Exporter๋ฅผ ์จ๋ณด๊ฒ ๋ค.
Node Exporter๋ CPU์ ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ์์น ์ ๋๋ง ์์งํ๋ค.
์๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ๋์ธ ์ ์๋ค.
docker run -d -p 9100:9100 prom/node-exporter

๊ทธ๋ฆฌ๊ณ ํ๋ก๋ฉํ ์ฐ์ค์๋ ์ exporter ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค.
- job_name: 'test-server'
scrape_interval: 10s
static_configs:
- targets: ['host.docker.internal:9100']
์ง๊ธ ๋ด ๊ฒฝ์ฐ์๋ ๊ฐ์ host๋ฅผ ๊ณต์ ํ๊ณ ์์ด์ host.docker.internal๋ฅผ ํตํด localhost๋ก ๊ฝ์๋จ๋๋ฐ, ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ์ค์ ๋ก ์ธ ๋๋ ๋ด๋ถ IP๋ฅผ ๋ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ์ฌ๋ถํ ํด์
์ด๋ ๊ฒ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ์ ์ถ๊ฐ๋๋ฉด ์ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
๋ฉํธ๋ฆญ ์กฐํํ๊ธฐ
๊ทธ๋ํ ํ์ด์ง์์ ์ ๊ฒ์์ฐฝ์ ์ฌ์ฉํ๋ฉด query๋ก ์งํ๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค.
์๋๋ active ์ํ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ฆ๋ฅผ ๋ฐ์ดํธ๋ก ๋ณด์ฌ์ค๋ค.
๊ทผ๋ฐ ์ด๊ฒ ๊ธฐ๋ณธ ์ ๊ณต ์งํ๋ ์๋ฌด๋๋.. ์ธ๊ฐ์ด ๋ณด๊ธฐ์๋ ์ข ํ๋ค๋ค.
๊ทธ๋์ ์ข๋ ๊ฐ๊ณตํด์ ๋ณด๋๊ฒ ์ข์๋ฐ, ์ฝ๊ฐ functionalํ ํํ์์ผ๋ก ์ฐ์ฐ์ ๋ํ ์ ์๋ค.
์๋๋ CPU ์ฌ์ฉ๋์ ๋ฐฑ๋ถ์จ๋ก ๋์ฐ๊ณ
(1 - avg(irate(node_cpu_seconds_total{mode="idle"}[10m])) by (instance)) * 100

์ด๊ฑด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฐฑ๋ถ์จ๋ก ๋์ด๋ค.
100 * (1 - ((avg_over_time(node_memory_MemFree_bytes[10m]) + avg_over_time(node_memory_Cached_bytes[10m]) + avg_over_time(node_memory_Buffers_bytes[10m])) / avg_over_time(node_memory_MemTotal_bytes[10m])))

query ๋ฌธ๋ฒ์ ๋ํ๊ฑด ์ ์ฉ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๊ฒ ๋ค.
https://prometheus.io/docs/prometheus/latest/querying/basics/
์ฐธ์กฐ
https://hub.docker.com/r/prom/prometheus
https://blog.outsider.ne.kr/1254