-
Notifications
You must be signed in to change notification settings - Fork 3
๐ฅ๏ธ ๋ก๊น &๋ชจ๋ํฐ๋ง
๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ฉํธ๋ฆญ ๋ฟ๋ง ์๋๋ผ ๋๋ฒ๊น ์ฉ๋์ ๋ก๊ทธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- ์๋ฐ ์ปค๋ฎค๋ํฐ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ก๊น ํ๋ ์์ํฌ์ด๋ค.
๋ก๊ทธ ์ง๊ณ ์์คํ
- ๋ฉํ ์ ๋ณด๋ง ์ธ๋ฑ์ฑํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ก๊ทธ ์ง๊ณ ํด์ ๋นํด ๋ฆฌ์์ค์ ๊ด๋ฆฌ ๋น์ฉ์ด ์ ๋ค.
- Grafana์์ ์ ๊ณตํ๋ ๋ก๊ทธ ์ง๊ณ ํด์ด๊ธฐ ๋๋ฌธ์ Grafana์ ํตํฉํ๊ธฐ ํธ๋ฆฌํ๋ค.
๋ก๊ทธ ์ปจํ ์ธ ๋ฅผ Grafana Loki์๊ฒ ์ ์กํ๋ ์์ด์ ํธ
- Grafana Loki๊ฐ ์ ๊ณตํ๋ ๋ก๊ทธ ์์ง ์์ด์ ํธ๋ก ์๋ก ์์ฑ๋ ๋ก์ปฌ ๋ก๊ทธ๋ฅผ loki์๊ฒ pushํ๋ ์ญํ ์ ํ๋ค.
๋ฉํธ๋ฆญ ๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ฅ
- ๋๋ฒ๊น ์ฉ๋์ ๋ก๊น ๋ฟ๋ง ์๋๋ผ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๋ก๊ทธ & ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ ์๊ฐํ
- ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ง์ํ๊ณ , ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ค.
docker/compose
be_app-docker.compose.yml
be_monitoring-docker-compose.yml
nginx-docker-compose.yml
be_app-docker-compose.yml
์ ๋ก๊น
volumes(์ปจํ
์ด๋์ ํธ์คํธ ์์คํ
๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ & ๋ฐ์ดํฐ ์๊ตฌ ์ ์ฅ ๊ฐ๋ฅ) ์ถ๊ฐ
springboot:
container_name: coduo_springboot-app
...
volumes:
# ๋ก๊ทธ ํ์ผ์ ์ปจํ
์ด๋ ๋ด๋ถ์ /logs ๋๋ ํ ๋ฆฌ๋ก ๋ง์ดํธ
- ${SERVER_LOGS_PATH}/springboot-app:/logs
# ๋ฐฑ์
๋ก๊ทธ ํ์ผ์ /logs/backup ๋๋ ํ ๋ฆฌ๋ก ๋ง์ดํธ
- ${SERVER_LOGS_PATH}/springboot-app/backup:/logs/backup
/logs/springboot-app
๊ฒฝ๋ก์ ๋ค์ด๊ฐ๋ฉด,
backup
debug
error
info
warn
ํด๋๊ฐ ์กด์ฌํ๋ค.
๋ก๊ทธ ๋ ๋ฒจ ๋ณ๋ก ๋ก๊ทธ ํด๋๋ฅผ ๋ถ๋ฅํด ๋์๋ค.
๊ฐ ํด๋์ ๋ค์ด๊ฐ๋ณด๋ฉด ๋ ์ง ๋ณ๋ก ๊ตฌ๋ถ๋์ด ์์ฑ๋ ๋ก๊ทธ ํ์ผ์ ๋ณผ ์ ์๋ค.
๋กํค ๊ตฌ๋์ ํ์ํ ์ค์ ํ์ผ์ loki-config.yml
๋ก ์ ์ํ๋ค.
auth_enabled: false
server:
http_listen_port: 3100 # ๋กํค port
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
chunk_idle_period: 5m
chunk_retain_period: 30s
max_transfer_retries: 0
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 168h
storage_config:
boltdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/cache
shared_store: filesystem
filesystem:
directory: /loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
be_monitoring-docker-compose.yml
์ loki ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ฌ ์ค์นํ๋ค.
loki:
container_name: coduo_loki
image: grafana/loki
# 3100 ํฌํธ๋ก loki ์ ๊ทผ ๊ฐ๋ฅ
ports:
- "3100:3100"
# loki ์ค์ ํ์ผ์ ${your docker data path}/loki/config/loki-config.yml ๋ก ๋ง์ดํธ
volumes:
- ${your docker data path}/loki/config/loki-config.yml:/etc/loki/local-config.yml
networks:
- coduo_net
command: -config.file=/etc/loki/local-config.yaml
ํ๋กฌํ
์ผ ๊ตฌ๋์ ์ํ ์ค์ ํ์ผ์ promtail-config.yml
๋ก ์์ฑํ๋ค.
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yml
clients:
- url: http://coduo_loki:3100/loki/api/v1/push
scrape_configs:
- job_name: springboot-app_info
static_configs:
- targets:
- localhost
labels:
job: info_logs
__path__: /logs/springboo-app/info/*.log # info ํด๋ ๋ด์ log ํ์ผ๋ค ๋ชจ๋ ์์ง
- job_name: springboot-app_warn
static_configs:
- targets:
- localhost
labels:
job: warn_logs
__path__: /logs/springboot-app/warn/*.log # warn ํด๋ ๋ด์ log ํ์ผ๋ค ๋ชจ๋
์์ง
- job_name: springboot-app_error
static_configs:
- targets:
- localhost
labels:
job: error_logs
__path__: /logs/springboot-app/error/*.log # error ํด๋ ๋ด์ log ํ์ผ๋ค ๋ชจ
๋ ์์ง
์ด๋ scrape_configs
๋ฅผ ์๋ชป ๊ธฐ์
ํ๋ฉด ๋ก๊ทธ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋์ง ์์ ์ ์์ผ๋ ์ ๊ฒฝ์จ์ ์์ฑํ๋ค.
์ด์ be_monitoring-docker-compose.yml
์ promtail์ ์ถ๊ฐํ์ฌ ์ค์นํ๋ค.
promtail:
container_name: coduo_promtail
image: grafana/promtail
# 9080 ํฌํธ๋ก promtail ์ ๊ทผ ๊ฐ๋ฅ
ports:
- "9080:9080"
volumes:
# promtail ์ค์ ํ์ผ์ ${your docker data path}/config/promtail-config.yml ๋ก ๋ง์ดํธ
- ${your docker data path}/promtail/config/promtail-config.yml:/etc/promtail/config.yml
# ๋ก๊ทธ ๋๋ ํฐ๋ฆฌ๋ฅผ Promtail์ด ์ ๊ทผํ ์ ์๋๋ก ๋ง์ดํธ
- ${your log data path}/logs:/logs
- ${your docker data path}/promtail/tmp:/tmp
networks:
- coduo_net
command: -config.file=/etc/promtail/config.yml
# loki ์คํ ํ promtail์ด ์์๋๋ค.
depends_on:
- loki
ํ๋ก๋ฉํ
์ฐ์ค ๊ตฌ๋์ ์ํ ์ค์ ํ์ผ์ prometheus.yml
์ ์ ์ํ๋ค.
global:
scrape_interval: 30s
scrape_configs:
- job_name: 'prometheus'
metrics_path: '/actuator/prometheus' # ์คํ๋ง์ ์ถ๊ฐ๋ acturator ๋ชจ๋ํฐ๋ง ๊ฒฝ๋ก
static_configs:
- targets: ['172.19.0.8:8080']
docker compose์ ์ถ๊ฐํ์ฌ ์ค์นํ๋ค.
prometheus:
container_name: coduo_prometheus
image: prom/prometheus
# 9090 ํฌํธ๋ก prometheus ์ ๊ทผ ๊ฐ๋ฅ
ports:
- "9090:9090"
# prometheus ์ค์ ํ์ผ์ ${your docker data path}/prometheus/config/prometheus.yml ๋ก ๋ง์ดํธ
volumes:
- ${your docker data path}/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
networks:
- coduo_net
์ด์ ์์์ ์ค์นํ ๋๊ตฌ๋ค์ด ์์งํ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์กฐํํ ์ ์๋ ๊ทธ๋ผํ๋๋ฅผ ์ค์นํ๋ค. docker-compose์ ์ถ๊ฐํ๋ค.
grafana:
container_name: coduo_grafana
image: grafana/grafana:latest
user: root
# 3001 ํฌํธ๋ก grafana ์ ๊ทผ ๊ฐ๋ฅ
ports:
- "3001:3001"
volumes:
# grafana ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ${your docker data path}/grafana ๋ก ๋ง์ดํธ (๋์๋ณด๋, ์ค์ ๋ฑ์ ์ ์ฅ)
- ${your docker data path}/grafana:/var/lib/grafana
# grafana ์ค์ ํ์ผ์ ${your docker data path}/grafana/config/grafana.ini ๋ก ๋ง์ดํธ
- ${your docker data path}/grafana/config/grafana.ini:/etc/grafana/grafana.ini
environment:
# grafana ์๋ฒ์ ๋ฃจํธ URL ์ ํด๋น ์ฃผ์๋ก ์ค์
- GF_SERVER_ROOT_URL=https://coduo.site/grafana # root url์ ์์์ ์ผ๋ก ๋ณ๊ฒฝ
- GF_SERVER_SERVE_FROM_SUB_PATH=true
networks:
- coduo_net
์ด์ ๋ธ๋ผ์ฐ์ ๋ก ๋ชจ๋ํฐ๋งํด์ ์ ์ํ๋ค.
๋ฐ์ดํฐ ์์ค์ ์์ ์ค์นํ ํ๋ก๋ฉํ ์ฐ์ค, loki๋ฅผ ์ถ๊ฐํ๊ณ ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ค.
๊ทธ๋ผํ๋ ๋งํฌ: https://coduo.site/grafana/
- ๐ ํ๋ก์ ํธ ์๊ฐ
- ๐ ์ฌ์ฉ์ ์๋๋ฆฌ์ค
- โ๏ธ ๊ธฐ๋ฅ ๋ช ์ธ์
- ๐๏ธ ํ ๊ทธ๋ผ์ด๋ ๋ฃฐ
- ๐ ๏ธ ๊ธฐ์ ์คํ
- ๐ ๋ฐฑ์๋ ์ปจ๋ฒค์
- ๐ฅ๏ธ ๋ก๊น &๋ชจ๋ํฐ๋ง
- ๐ CI&CD
- ๐ DB ๊ถํ ์ค์
- ๐งง ์คํค๋ง
- ๐จ ๋๋ฏธ ๋ฐ์ดํฐ ์ฝ์
- ๐ DB ์ฑ๋ฅ ๊ฐ์ ๊ธฐ
- ๐ DB ์ฟผ๋ฆฌ ๋ฐ ์ธ๋ฑ์ค
- ๐งTPS ๋ฐ ํฐ์บฃ & HikariCP ์ค์
- ๐๋ฌด์ค๋จ ๋ฐฐํฌ
- ๐ก ์ฌ์ฉ์ ์์ ๋ฐ๋ ์ ์ง์ ๊ฐ์ ๋ฐฉ์