๋ค์ด๊ฐ๋ฉฐ
์ปจํ ์ด๋๋ฅผ ๊ด๋ฆฌํ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ํญ์ ๋ฑ์ฅํ๋ ๊ฒ์ด ํ๋ก๋ฉํ ์ฐ์ค(Prometheus)์ ๊ทธ๋ผํ๋(Grafana)์ ๋๋ค.๋ ๊ธฐ์ ์ ์ฒ ์ฒํ ์๋ก ๋ค๋ฅธ ์ญํ ์ ํ์ง๋ง, ๋ชจ๋ํฐ๋ง ํด๋ก ์ฌ์ฉํ๊ธฐ์๋ ๊ถํฉ์ด ์ข์ต๋๋ค. ์ค๋์ ๋ ๊ฐ์ง ๊ธฐ์ ์ ๋ํด ์ดํด๋ณด๊ณ , ๊ฐ๋จํ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ๊น์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค ๋งคํธ๋ฆญ(Prometheus Metrics)์ด๋?
ํ๋ก๋ฉํ ์ฐ์ค(Prometheus)๋ ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ์ ์ํ ์คํ์์ค ์์คํ ์ผ๋ก, ์๊ณ์ด ๋ฐ์ดํฐ(time-series data)๋ฅผ ์์งํ๊ณ ์ ์ฅํฉ๋๋ค. ์ฌ๊ธฐ์ "๋งคํธ๋ฆญ(metric)"์ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ๋ชจ๋ํฐ๋งํ๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด๋ ์๊ฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ํน์ ์ธก์ ๊ฐ์ ๋ํ๋ ๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค ๋งคํธ๋ฆญ์ ์ฃผ์ ํน์ง
- ์๊ณ์ด ๋ฐ์ดํฐ: ๋งคํธ๋ฆญ์ ํน์ ์๊ฐ(timestamp)์ ๋ํ ๊ฐ(value)๊ณผ ํด๋น ๊ฐ์ด ๋ฐ์ํ ๋ ์ด๋ธ(label)์ ์งํฉ์ผ๋ก ์ ์๋ฉ๋๋ค.
- ์: cpu_usage{host="server1", core="0"} 0.85 @ 1672601983
- ๋ ์ด๋ธ(Label): ๋งคํธ๋ฆญ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ key-value ์์
๋๋ค. ๋ ์ด๋ธ์ ํตํด ๋์ผํ ๋งคํธ๋ฆญ ์ด๋ฆ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ผ๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์: http_requests_total{method="POST", status="500"} 10
- ๋ค์ํ ์ ํ: ํ๋ก๋ฉํ ์ฐ์ค ๋งคํธ๋ฆญ์ ๋ค ๊ฐ์ง ๊ธฐ๋ณธ ์ ํ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค ๋งคํธ๋ฆญ์ ์ฅ์
- ๊ณ ๋๋ก ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅํ ๋ ์ด๋ธ: ๋ณต์กํ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ์ ๋ถ์ ๊ฐ๋ฅ.
- ํจ์จ์ ์ธ ์คํ ๋ฆฌ์ง: ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ์ฒ๋ฆฌ.
- ์๋ฆผ ์์คํ ํตํฉ: AlertManager์ ํจ๊ป ์ฌ์ฉํด ๋ฌธ์ ๋ฐ์ ์ ์๋ฆผ์ ๋ณด๋ผ ์ ์์.
์ฆ, ํ๋ก๋ฉํ ์ฐ์ค๋ ๋ฐ์ดํฐ ์์ง๋ง์ ๋ด๋นํ๋ ์๋น์ค์ ๋๋ค.
๊ทธ๋ผํ๋(Grafana)๋?
๊ทธ๋ผํ๋(Grafana)๋ ๋ฐ์ดํฐ ์๊ฐํ์ ๋ชจ๋ํฐ๋ง์ ์ํ ์คํ์์ค ํ๋ซํผ์ ๋๋ค. ๋ค์ํ ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋์๋ณด๋๋ฅผ ์์ฑํ๊ณ , ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ ์ ์๋๋ก ๋์์ค๋๋ค. ์ฃผ๋ก ํ๋ก๋ฉํ ์ฐ์ค(Prometheus)์ ํจ๊ป ์ฌ์ฉ๋์ง๋ง, ๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค์๋ ์ ํตํฉ๋ฉ๋๋ค.
๊ทธ๋ผํ๋์ ์ฃผ์ ๊ธฐ๋ฅ
- ๋ฐ์ดํฐ ์๊ฐํ
- ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ฐจํธ, ๊ทธ๋ํ, ํ ์ด๋ธ ํํ๋ก ์๊ฐํ.
- ๋ฐ์ดํฐ๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ํ์ ๊ฐ๋ฅ.
- ๋ค์ํ ๋ฐ์ดํฐ ์์ค ์ง์
- Prometheus, InfluxDB, Elasticsearch, OpenSearch, MySQL, PostgreSQL ๋ฑ๊ณผ ์ฐ๋ ๊ฐ๋ฅ.
- ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ค๋ฅผ ํ ๋์๋ณด๋์ ํตํฉํ์ฌ ๋ถ์ ๊ฐ๋ฅ.
- ๋์๋ณด๋ ์์ฑ ๋ฐ ์ปค์คํฐ๋ง์ด์ง
- ๋๋๊ทธ ์ค ๋๋กญ ๋ฐฉ์์ผ๋ก ๋์๋ณด๋ ์์ฑ.
- ๋ค์ํ ์์ ฏ(๊ทธ๋ํ, ๊ฒ์ด์ง, ํํธ๋งต ๋ฑ) ์ ๊ณต.
- ์๋ฆผ(Alerting)
- ํน์ ์กฐ๊ฑด์ ์ค์ ํด ์๋ฆผ์ ์์ฑํ๊ณ ์ด๋ฉ์ผ, Slack, PagerDuty ๋ฑ์ผ๋ก ์๋ฆผ ์ ์ก.
- ์: ์๋ฒ์ CPU ์ฌ์ฉ๋ฅ ์ด 90%๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ ์๋ฆผ ๋ฐ์ก.
- ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ฐ ๊ณต์
- ๋์๋ณด๋๋ฅผ ํ๊ณผ ๊ณต์ ํ๊ฑฐ๋ ์ฌ์ฉ์๋ณ ์ ๊ทผ ๊ถํ ์ค์ .
- ํน์ ์ฌ์ฉ์๋ ํ์ ๋ง์ถ ๋์๋ณด๋ ์ ๊ณต.
- ํ๋ฌ๊ทธ์ธ ํ์ฅ์ฑ
- ์๋ฐฑ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ ์์ค, ์ฐจํธ ์ ํ, ํจ๋ ๊ธฐ๋ฅ ์ถ๊ฐ ๊ฐ๋ฅ.
๊ทธ๋ผํ๋์ ์ฃผ์ ํ์ฉ ์ฌ๋ก
- ์๋ฒ ๋ฐ ์์คํ
๋ชจ๋ํฐ๋ง
- CPU, ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ์ฌ์ฉ๋ ์ถ์ .
- ํ๋ก๋ฉํ ์ฐ์ค์ ์ฐ๋ํ์ฌ ์๋ฒ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋ง.
- ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ ๊ด๋ฆฌ(APM)
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต ์๊ฐ, ์๋ฌ์จ, ํธ๋ํฝ ๋ถ์.
- ๋ฐ์ดํฐ ์์ค๋ก New Relic, Jaeger ๋ฑ ์ฌ์ฉ.
- ๋น์ฆ๋์ค ๋ฐ์ดํฐ ์๊ฐํ
- ๋งค์ถ, ์ฌ์ฉ์ ํ๋, ํธ๋์ญ์ ๋ฐ์ดํฐ ๋ถ์.
- MySQL, PostgreSQL ๋ฑ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ ๋์๋ณด๋ ์์ฑ.
- ํด๋ผ์ฐ๋ ์ธํ๋ผ ๋ชจ๋ํฐ๋ง
- AWS, Google Cloud, Azure์ ์๋น์ค ์ํ ๋ฐ ๋น์ฉ ๋ถ์.
- CloudWatch, BigQuery์ ๊ฐ์ ํด๋ผ์ฐ๋ ๋ฐ์ดํฐ ์์ค์ ํตํฉ.
ํ๋ก๋ฉํ ์ฐ์ค+๊ทธ๋ผํ๋ ๊ตฌ์ถํ๊ธฐ
Python FastAPI๋ฅผ ์ฌ์ฉํด์ ์ฌํํ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๊ทธ๋ผํ๋์์ ๋ณผ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค. ๋จผ์ ๋ก๊ทธ ์นด์ดํธ๋ฅผ ์ธ๋ FastAPI ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
from fastapi import FastAPI
from prometheus_client import Counter, generate_latest
app = FastAPI()
# Prometheus Metrics
LOG_COUNTER = Counter("log_count", "Count of specific logs")
@app.get("/")
def read_root():
return {"message": "Hello World"}
@app.get("/metrics")
def metrics():
# Prometheus metrics endpoint
return generate_latest(), {"Content-Type": "text/plain; version=0.0.4"}
@app.get("/log")
def log_event():
LOG_COUNTER.inc() # Increment the counter
return {"message": "Log incremented"}
ํ๋ก๋ฉํ ์ฐ์ค ํด๋ผ์ด์ธํธ์ FastAPI๋ฅผ ๊ตฌ๋ํ ์ ์๋ ํจํค์ง๋ฅผ ์ค์นํด์ค๋๋ค.
pip install prometheus-client fastapi uvicorn
FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด์ค๋๋ค.
uvicorn app:app --host 0.0.0.0 --port 8000
http://localhost:8000/metrics์์ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์์งํ๋ ๋ฉํธ๋ฆญ์ ํ์ธํด๋ด ๋๋ค. ์ ๊ฐ์ธ์ ์ธ ํ ์คํธ ํ๊ฒฝ์์๋ ์ฃผ์ ๊ฐ์์์ฐ์ ๋ํ ์ค๋๋ถ ๊ฐ์๋ฅผ ์์งํ์ต๋๋ค. ์๋์ ๋น์ทํ๊ฒ ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํฉ๋๋ค.
process_cpu_seconds_total 4.460000000000001
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 16.0
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 65535.0
# HELP btc_open_order BTC open order count
# TYPE btc_open_order gauge
btc_open_order 328.0
# HELP eth_open_order ETH open order count
# TYPE eth_open_order gauge
eth_open_order 220.0
# HELP xrp_open_order XRP open order count
# TYPE xrp_open_order gauge
xrp_open_order 227.0
# HELP doge_open_order DOGE open order count
# TYPE doge_open_order gauge
doge_open_order 231.0
# HELP sol_open_order SOL open order count
# TYPE sol_open_order gauge
sol_open_order 234.0
metrics์ ๋ฐ์ดํฐ๋ jsonํํ๊ฐ ์๋ plain text์ ๋๋ค. ๋ง์ฝ metrics์ ๋ฐ์ดํฐ๊ฐ ๋๊ดํธ๋ก ์์ํ์ ๋๋ json์ผ๋ก ์ฝ์ผ๋ ค๋ค๊ฐ ์๋ฌ๊ฐ ๋ ์ ์์ผ๋ FastAPI์ metric ๋ผ์ฐํฐ์ ๋ฐํ๊ฐ์ ์๋์ ๊ฐ์ด Response๋ก ๋ณ๊ฒฝํฉ๋๋ค.
from fastapi import FastAPI
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
from starlette.responses import Response
app = FastAPI()
@app.get("/metrics")
def metrics():
# Return Prometheus metrics with explicit Content-Type
return Response(content=generate_latest(), media_type=CONTENT_TYPE_LATEST)
๋ค์์ผ๋ก ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋๋ฅผ ๋์ปค ์ปจํ ์ด๋ ์์ ์คํํ ์ค๋น๋ฅผ ํฉ๋๋ค. docker-compose.yml์ ์์ฑํฉ๋๋ค.
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
networks:
- monitoring
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
networks:
- monitoring
networks:
monitoring:
driver: bridge
๋ค์์ผ๋ก prometheus.yml์ ์์ฑํฉ๋๋ค.
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'fastapi'
metrics_path: /metrics
static_configs:
- targets: ['host.docker.internal:8000']
๋ง์ง๋ง์ผ๋ก Docker compose๋ฅผ ์คํํฉ๋๋ค.
docker-compose up -d
docker-compose ps๋ฅผ ํตํด ์ปจํ ์ด๋๊ฐ ์ ๋๋ก ์๋ํ๋ ์ง ์ฒดํฌ ํฉ๋๋ค.
๋ง์ฝ ์ปจํ ์ด๋์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด docker-compose logs ํน์ docker logs prometheus ๋ช ๋ น์ด์์ ERROR๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์์งํ๋ ์ปจํ ์ด๋ ์์ ํฌํธ๋ 9090์ด๋ฉฐ(http://localhost:9090), ๊ทธ๋ผํ๋๋ฅผ ๋ณผ ์ ์๋ ํฌํธ๋ 3000์ ๋๋ค( http://localhost:3000). http://localhost:9090/api/v1/targets๋ฅผ ์กฐํํด์ health๊ฐ์ด "up" ์ํ์ด์ด์ผ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ "down"์ํ์ด๋ฉด lastError๋ฅผ ์ฐธ๊ณ ํด์ ์์ ํด์ผ ํฉ๋๋ค.
permission denied ๊ถํ ๋ฌธ์ ๊ฐ ๋์๋ค๋ฉด,
sudo chown -R 472:472 ./grafana-data ๋ช
๋ น์ด๋ฅผ ํตํด Grafana Docker ์ปจํ
์ด๋๊ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ฌ์ฉ์ ๊ทธ๋ฃน์ผ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
yml ํ์ผ๋ค์ ๋ณ๊ฒฝํ๊ณ ๋๋ฉด docker-compose ์ฌ์์ํด์ผ ์ ์ฉ๋ฉ๋๋ค.
docker-compose down
docker-compose up -d
http://localhost:3000์ ์ ์ํ์ฌ ๊ทธ๋ผํ๋๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํฉ๋๋ค. ์ด๊ธฐ ๋ก๊ทธ์ธ ์ ๋ณด๋ admin/admin์ ๋๋ค. ์ฒซ ๋ก๊ทธ์ธ์ ๋ณ๊ฒฝ์ด ํ์ํฉ๋๋ค. ์ด ๊ณผ์ ์ด ์ซ์ผ์๋ฉด docker-compose.yml์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํฉ๋๋ค.
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=my_grafana
volumes:
- ./grafana-data:/var/lib/grafana
networks:
- monitoring
๊ทธ๋ผํ๋ ์ค์ ์ ๋ ๊ฐ์ง์ ๋๋ค. ์ฒซ ๋ฒ์งธ๋ data-source์ด๊ณ ๋ ๋ฒ์งธ๋ dashboard setting์ ๋๋ค. Connections์ Data sources๋ก ๋ค์ด๊ฐ์ ์ ๊ธฐ๋ณธ์ผ๋ก ์กํ์๋ connection์ ํ๋ก๋ฉํ ์ฐ์ค๋ก ์ค์ ํด์ค๋๋ค. ์๋ก์ด connection์ ํ๋ฐฉํ๋ค๋ณด๋ฉด ํ๋ก๋ฉํ ์ฐ์ค ๋ง๊ณ ๋ ์๋ง์ ๋ฐ์ดํฐ ์์ค๊ฐ ์๋ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค.
๋ค์์ Dashboard๋ก ๋ค์ด๊ฐ์ ์๋ก์ด Dashboard๋ฅผ ๋ง๋์๊ณ new panel ์ค์ ์์ Metric Browser์์ log_count๋ฅผ ์ ํํ๋ฉด ์๊ฐํ ๊ทธ๋ํ๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
์ ์์ ์์๋ ์์ ๋ง์๋๋ฆฐ ๊ฒ๊ณผ ๊ฐ์ด ๊ฐ์์์ฐ์ ๋ํ count๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๋ง์ฝ metric browser์์ "log_count"๋ผ๋ ํ๊ทธ๊ฐ ์กํ์ง ์๋๋ค๋ฉด, ํ๋ก๋ฉํ ์ฐ์ค์์ ๋ฐ์ดํฐ ์์ง์ด ์ํํ๊ฒ ์๋๊ณ ์๋ ๊ฒ์ด๋ ํ๋ก๋ฉํ ์ฐ์ค์์ ๋ฐ์ดํฐ ์์ง์ด ์ ๋๊ณ ์๋์ง logs์ http://localhost:9090/api/v1/targets๋ฅผ ๋ค์ ํ์ธํด์ฃผ์๋ฉด ๋ฉ๋๋ค. data-source๋ ํ์ธํด๋ณด์ธ์.
๊ทธ๋ฆฌ๊ณ query option์์ interval์ ์กฐ์ ํ ์ ์๊ณ , panel option์์ Legend, tooltip, Axis, Style๋ฑ ๋ค์ํ ์๊ฐํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ์ฐจํธ ์ข ๋ฅ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ฃ . Time series๋ฅผ Bar chart๋ก ๋ณ๊ฒฝํ ๋ชจ์ต์ ๋๋ค.
์ฌ๊ธฐ๊น์ง ๊ฐ๋จํ๊ฒ ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋๋ฅผ ํตํ ์๊ฐํ ๋ชจ๋ํฐ๋ง์ ๋ง๋ค์ด๋ดค์ต๋๋ค.
๋ง์น๋ฉฐ
๋ง์น๋ ๊ธ ์ ์, ํ๋ก๋ฉํ ์ฐ์ค์ ๋ํด ์กฐ๊ธ ๋ ์์๋ณด๊ฒ ์ต๋๋ค. ์ ๋ ๋ชจ๋ํฐ๋ง ์๊ฐํ๋ฅผ ๊ตฌ์ถํ ๋ ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๋ฐ ์ ๋ฅผ ๋จน์๊ฑฐ๋ ์.
๋จผ์ ํ๋ก๋ฉํ ์ฐ์ค์ ๋ฐ์ดํฐ ํ์ ์ข ๋ฅ๊ฐ ๋ช๊ฐ์ง ์์ต๋๋ค. ์ํฉ์ ๋ง๋ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํด์ผ ์ ๋๋ก ๋ ์๊ฐํ ํด์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๋ค์์ ํ๋ก๋ฉํ ์ฐ์ค์ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ์ค๋ช ์ ๋๋ค.
1. Counter (์นด์ดํฐ)
์ค๋ช
- ๋จ์กฐ ์ฆ๊ฐ ๋ฉํธ๋ฆญ์ผ๋ก, ๊ฐ์ด 0 ์ด์์ด๋ฉฐ ์ค์ง ์ฆ๊ฐ๋ง ๊ฐ๋ฅํฉ๋๋ค.
- ์ฃผ๋ก ์ด๋ฒคํธ ํ์๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์์ ์ ์ด๊ธฐํ๋ ์ ์์ต๋๋ค.
์ฌ์ฉ ์์
# HELP http_requests_total Total number of HTTP requests
# TYPE http_requests_total counter
http_requests_total{method="GET", status="200"} 1234
http_requests_total{method="POST", status="500"} 42
- ์๋ฏธ: ์ด HTTP ์์ฒญ ์๋ฅผ ์ํ ์ฝ๋๋ณ๋ก ๊ตฌ๋ถ.
- PromQL ์์ :
rate(http_requests_total[5m]) # ์ง๋ 5๋ถ ๋์ ์ด๋น ์์ฒญ ์์ ๋น์จ ๊ณ์ฐ
2. Gauge (๊ฒ์ด์ง)
์ค๋ช
- ๊ฐ์ด ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ ์ ์๋ ๋ฉํธ๋ฆญ.
- ์ฃผ๋ก ํ์ฌ ์ํ(CPU ์ฌ์ฉ๋ฅ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ)๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฌ์ฉ ์์
# HELP memory_usage_bytes Current memory usage in bytes
# TYPE memory_usage_bytes gauge
memory_usage_bytes 204857600
- ์๋ฏธ: ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋(๋ฐ์ดํธ ๋จ์).
- PromQL ์์ :
memory_usage_bytes # ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์กฐํ
3. Histogram (ํ์คํ ๊ทธ๋จ)
์ค๋ช
- ๋ฐ์ดํฐ๋ฅผ ๋ฒํท ๋จ์๋ก ๋ถํฌ์์ผ ์ ์ฅํฉ๋๋ค.
- ๊ฐ์ด ํน์ ๋ฒ์์ ์ผ๋ง๋ ์์ฃผ ๋ํ๋๋์ง๋ฅผ ์ธก์ ํฉ๋๋ค.
- ์์ฝ ์ ๋ณด(_sum, _count, ๋ฒํท๋ณ ๋ฐ์ดํฐ)๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ ์์
# HELP http_request_duration_seconds HTTP request duration in seconds
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.1"} 2400
http_request_duration_seconds_bucket{le="0.5"} 3000
http_request_duration_seconds_bucket{le="1.0"} 3500
http_request_duration_seconds_bucket{le="+Inf"} 4000
http_request_duration_seconds_sum 700
http_request_duration_seconds_count 4000
- ์๋ฏธ:
- le="0.1": 0.1์ด ์ดํ๋ก ์ฒ๋ฆฌ๋ ์์ฒญ ์๋ 2400.
- http_request_duration_seconds_sum: ๋ชจ๋ ์์ฒญ์ ์ด ์๊ฐ ํฉ๊ณ(์ด ๋จ์).
- http_request_duration_seconds_count: ์์ฒญ ์ด ๊ฐ์.
- PromQL ์์ :
- ์๋ฏธ: ์ง๋ 5๋ถ ๋์ ์์ฒญ์ ํ๊ท ์ฒ๋ฆฌ ์๊ฐ.
- rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])
4. Summary (์์ฝ)
์ค๋ช
- ํ์คํ ๊ทธ๋จ๊ณผ ์ ์ฌํ์ง๋ง ์ฟผํ์ผ(Quantile) ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๋ฒํท ๋์ ์ง์ ์ ์ธ ํต๊ณ ๊ฐ(์: 0.5-๋ฐฑ๋ถ์์, 0.9-๋ฐฑ๋ถ์์)์ ์ ๊ณตํฉ๋๋ค.
- ์ ํํ ๊ณ์ฐ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ๋์ด ๋์ ์ ์์ต๋๋ค.
์ฌ์ฉ ์์
# HELP http_request_duration_seconds HTTP request duration in seconds
# TYPE http_request_duration_seconds summary
http_request_duration_seconds{quantile="0.5"} 0.05
http_request_duration_seconds{quantile="0.9"} 0.1
http_request_duration_seconds{quantile="0.99"} 0.2
http_request_duration_seconds_sum 500
http_request_duration_seconds_count 10000
- ์๋ฏธ:
- quantile="0.5": ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ 50%๊ฐ 0.05์ด ์ดํ.
- quantile="0.99": ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ 99%๊ฐ 0.2์ด ์ดํ.
- PromQL ์์ :
- ์๋ฏธ: 99-๋ฐฑ๋ถ์์ ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ.
- http_request_duration_seconds{quantile="0.99"}
๋ฐ์ดํฐ ํ์ ๋น๊ต ๋ฐ ์ ํ ๊ฐ์ด๋
ํ์ | ์ฃผ์ ํน์ง | ์ฌ์ฉ ์ฌ๋ก |
Counter | ๋จ์กฐ ์ฆ๊ฐ, ๊ฐ ์ด๊ธฐํ ๊ฐ๋ฅ | ์์ฒญ ์, ์ค๋ฅ ์, ์ฒ๋ฆฌ๋ ์์ ์ ์ธก์ |
Gauge | ๊ฐ ์ฆ๊ฐ/๊ฐ์ ๊ฐ๋ฅ, ํ์ฌ ์ํ ์ธก์ | CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ํ์ฌ ์จ๋, ํ์ฑ ์ฐ๊ฒฐ ์ |
Histogram | ๋ฒํท ๋ถํฌ ๋ฐ์ดํฐ, _sum์ _count ์ ๊ณต | ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ ๋ถํฌ, ํ์ผ ํฌ๊ธฐ ๋ถํฌ |
Summary | ์ฟผํ์ผ ๊ธฐ๋ฐ ์์ฝ, ์ ํํ ๊ณ์ฐ | ์๋ต ์๊ฐ์ 50%, 90%, 99% ๋ฐฑ๋ถ์์ ๊ณ์ฐ |
ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋ ฅํ๊ณ ํธํ ์๊ฐํ ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ธฐ ๊ตฌ์ถ์ด ์กฐ๊ธ ๊น๋ค๋กญ๊ธด ํ์ง๋ง, ๊ฐ๋จํ ์์ ๋ก๋ถํฐ ์์ํด๋ณด์ธ์! ์ดํ ์ฌ๋ฌ๋ถ๋ค์ด ํ๋ ํ๋ก์ ํธ์์ ๋ณด๊ณ ์ถ์ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ์ถ๊ฐํด์ ์ค์๊ฐ์ผ๋ก ์์ด๋ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ฐ์ํ์๋ฉด ๋ฉ๋๋ค.
'์๋น์ค & ํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] 2. ๋์ปค ๋คํธ์ํฌ์ ๋์ปค ์คํ ๋ฆฌ์ง (0) | 2025.01.02 |
---|---|
[Docker] 1. ๋์ปค, ์ด๋ฏธ์ง, ์ปจํ ์ด๋, ๋ ์ง์คํธ๋ฆฌ (0) | 2024.12.24 |
[๋ฉ์ธ์ง ๋ธ๋ก์ปค] RabbitMQ vs Apache KafKa (0) | 2024.12.16 |
[git] Git rebase(๋ฆฌ๋ฒ ์ด์ค)๋? (0) | 2023.08.10 |
[git] .gitignore ์ ์ฉ ์๋ ๋ (0) | 2023.08.10 |
๋๊ธ