์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋‚ด ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ & ์‹œ๊ฐํ™” ๊ธฐ์ˆ  ์„ ์ •๊ธฐ (with k6, nGrinder, Grafana)

2024. 4. 2. 01:33ใ†Backend

ํ˜„์žฌ ์ง€์ธ ๋ถ„๋“ค๊ณผ ํ‹ฐ์ผ€ํŒ… ์‚ฌ์ดํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค.

 

GitHub - Tiketeer/Tiketeer-BE

Contribute to Tiketeer/Tiketeer-BE development by creating an account on GitHub.

github.com

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ ์ฃผ์ œ๋Š” ๋ฐ”๋กœ '๋™์‹œ์„ฑ ์ด์Šˆ ํ•ธ๋“ค๋ง'์ธ๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๊ณ„ํš์ด ์žˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด, ํ•ด๋‹น ๊ธ€์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ํˆด ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ• ์ง€ ๊ณ ๋ฏผํ•œ ๊ณผ์ •๊ณผ ์ตœ์ข…์ ์œผ๋กœ ์„ ํƒํ•˜๊ฒŒ ๋œ ํˆด์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

ํ…Œ์ŠคํŒ… ํˆด ์„ ์ • ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ

๋จผ์ € ํ…Œ์ŠคํŒ… ํˆด ์„ ์ • ์‹œ ๊ณ ๋ คํ•œ ์‚ฌํ•ญ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ธฐ๋ณธ์ ์ธ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ ๊ฐ€๋Šฅ์„ฑ
  2. ์„ฑ๋Šฅ (์ถฉ๋ถ„ํ•œ ๋ถ€ํ•˜๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€)
  3. Docker(Compose)๋ฅผ ํ†ตํ•œ ์ž๋™ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์˜ ๊ฐ€๋Šฅ์„ฑ
  4. ๊ด€๋ จ ๋ ˆํผ๋Ÿฐ์Šค
  5. Grafana์™€์˜ ์—ฐ๋™์„ฑ

๊ณ ๋ ค๋  ๋ฐฉ์•ˆ๋“ค์ด ์œ„ ์‚ฌํ•ญ๋“ค์„ ๋ชจ๋‘ ๋งŒ์กฑํ•  ํ•„์š”๋Š” ์—†์œผ๋‚˜ ๋งŽ์ด ๋งŒ์กฑํ• ์ˆ˜๋ก ๊ฐ€์‚ฐ์ ์„ ์ฃผ์—ˆ๋‹ค.

Grafana๋Š” ์™œ?

๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ํˆด์„ ์„ ์ •ํ•˜๋Š”๋ฐ Grafana์™€์˜ ์—ฐ๋™์„ฑ์€ ๋ถˆํ•„์š”ํ•˜์ง€ ์•Š๋ƒ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ , ํƒ€๋‹นํ•œ ์˜๋ฌธ์ด๋‹ค.

๋‹ค๋งŒ ์—ฌ๊ธฐ์—์„œ Grafana๊นŒ์ง€ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์€ ์ดํ›„ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•ด Grafana๋ฅผ ๋„์ž…ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ์‹œ๊ฐํ™” ํˆด์„ ํ™œ์šฉํ•˜์—ฌ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊นŒ์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ํˆด์„ ์„ ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ๋ฐฉํ–ฅ์„ฑ์— ์˜ํ•ด ๊ณ ๋ ค๋˜๋Š” ์‚ฌํ•ญ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐฉ์•ˆ 1. nGrinder

 

nGrinder

Please post questions in Discussions not Issues. nGrinder 3.5.5-p1 version is now available. Check the changes at here. nGrinder is a platform for stress tests that enables you to execute script creation, test execution, monitoring, and result report gener

naver.github.io

nGrinder๋Š” ๋„ค์ด๋ฒ„์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค๋กœ, ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์‹œ๊ฐํ™”๋ฅผ ํ•จ๊ป˜ ๋™์‹œ์— ์ œ๊ณตํ•˜๋Š” ํˆด์ด๋‹ค.

nGrinder๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, Groovy, Jython(Python) ๋“ฑ์ด ์ด์šฉ ๊ฐ€๋Šฅํ•˜์—ฌ ๊ธฐ์กด Java ํ˜น์€ Python์œผ๋กœ ๊ฐœ๋ฐœํ•ด์™”๋˜ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฌด๋ฆฌ ์—†์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์•„๋ž˜ ๋งํฌ์—๋Š” nGrinder์—์„œ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” login ํ…Œ์ŠคํŠธ ์šฉ ์˜ˆ์‹œ Groovy ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ Java ์ฝ”๋“œ๋ผ๊ณ  ํ•ด๋„ ๋ฌด๋ฐฉํ•œ ์ˆ˜์ค€์ด๋‹ค.

 

ngrinder/script-sample/test-with-login/login.groovy at master · naver/ngrinder

enterprise level performance testing solution. Contribute to naver/ngrinder development by creating an account on GitHub.

github.com

nGrinder๋Š” docker-compose๋ฅผ ํ†ตํ•ด ์ž๋™ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜๋Š” ์ง์ ‘ ์ž‘์„ฑํ•œ docker-compose.yml ํŒŒ์ผ์ด๋‹ค.

// docker-compose.yml
services:
  controller:
    image: ngrinder/controller:3.5.5
    restart: always
    ports:
      - 9000:80
      - 16001:16001
      - 12000-12009:12000-12009
    volumes:
      - ./ngrinder-controller:/opt/ngrinder-controller
  agent1:
    image: ngrinder/agent:3.5.5
    restart: always
    links:
      - controller
  agent2:
    image: ngrinder/agent:3.5.5
    restart: always
    links:
      - controller
  agent3:
    image: ngrinder/agent:3.5.5
    restart: always
    links:
      - controller
  agent4:
    image: ngrinder/agent:3.5.5
    restart: always
    links:
      - controller

๊ณต์‹ ํŽ˜์ด์ง€ ์ƒ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ํ˜„์žฌ ๊ฐ€์šฉ ๋ฒ„์ „์€ 3.5.5์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„์ „์„ ์œ„์™€ ๊ฐ™์ด ๋งž์ถฐ์ฃผ์—ˆ๊ณ , ํ…Œ์ŠคํŠธ์— ํ™œ์šฉํ•  agent์˜ ์ˆ˜๋ฅผ 4๋กœ ๋งž์ถฐ์ฃผ๊ธฐ ์œ„ํ•ด agent๋“ค์„ ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•ด์ฃผ์—ˆ๋‹ค. ๊ผญ 4๊ฐœ์ผ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ์„ ์ง€์ •ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฌธ์ œ ์—†๋‹ค.

์œ„์ฒ˜๋Ÿผ docker-compose.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ๋’ค docker-compose up -d ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์–ผ๋งˆ ๋’ค์— localhost:9000์— ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (์ด ๋•Œ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” ์„ค์ •ํ•˜๊ธฐ ๋‚˜๋ฆ„)

localhost:9000/login ์ ‘์†ํ™”๋ฉด

์ดˆ๊ธฐ ID, PW๋Š” ๋ชจ๋‘ admin์ด๋ฉฐ, ์‹ค์ œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ ํ›Œ๋ฅญํ•œ ํ•œ๊ธ€ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋งํฌ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

 

[Test] nGrinder์„ ์ด์šฉํ•œ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ

nGrinder๋กœ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ

velog.io

์ง์ ‘ nGrinder๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ๋’ค ๋Š๋‚€ ์žฅ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋จผ์ € ์…‹์—…์ด ๊ฐ„๋‹จํ•˜๋‹ค. ํ•„์š”ํ•œ ์˜์กด์„ฑ์€ nGrinder๊ฐ€ ๋์ด๊ธฐ ๋•Œ๋ฌธ์—, compose ํŒŒ์ผ์„ ํ†ตํ•ด nGrinder๋ฅผ ์‹คํ–‰์‹œํ‚จ ๋’ค ์‚ฌ์ „์— ์ž‘์„ฑํ•œ or ์‹ ๊ทœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋์ด ๋‚œ๋‹ค.

๋˜ํ•œ ์›น๋ธŒ๋ผ์šฐ์ € UI ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋„ค์ด๋ฒ„์˜ ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค๋ณด๋‹ˆ ํ•œ๊ตญ์–ด ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๊ฝค ๋งŽ๋‹ค๋Š” ์ ๋„ ์žฅ์ ์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‹ค๋งŒ ์•„์‰ฌ์šด ์ ๋„ ์žˆ์—ˆ๋‹ค.

๋จผ์ € nGrinder๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ ๊ธฐ์ค€์œผ๋กœ, ํฐ ๊ทœ๋ชจ์˜ ๋ถ€ํ•˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ์กฐ๊ธˆ๋งŒ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ๊ณง๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ณค ํ–ˆ์—ˆ๋‹ค. ์ข€ ์ฐพ์•„๋ณด๋‹ˆ ์ด๊ฑด ์ž์ฒด UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ํˆด๋“ค์˜ ํ•œ๊ณ„๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๋‘๋ฒˆ์งธ๋Š” ์‹œ๊ฐํ™”์˜ ์•„์‰ฌ์›€์ด๋‹ค. ๋‹ค๋ฅธ ํˆด์— ๋น„ํ•ด nGrinder์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”๋Š” ์ข€ ์•„์‰ฝ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

nGrinder์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ฐฝ

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” Grafana์™€์˜ ์—ฐ๋™์ด ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๋ฌผ๋ก  ์ž์ฒด ์‹œ๊ฐํ™”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์€ ๋งž์ง€๋งŒ ์• ์ดˆ์— ๊ณ ๋ คํ•˜๊ธฐ๋กœ ํ•œ ์‚ฌ์•ˆ์—๋Š” ๋งž์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋‹ค.

 

๋ฐฉ์•ˆ 2. k6 + influxDB + Grafana

 

Load testing for engineering teams | Grafana k6

k6 is an open-source tool and cloud service that makes load testing easy for developers and QA engineers.

k6.io

 

Grafana k6๋Š” Javascript ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ํˆด์ด๋‹ค.

๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์›น๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ UI๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ™์€ ์ด์œ ๋กœ Go ์–ธ์–ด ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์•„๋ž˜๋Š” ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ์ธ๋ฐ, js ์ง€์‹์ด ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฐ”๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์— ์žˆ์–ด ์ง๊ด€์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

import http from 'k6/http'
import { check, sleep } from 'k6'

export default function () {
  const data = { username: 'username', password: 'password' }
  let res = http.post('https://myapi.com/login/', data)

  check(res, { 'success login': (r) => r.status === 200 })

  sleep(0.3)
}

k6๋Š” ์ž์ฒด ์‹œ๊ฐํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์–‘ํ•œ ๊ณณ์— ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ํˆด์„ ์ด์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•˜๋Š” ์„ธํŠธ๊ฐ€ ๋ฐ”๋กœ k6 + InfluxDB + Grafana์ด๋‹ค.

k6์—์„œ ์ˆ˜ํ–‰ํ•œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ InfluxDB๋กœ ๋‚ด๋ณด๋‚ธ ๋’ค, Grafana์—์„œ datasource ์„ค์ •์„ ํ†ตํ•ด InfluxDB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋Œ€์‹œ๋ณด๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ–๋Š”๋‹ค.

์ถœ์ฒ˜: https://grafana.com/grafana/dashboards/2587-k6-load-testing-results/

์ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋งํฌ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

 

Grafana k6์œผ๋กœ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•˜๊ธฐ

k6์œผ๋กœ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Grafana๋กœ ์‹œ๊ฐํ™”ํ•ด๋ณด์ž.

velog.io

ํ•ด๋‹น ๊ตฌ์„ฑ์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณธ ๋’ค ๋Š๋‚€์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์šฐ์„  ๋กœ์ปฌ ๊ธฐ์ค€์œผ๋กœ nGrinder์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, k6๋ฅผ ํ†ตํ•œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ๋งŽ์€ vUser๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์—ˆ๋‹ค. nGrinder์—์„œ 4๊ฐœ์˜ agent์— ๊ฐ๊ฐ 200๊ฐœ์˜ vUser๋ฅผ ํ• ๋‹นํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด๋ณธ ๊ฒƒ์ด ์ตœ๋Œ€์ธ ๋ฐ˜๋ฉด, k6์—์„œ๋Š” vUser๊ฐ€ 1000์ธ ์ƒํ™ฉ์—์„œ๋„ ๋„ˆ๋ˆํžˆ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

๋˜ํ•œ ๋Œ€์‹œ๋ณด๋“œ์— ์ถœ๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ๋‹ค์ฑ„๋กญ๊ณ  ๋ˆˆ์— ์ž˜ ๋“ค์–ด์˜จ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ ˆํผ๋Ÿฐ์Šค ๋˜ํ•œ nGrinder ๋งŒํผ์€ ์•„๋‹ˆ๋ผ๋„, ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์ž˜๋˜์–ด์žˆ์–ด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„์‰ฌ์šด ์ ๋„ ์žˆ์—ˆ๋‹ค.

์ด ๊ตฌ์„ฑ์—์„œ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ ˆํผ๋Ÿฐ์Šค ๋Œ€๋ถ€๋ถ„์ด InfluxDB - Grafana ์—ฐ๋™์„ ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ๋„ˆ๋ฌด ํฐ ์†Œ์š”๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด ์ž๋™ํ™” ๋ฐฉ์•ˆ์„ ๋ฆฌ์„œ์น˜ํ–ˆ๋‹ค. Grafana์˜ Provisioning ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ–ˆ๋Š”๋ฐ, ์ง์ ‘ ํ•ด๋ณด๊ณ  ์•Œ๊ฒŒ ๋œ ๊ฒฐ๋ก ์€ "๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค" ์˜€๋‹ค. ์ด๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Grafana - InfluxDB๋ฅผ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” InfluxDB ์ธก์—์„œ accessToken์„ ์ง์ ‘ ๋ฐœ๊ธ‰ ํ›„ ์ด๋ฅผ Provisioning ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์ง์ ‘ InfluxDB๋ฅผ ๋งŒ์ ธ์•ผํ•˜๋Š” ์†Œ์š”๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฒฐ๊ตญ ์ž๋™ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐฉ์•ˆ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋งŽ์ด ๋‚ฎ์ถœ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.

 

๋ฐฉ์•ˆ 3. k6 + Prometheus + Grafana

์•ž์„  ๋ฐฉ์•ˆ 2์˜ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€, InfluxDB ๋Œ€์‹  Prometheus๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์„ฑ์ด ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์ธ ๋ฆฌ์„œ์น˜๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์—์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฒฐ๊ตญ '์–ด๋–ค ํˆด๋กœ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š๋ƒ' ์™€ '์–ด๋–ค ํˆด๋กœ ์‹œ๊ฐํ™” ํ•˜๋Š๋ƒ' ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” InfluxDB๊ฐ€ Prometheus๋กœ ๋ฐ”๋€Œ๋Š” ๊ฑด ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์€ "์ž๋™ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค" ์˜€๋‹ค.

Grafana์˜ Provisioning์„ ํ†ตํ•ด ํ•จ๊ป˜ ๋„์šธ Prometheus ์ปจํ…Œ์ด๋„ˆ๋ฅผ datasource๋กœ ์‚ฌ์ „์— ๋“ฑ๋กํ•ด์ฃผ๊ณ  ์ด๋ฅผ ์‹œ๊ฐํ™”ํ•  dashboard๋งŒ ๊ตฌ์„ฑํ•ด์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ฐ€๋Šฅํ•ด ๋ณด์˜€๋‹ค. 

๋‹ค๋งŒ, ์ด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์ง์ ‘ ์ปดํฌ์ฆˆ ํŒŒ์ผ์„ ์ž‘์„ฑํ–ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์—์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

k6 + Prometheus + Grafana ์ž๋™ ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ (with Docker-compose)

k6๋ฅผ ํ†ตํ•˜๋ฉด ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ js ๊ธฐ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ์†์‰ฝ๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ k6๋Š” ๋‹จ์ˆœ ํ…Œ์ŠคํŠธ ๋งŒ์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์‹œ๊ฐํ™” ๊ตฌ์„ฑ์„ ์ง„ํ–‰ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ตฌ๊ธ€๋ง์„ ํ•ด

one-armed-boy.tistory.com

ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๊ตฌ์„ฑ๋˜๋Š” ๋Œ€์‹œ๋ณด๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ด ๋ฐฉ์‹์€ k6๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ์ ์ธ ์ด์  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ปดํฌ์ฆˆ ํŒŒ์ผ์„ ํ†ตํ•œ ์ž๋™ํ™”๋„ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

๋‹ค๋งŒ ํ•œ๊ฐ€์ง€ ์•„์‰ฌ์šด ์ ์€ InfluxDB๋ฅผ ํ†ตํ•œ Grafana ๋Œ€์‹œ๋ณด๋“œ์— ๋น„ํ•ด ์ด ์ชฝ์ด ์กฐ๊ธˆ ๋” ์ดˆ๋ผ(?)ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

 

๊ฒฐ๋ก 

์œ„์—์„œ ๊ณ ๋ คํ•œ ๋ฐฉ์•ˆ๋“ค์˜ ํŠน์ง•์„ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  nGrinder k6 + InfluxDB + Grafana k6 + Prometheus + Grafana
ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ ์šฉ์ด์„ฑ Java์™€ ์œ ์‚ฌํ•œ Groovy๋ฅผ ํ†ตํ•ด ์†์‰ฝ๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ Js๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ Js๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
์„ฑ๋Šฅ k6์™€ ๋น„๊ตํ•˜์—ฌ ๋” ๋‚ฎ์€ ์„ฑ๋Šฅ nGrinder์™€ ๋น„๊ตํ•˜์—ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ nGrinder์™€ ๋น„๊ตํ•˜์—ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ
Docker๋ฅผ ํ†ตํ•œ ์ž๋™ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ ์ปดํฌ์ฆˆ ํŒŒ์ผ์„ ํ†ตํ•ด ์ž๋™ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ (InfluxDB - Grafana ์—ฐ๋™์— ์žˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ์ž…ํ•ด์•ผ ํ•  ํ•„์š” ์กด์žฌ) ์ปดํฌ์ฆˆ ํŒŒ์ผ์„ ํ†ตํ•ด ์ž๋™ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
๋ ˆํผ๋Ÿฐ์Šค ํ•œ๊ธ€ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์Œ ๊ณต์‹๋ฌธ์„œ, ํ•ด์™ธ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์Œ ๊ณต์‹๋ฌธ์„œ, ํ•ด์™ธ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์Œ
Grafana ์—ฐ๋™์„ฑ ๋ถˆ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ตœ์ข…์ ์œผ๋กœ 

k6 + Prometheus + Grafana๋ฅผ ์„ ํƒํ•˜์˜€๋‹ค.

๊ฐ€์žฅ ๋งˆ์Œ์— ๋“ค์—ˆ๋˜ ์ง€์ ์€ ์„ฑ๋Šฅ์ด ์ค€์ˆ˜ํ•˜๋ฉด์„œ๋„,

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ณผ์ •์„ docker-compose up ๋ช…๋ น์–ด ํ•˜๋‚˜๋กœ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ .