2024. 4. 2. 16:43ใBackend
k6๋ฅผ ํตํ๋ฉด ๋ถํํ ์คํธ๋ฅผ js ๊ธฐ๋ฐ ์คํฌ๋ฆฝํธ๋ก ์์ฝ๊ฒ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
๋ค๋ง k6๋ ๋จ์ ํ ์คํธ ๋ง์ ์ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์๊ฐํ ๊ตฌ์ฑ์ ์งํํด์ผ ํ ํ์๊ฐ ์๋ค.
์ด๋ฅผ ์ํด ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ฉด, ๋๋ถ๋ถ์ ๋ ํผ๋ฐ์ค์์ ์๋์ผ๋ก ์ด๋ฅผ ๊ตฌ์ฑํ๋ค. (Grafana UI์ ์ ์ํด์ Datasource, Dashboard๋ฅผ ์ง์ ๋ฑ๋กํ๋ ์)
๋ฐ๋ผ์ ๋ถํ ํ ์คํธ๋ฅผ ์งํํ๊ณ ์ ํ๋ ๋ชจ๋๊ฐ ๋ฐฉ๋ฒ์ ์์งํด์ผ ํ๋ค๋ ๊ฒ์ธ๋ฐ, ๊ฐ์ธ์ ์ผ๋ก ์ด๋ ๋นํจ์จ์ ์ด๋ผ ์๊ฐํ์ฌ ๋ถํ ํ ์คํธ + ์๊ฐํ๋ฅผ ํ๋ฒ์ ์งํํ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ ์ ํ๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ก์ปฌ PC์ ์ด๊ฒ์ ๊ฒ ์ค์นํ๋ ๊ฒ์ ์ ํธํ์ง ์์์, ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ docker-compose ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์๋ค.
Docker-compose.yml
version: "3.8"
services:
grafana:
image: grafana/grafana
ports:
- 3000:3000
volumes:
- ./grafana-provisioning:/etc/grafana/provisioning
- ./grafana-dashboard:/dashboard
depends_on:
- prometheus
prometheus:
image: prom/prometheus
ports:
- 9090:9090
command:
- --web.enable-remote-write-receiver
- --enable-feature=native-histograms
- --config.file=/etc/prometheus/prometheus.yml
k6:
image: grafana/k6
volumes:
- ./k6-scripts:/scripts
command: run -o experimental-prometheus-rw /scripts/stress.js
environment:
- K6_PROMETHEUS_RW_SERVER_URL=http://prometheus:9090/api/v1/write
- K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- prometheus
์์ฑํ docker-compose.yml ํ์ผ์ ์์ ๊ฐ๋ค.
๋์ปค ์ด๋ฏธ์ง๋ ๋ชจ๋ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์๋ค.
๊ฐ ์๋น์ค์ ๋ํ ์ค๋ช ์ ๋ง๋ถ์ด์๋ฉด ์๋์ ๊ฐ๋ค.
grafana ์๋น์ค
grafana:
image: grafana/grafana
ports:
- 3000:3000
volumes:
- ./grafana-provisioning:/etc/grafana/provisioning
- ./grafana-dashboard:/dashboard
depends_on:
- prometheus
Grafana์ ์ ์ํด์ datasource, dashboard ์ค์ ์ ์ง์ ํ์ง ์๊ธฐ ์ํด Grafana์ Provisioning ๊ธฐ๋ฅ์ ํ์ฉํ๋ค.
์ด๋ฅผ ์ํด ๋ณผ๋ฅจ์ ํตํด provisioning ํ์ผ๊ณผ ๋์๋ณด๋ ์ฉ ํ์ผ์ ๊ณต์ ํด์ผ ํ๋ค. ๊ฐ ํด๋ ๊ฒฝ๋ก์ ํฌํจ๋์ด์ผ ํ๋ ํ์ผ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
// dashboards.yml
apiVersion: 1
providers:
- name: "k6 Stress Test"
orgId: 1
folder: ""
type: file
disableDeletion: false
updateIntervalSeconds: 10
options:
path: /dashboard/k6.json
foldersFromFilesStructure: true
// prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
์ถ๊ฐ์ ์ผ๋ก k6.json ํ์ผ๋ ์์ฑํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๋ ์๋ ๋งํฌ์์ ์ฐ์ธก์ Download JSON ๋ฒํผ์ ํตํด ๋ด๋ ค ๋ฐ์ ์ ์๋ ํ์ผ์ ๋ด์ฉ์ ๋ณต๋ถํ๋ฉด ๋๋ค.
prometheus ์๋น์ค
prometheus:
image: prom/prometheus
ports:
- 9090:9090
command:
- --web.enable-remote-write-receiver
- --enable-feature=native-histograms
- --config.file=/etc/prometheus/prometheus.yml
k6๋ฅผ ํตํด ํ๋ํ ๊ฒฐ๊ณผ๋ฅผ Prometheus์ ์ ๋ฌํ๊ธฐ ์ํด์๋ Prometheus์ remote-write ๊ธฐ๋ฅ์ ํ์ฉํด์ผ ํ๋ค. ๋ํ ๊ณ ํด์๋ ์๊ฐํ๋ฅผ ์ํด์๋ native-histograms๋ ํ์ํ๋ค. command์ ๋ด์ฉ๋ค์ ์ด๋ค์ ์ค์ ํ ๋ค Prometheus๋ฅผ ์คํ์ํค๋ ๋ด์ฉ๋ค์ด๋ค.
k6 ์๋น์ค
k6:
image: grafana/k6
volumes:
- ./k6-scripts:/scripts
command: run -o experimental-prometheus-rw /scripts/stress.js
environment:
- K6_PROMETHEUS_RW_SERVER_URL=http://prometheus:9090/api/v1/write
- K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- prometheus
์ ๊ตฌ์ฑ์์ k6๋ ๋ก์ปฌ์ ๋ค์ด ๋ฐ์๋ ๋์ง๋ง ๊ฐ์ธ์ ์ธ ์ ํธ์ ์ํด ์ด ๋ํ ๋์ปค ์ปจํ ์ด๋๋ก ์คํ์์ผฐ๋ค. ์คํ์ํฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ปจํ ์ด๋์ ์ ๊ณตํ๊ธฐ ์ํด ๋ณผ๋ฅจ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉฐ ์๋์ฒ๋ผ ์์ฑ์ด ํ์ํ๋ค.
stress.js ํ์ผ์๋ ์ค์ ๋ถํํ ์คํธ๋ฅผ ์ํ ๋ด์ฉ์ด ํฌํจ๋๋ฉด ๋๋ค.
์ด ๋ extra_hosts ์ต์ ์ ์ค ์ด์ ๋, ๋ถํํ ์คํธ ๋ก์ง์์ localhost์ ๋์์ง ์๋ฒ์ host.docker.internal ๊ฒฝ๋ก๋ก ์ ๊ทผํ๊ธฐ ์ํจ์ด๋ค. ๋ง์ฝ ํ ์คํธํ ์๋ฒ๋ ํจ๊ป ์ปจํ ์ด๋๋ก ์คํ์ํค๋ ์ํฉ์ด๋ผ๋ฉด extra_hosts ์ต์ ์ ๋นผ์ฃผ์ด๋ ๋๋ค.
์คํ ๋ฐ ๊ฒฐ๊ณผ
๋จ์ํ docker-compose up ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋๋ค.
์ด๋ฅผ ์คํํ๋ฉด k6๊ฐ ๊ฐ๋ณ ์ปจํ ์ด๋์์ ๋ถํํ ์คํธ๋ฅผ ์งํํ๊ณ , ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ค์ด Prometheus - Grafana ํ๋ฆ์ผ๋ก ์ ๋ฌ๋๋ค. ๊ทธ ํ localhost:3000์ ์ ์, ๋ก๊ทธ์ธ์ ํด์ฃผ๊ณ (id: admin, pw: admin, ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์ฐฝ์ skip) ๋์๋ณด๋ ์ชฝ์ ๋ค์ด๊ฐ๋ณด๋ฉด ์๋์ฒ๋ผ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค!
Code Repository
'Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฌ์ด๋ ํ๋ก์ ํธ ๋ด ๋ถํํ ์คํธ & ์๊ฐํ ๊ธฐ์ ์ ์ ๊ธฐ (with k6, nGrinder, Grafana) (0) | 2024.04.02 |
---|