OSํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋ชจ๋ํฐ๋ง ๊ตฌ์ถ์ ์๊ฐํ๋ ๊ธ์ ๋๋ค.
Docker-compose, Actuator, ํ๋ก๋ฉํ ์ฐ์ค, ๊ทธ๋ผํ๋์ ๋ํ ๊ธฐ๋ณธ ์ค๋ช ๊ณผ ๋ชจ๋ํฐ๋ง ์ํคํ ์ฒ์ ๋ํ ์ค๋ช ์ ํ์ง ์๊ณ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ๋ง ์๊ฐํฉ๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค & ๊ทธ๋ผํ๋ ๋์ ์๊ฐ
Jmeter ๋ฅผ ์ฌ์ฉํด์ ์ฌ์ด๋ ํ๋ก์ ํธ์ ๋ถํํ ์คํธ๋ฅผ ์งํํด๋ณด๋ ค๊ณ ๊ณํ์ค์ ๋๋ค.
์ด๋ค ๋ถํํ ์คํธ๋ฅผ ์์ํ์ ๋ ํฐ์บฃ์ ์ฐ๋ ๋ ํ์ ๋ฌธ์ ์ธ์ง, DB ์ปค๋ฅ์ ํ์ด ๋ฌธ์ ์ธ์ง, ๋ด ๋ ธํธ๋ถ CPU ๋ฌธ์ ์ธ์ง, ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ์ธ์ง๋ฅผ ํ์ธํ๊ณ ์ถ์๊ณ ํด๋น ๋ฌธ์ ์ ๋ง๊ฒ ํด๊ฒฐ์ ํ๊ณ ์ถ์์ต๋๋ค.
์คํ๋ง๋ถํธ์์ ์ง์ํ๋ ๊ฐ๋จํ ๋ชจ๋ํฐ๋ง ๋ชจ๋์ธ Actuator ๋ ๋ฉํธ๋ฆญ(์งํ)๋ค์ด ์ ์ฅ์ด ๋์ง ์๋ ์ ๊ณผ ๋ชจ๋ํฐ๋ง ์๋ฒ๋ฅผ ์ค์ ์ด์ํ๋ ๊ฒ์ฒ๋ผ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ํ๋ก๋ฉํ ์ฐ์ค & ๊ทธ๋ผํ๋๋ฅผ ํ๋ก์ ํธ์ ๋์ ํ๊ธธ ์ ํํ์์ต๋๋ค.
Docker-compose ๋์ ์๊ฐ
ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ก์ปฌ OS์ ๋ง๋ ํ์ผ์ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ ์งํํ๋ฉด ๋ฐฐํฌํ์ ๋ ์ญ์, ๋๊ฐ์ ๊ณผ์ ์ 2๋ฒ ๊ฑฐ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ ํ์ ๋ชจ๋ํฐ๋ง ์๋ฒ ์ญ์ docker ๋ฅผ ์ฌ์ฉํ๊ณ ์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๋ฌถ์ด์ ๋์ธ ์ ์๋ Docker์ compose ๊ธฐ๋ฅ์ ๋์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์์ต๋๋ค.
ํ ์ปจํ ์ด๋์ ํ๋์ image ๋ฅผ ๋์ฐ๋ docker ํน์ฑ ์ ๋ก์ปฌ ํ๊ฒฝ์์ Mysql, redis ๋ ์ปจํ ์ด๋๋ก ๋์์ ๊ฐ๋ฐ์ ์งํํ๊ณ ์์์ต๋๋ค. ๊ทธ๋์ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๋์ธ ์ ์๋ docker-compose ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์์ต๋๋ค.
๋ก์ปฌ ์๋ฒ์ ํ๋ก๋ฉํ ์ฐ์ค ์ฐ๋ ๊ณผ์
1. build.gradle ์ Actuator ์ micrometer ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
Boot ๊ฐ dependency-management ๋ plug-in ์ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ์๋์ผ๋ก ๊ด๋ฆฌํด์ค๋ค๋ ๊ฐ์ ํ์ ๋ฒ์ ๋ช ์ ์์ด ์์กด์ฑ์ ์ถ๊ฐํด์ค๋๋ค.
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
2๋ฒ ์งธ ์์กด์ฑ์ ๋ชจ๋ํฐ๋ง ํด๋ง๋ค ๋ฉํธ๋ฆญ์ ํฌ๋งท(์์)์ด ๋ค๋ฅธ๋ฐ, ์ด micrometer ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ก๋ฉํ ์ฐ์ค ํด์ด ์ฌ์ฉํ๋ ๋ฉํธ๋ฆญ ํฌ๋งท์ ๋ง์ถฐ ๋ฉํธ๋ฆญ์ ๋ณ๊ฒฝ์์ผ ์ค๋๋ค.
micrometer ๋ฅผ ์ธํฐํ์ด์ค, ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ๊ตฌํ์ฒด๋ผ ์๊ฐํ์๋ฉด ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ๊ตฌํ์ฒด๋ก๋ ์คํ๋ง์ Actuator ๋ฑ๋ฑ์ด ์์ต๋๋ค.
2. application.yml ์ Spring Actuator ์๋ํฌ์ธํธ ์ถ๊ฐ
- Spring Actuator ์ ์๋ํฌ์ธํธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ ๋์ด์๊ธฐ ๋๋ฌธ์ ๋
ธ์ถํ๊ณ ์ถ์ ์๋ํฌ์ธํธ์ ๋
ธ์ถ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ณ , ์ ๋ ๋ชจ๋ ์๋ ํฌ์ธํธ์ ๋
ธ์ถ์ ๊ฒฐ์ ํ์ต๋๋ค.
- ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์ ์ฅํ ๋ฉํธ๋ฆญ๋ค์ Spring Actuator ๋ฅผ ํตํด ์์งํ๊ธฐ ๋๋ฌธ์ ์๋ํฌ์ธํธ๋ค์ ๋ ธ์ถํด์ค๋๋ค.
- ์ก์ธ์์ดํฐ์ ๋ณด์์ ๋์ด๊ธฐ ์ํด ์ก์ธ์์ดํฐ์ ํฌํธ๋ฅผ 8080ํฌํธ ์์ 9292ํฌํธ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
- AWS ๋ฅผ ์ฌ์ฉํด์ ๋ฐฐํฌํ์ ๋๋ฅผ ๊ณ ๋ ค, EC2์ ์ธ๋ฐ์ด๋์ 9292ํฌํธ๋ ํ์ฉํ์ง ์๋๋ก ํฉ๋๋ค.
- ์ ๋ ๋ชจ๋ ์๋ํฌ์ธํธ๊ฐ HTTP ๋ฅผ ์ด์ฉํ ์น์ ๋ ธ์ถ๋๊ธธ ์ํ๊ณ , ํฐ์บฃ ์ฐ๋ ๋ ํ์ ์ต๋ ์ฐ๋ ๋ ์, ์ฌ์ฉ ์ฐ๋ ๋ ์๋ ๋ณด๊ธฐ ์ํด #ํฐ์บฃ ๊ด๋ จ ๋ฉํธ๋ฆญ์ ์ถ๊ฐํ์์ต๋๋ค.
management:
endpoints:
web:
exposure:
include: "*"
# ์ก์ธ์์ดํฐ ํฌํธ ๋ณ๊ฒฝ
server:
port: 9292
# ํฐ์บฃ ๊ด๋ จ ๋ฉํธ๋ฆญ
server:
tomcat:
mbeanregistry:
enabled: true
3. prometheus.yml ์ ์์ฑ
์ด๋ค IP ์ ํฌํธ๋ฅผ ํตํด ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉํธ๋ฆญ์ ์์งํด์ผ ํ ์ง prometheus.yml ์ ํตํด ํ๋ก๋ฉํ ์ฐ์ค ์๋ฒ์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ์ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์๋ Docker ํ์ผ๋ค๊ณผ Git ํ์ผ, ํ๊ฒฝ๋ณ์ ํ์ผ๋ค์ด ์์๊ธฐ ๋๋ฌธ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ ํ์์ monitoring ์ด๋ผ๋ customํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด yml ํ์ผ์ ์์ฑํด์ฃผ์์ต๋๋ค.(/monitoring/prometheus.yml)
๋ง์ฝ ์ ์ฒ๋ผ, prometheus.yml ํ์ผ ์์น๋ฅผ custom ํ๊ฒ ํ ๊ฒฝ์ฐ, docker-compose.yml ์์ฑ ์ prometheus.yml ํ์ผ ์์น๋ฅผ ๋ช ์ ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ํด๋น ์ฝ๋๋ฅผ yml ์ ๋ฃ์ต๋๋ค.
14๋ผ์ธ์ด์ ์ ๋ด์ฉ์ ๋ก์ปฌ์ ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ ์ค์นํ์ ๋์ prometheus.yml ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฐ๊พธ์ง ์์ต๋๋ค.
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"] << 14๋ผ์ธ
- job_name: "spring-actuator" // ์์งํ๋ ์ด๋ฆ์ผ๋ก ์์์ ์ด๋ฆ
metrics_path: '/actuator/prometheus' // ์์งํ ๊ฒฝ๋ก๋ฅผ ์ง์
scrape_interval: 1m // ์์งํ ์ฃผ๊ธฐ๋ฅผ ์ค์ 1m์ 1๋ถ, 1s๋ 1์ด
static_configs:
- targets: ['host.docker.internal:9292'] // ์์งํ ์๋ฒ์ IP, PORT ๋ฅผ ์ง์ , application.yml ์ ํฌํธ๋ฅผ 9292๋ก ์ง์ ํ์
- -job name:
- Spring Actuator ๋ ํ๋ก๋ฉํ ์ฐ์ค ๊ด๋ จ ๋ฉํธ๋ฆญ์ ์์งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ด ๋ฉํธ๋ฆญ์ /actuator/prometheus ๊ฒฝ๋ก๋ก ๋ณผ ์ ์๊ณ , ์ด ๊ฒฝ๋ก์ ์๋ ๋ฉํธ๋ฆญ์ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ์์งํ๋ฉฐ ํ๋ก๋ฉํ ์ฐ์ค์ ๋ฉํธ๋ฆญ ์์ง ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
- targets:
- ํ๋ก๋ฉํ ์ฐ์ค๋ฅผ docker ๋ก ๋์ ์ ๋, ์ฌ์ฉ์ ์ปดํจํฐ์ docker ์ปจํ ์ด๋์ ๋คํธ์ํฌ๋ ์๋ก ๋ค๋ฅธ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
- ์ด ๋, ๋์ปค ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ก์ปฌํธ์คํธ๋ก ์์ฒญ์ ๋ณด๋ผ ๋์ ๋๋ฉ์ธ์ localhost ๊ฐ ์๋ host.docker.internal ๋ก ํด์ฃผ์ด์ผ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ก์ปฌ ํธ์คํธ๋ก ์์ฒญ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
4. docker-compose.yml ์์ฑ
- volumes:
- prometheus.yml ๊ฐ ์๋ ๊ฒฝ๋ก๋ฅผ ๋์ปค ์ปจํ ์ด๋์ /etc/prometheus/prometheus.yml ์ ๋ง์ดํธ๋ฅผ ํด์ ๋์ปค ์ปจํ ์ด๋์์๋ ํ์ผ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
- ports:
- ํฌํธ ํฌ์๋ฉ์ ํ๋ก๋ฉํ ์ฐ์ค์ ๊ธฐ๋ณธ ํฌํธ์ธ 9090์ผ๋ก ์งํํฉ๋๋ค.
services:
airdnb-prometheus:
image: prom/prometheus
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml # ./monitoring/prometheus.yml ์ prometheus.yml ํ์ผ์ ๊ฒฝ๋ก ์ง์
ports:
- 9090:9090
5. ์คํ
- docker compose up -d ๋ช ๋ น์ด๋ฅผ ์น๊ฑฐ๋ docker-compose.yml ์ ํ๋ก๋ฉํ ์ฐ์ค ์ปจํ ์ด๋ ์คํ๋ฒํผ์ ๋๋ฆ ๋๋ค.
- localhost:9090 ์ ์ ์ํ์ฌ Status ๋ชฉ๋ก์ Targets ๋์์ ํ๋ก๋ฉํ ์ฐ์ค๊ฐ ๋ถํธ์ ์ ์ฐ๊ฒฐ๋์๋์ง ํ์ธํฉ๋๋ค.
- localhost:9292/actuator ์ ์ ์ํ์ฌ Actuator์ ๋ฉํธ๋ฆญ๋ค์ HTTP๋ก ํ์ธ ํ ์ ์๋์ง๋ ํ์ธํฉ๋๋ค.
ํ๋ก๋ฉํ ์ฐ์ค์ ๊ทธ๋ผํ๋ ์ฐ๋ ๊ณผ์
1. docker-compose.yml ์ ๊ทธ๋ผํ๋ ์ปจํ ์ด๋ ์ถ๊ฐ
ymlํ์ผ์ image ์ port ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ผํ๋์ ๊ธฐ๋ณธ ํฌํธ๋ 3000 ์ ๋๋ค.
services:
airdnb-local-prometheus:
image: prom/prometheus
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 9090:9090
# ์ถ๊ฐ
airdnb-local-grafana:
image: grafana/grafana
ports:
- 3000:3000
2. ๊ทธ๋ผํ๋์ ํ๋กํ ๋ฉ์ฐ์ค DataSource ์ถ๊ฐํ๊ธฐ
- localhost:3000 ์ ์ ๋ ฅํด์ ๊ทธ๋ผํ๋์ ์ ์
- ID : admin , PW : admin ์ผ๋ก ๊ทธ๋ผํ๋์ ๋ก๊ทธ์ธ
- Home > Connections > Data sources > prometheus ์ ์ ์ํฉ๋๋ค.
- ์๋ ์ฌ์ง์ Connection ์๋ http://localhost:9090 ์ด ์๋ http://host.docker.internal:9090 ์ ์
๋ ฅํฉ๋๋ค.(์ฌ์ง 4)
- ๊ทธ๋ผํ๋๋ ๋์ปค๋ก ๋์ ๊ธฐ ๋๋ฌธ์ ๋์ปค ๋ด๋ถ์์ host ๋ก 9090 ํฌํธ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด host 9090 ํฌํธ์ ์ฐ๊ฒฐ๋ ํ๋ก๋ฉํ ์ฐ์ค์๊ฒ ์ฐ๊ฒฐ์ด ๋์ฐฉํ๊ฒ ๋ฉ๋๋ค.(์ฌ์ง 5)
host.docker.internal ๋ฅผ ์ฌ์ฉํด์ localhost๋ก ๋งคํ๋๋๊ฑด windows ๋๋ mac์์๋ง ๊ฐ๋ฅํ๊ณ linux์์๋ ๋์ปค ๋ฒ์ Docker-for-Linux 20.10.0+ ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
* ์ฐธ๊ณ
From inside of a Docker container, how do I connect to the localhost of the machine?