DevOps/Grafana

[Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6)

기록하는 백앤드개발자 2024. 10. 31. 10:10
반응형

ㅁ 관련글

[Node.js] PM2를 사용한 Node.js 관리하기(PM2 사용법 정리)
[Docker] Docker와 pm2를 함께 사용하는 것이 불리한 이유
[Docker] Express 서버를 Docker에서 PM2로 기동하는 방법

[Grafana] grafana k6로 테스트 환경 구성(grafana, influxdb, k6)

 

ㅁ 들어가며

ㅇ Grafana k6를 사용하여 부하 테스트를 수행하는 방법을 로컬과 Docker를 이용하는 방법을 정리하였다.

ㅇ 로컬에서 k6를 설치하여 부하를 주는 방법과 Docker-compose로 k6, influxDB, grafana를 생성하여 테스트 환경을 세팅하는 과정을 정리하였다.

 

ㅁ k6 로컬 설치 방법

   brew install k6  # macOS
   choco install k6  # Windows

ㅇ 로컬에서 테스트하는 경우 설치 방법이다.

ㅁ 테스트 스크립트 작성

   import http from 'k6/http';
   import { sleep } from 'k6';

   export const options = {
     vus: 10,
     duration: '30s',
   };

   export default function () {
     http.get('http://test.k6.io');
     sleep(1);
   }

ㅇ script.js 작성

ㅇ 10명의 클라이언트 들이 30초 동안 부하를 발생시킨다.

 

ㅁ 테스트 실행

   k6 run script.js

 

ㅁ Docker를 이용한 테스트 방법

$ docker run --rm -i grafana/k6 run --vus 1000 --duration 20s - < script.js

         /\      Grafana   /‾‾/
    /\  /  \     |\  __   /  /
   /  \/    \    | |/ /  /   ‾‾\
  /          \   |   (  |  (‾)  |
 / __________ \  |_|\_\  \_____/

     execution: local
        script: -
        output: -

     scenarios: (100.00%) 1 scenario, 1000 max VUs, 50s max duration (incl. graceful stop):
              * default: 1000 looping VUs for 20s (gracefulStop: 30s)


running (01.0s), 1000/1000 VUs, 0 complete and 0 interrupted iterations
default   [   5% ] 1000 VUs  01.0s/20s

~~~~~

running (20.0s), 1000/1000 VUs, 18238 complete and 0 interrupted iterations
default   [ 100% ] 1000 VUs  20.0s/20s

     data_received..................: 4.6 MB 226 kB/s
     data_sent......................: 1.6 MB 79 kB/s
     http_req_blocked...............: avg=42.01ms min=583ns    med=1.83µs max=3.12s   p(90)=5.04µs  p(95)=22.02ms
     http_req_connecting............: avg=41.99ms min=0s       med=0s     max=3.12s   p(90)=0s      p(95)=21.99ms
     http_req_duration..............: avg=10.57ms min=401.58µs med=5.23ms max=94.3ms  p(90)=24.53ms p(95)=30.82ms
       { expected_response:true }...: avg=10.57ms min=401.58µs med=5.23ms max=94.3ms  p(90)=24.53ms p(95)=30.82ms
     http_req_failed................: 0.00%  0 out of 19238
     http_req_receiving.............: avg=20.12µs min=4.08µs   med=11.7µs max=3.57ms  p(90)=34.5µs  p(95)=52.26µs
     http_req_sending...............: avg=83.72µs min=1.41µs   med=4.08µs max=43.11ms p(90)=29.92µs p(95)=97.71µs
     http_req_tls_handshaking.......: avg=0s      min=0s       med=0s     max=0s      p(90)=0s      p(95)=0s
     http_req_waiting...............: avg=10.47ms min=383.87µs med=5.19ms max=63.29ms p(90)=24.44ms p(95)=30.76ms
     http_reqs......................: 19238  944.835741/s
     iteration_duration.............: avg=1.05s   min=1s       med=1s     max=4.14s   p(90)=1.02s   p(95)=1.06s
     iterations.....................: 19238  944.835741/s
     vus............................: 1000   min=1000       max=1000
     vus_max........................: 1000   min=1000       max=1000


running (20.4s), 0000/1000 VUs, 19238 complete and 0 interrupted iterations
default ✓ [ 100% ] 1000 VUs  20s

ㅇ client 1000명이 20초동안 부하 발생시킨다.

ㅇ 10초 단위로 1000명의 클라이언트가 수행된다.

ㅇ 수행 후 결과를 확인할 수 있다.

ㅇ 지금까지 로컬환경에서 간단히 테스트 하는 방법이었다.

 



docker-compose를 이용한 k6+ influxDB + grafana 구성 방법을 정리해 보자.

 

ㅁ docker compose 설치

# git clone
$ git clone https://github.com/grafana/k6 && cd k6

# update submodule
$ git submodule update --init

# influxdb grafana만 실행
$ docker compose up -d influxdb grafana

ㅇ git clone

ㅇ docker compose up

 

version: '3.4'

networks:
  k6:
  grafana:

services:
  influxdb:
    image: influxdb:1.8
    networks:
      - k6
      - grafana
    ports:
      - "8086:8086"
    environment:
      - INFLUXDB_DB=k6

  grafana:
    image: grafana/grafana:9.3.8
    networks:
      - grafana
    ports:
      - "3000:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_BASIC_ENABLED=false
    volumes:
      - ./grafana:/etc/grafana/provisioning/

  k6:
    image: grafana/k6:latest
    networks:
      - k6
    ports:
      - "6565:6565"
    environment:
      - K6_OUT=influxdb=http://influxdb:8086/k6
    volumes:
      - ./examples:/scripts

ㅇ 참고로  docker-compose.yml이다.

ㅇ grafana는 Admin권한으로 아무나 쓸 수 있다.

 

ㅁ Grafana 로그인

ㅇ localhost:3000으로 접근하여 admin/admin으로 로그인한다. 

ㅇ admin의 비번을 변경하면 메인 화면으로 이동한다.

 

ㅁ Grafana Dashboard 생성

ㅇ Browse를 클릭하여 이동

ㅇ New를 클릭하여 Import 선택

ㅇ 2587을 입력, Load 클릭

 

ㅇ InfluxDB를 데이터 소스로 추가

ㅇ influxdb를 선택하고 import를 클릭한다.

ㅇ influxdb는 이미 Datasource로 세팅되어 있다.

ㅇ 데시보드가 완성되었다.

 

ㅁ 부하 테스트 스크립트 준비

ㅇ git소스 중 examples에 다양한 테스트 스크립트 예제들이 있다.

ㅇ 참고로  k6 test script 에서 자세한 정보 확인 가능하다. 

 

ㅁ 테스트 대상 기동

$ docker run -d -p 3100:3000 --name pm2test express-docker-pm2

[Docker] Express 서버를 Docker에서 PM2로 기동하는 방법에서 생성하였던 express 샘플을 기동시켰다.

ㅇ Port는 3100->3000으로 설정

 

ㅇ 기동 확인

 

   import http from 'k6/http';
   import { sleep } from 'k6';

   export const options = {
     vus: 10,
     duration: '30s',
   };

   export default function () {
     http.get('http://localhost:3100');
     sleep(1);
   }

ㅇ test.js를 생성하였다.

ㅁ 테스트 실행 및 결과 확인

$ k6 run --out influxdb=http://localhost:8086 test.js


         /\      Grafana   /‾‾/
    /\  /  \     |\  __   /  /
   /  \/    \    | |/ /  /   ‾‾\
  /          \   |   (  |  (‾)  |
 / __________ \  |_|\_\  \_____/

     execution: local
        script: test.js
        output: InfluxDBv1 (http://localhost:8086)

     scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
              * default: 10 looping VUs for 30s (gracefulStop: 30s)


     data_received..................: 72 kB 2.4 kB/s
     data_sent......................: 24 kB 798 B/s
     http_req_blocked...............: avg=28.38µs min=1µs   med=4µs    max=711µs   p(90)=10µs   p(95)=32.39µs
     http_req_connecting............: avg=12.79µs min=0s    med=0s     max=416µs   p(90)=0s     p(95)=0s
     http_req_duration..............: avg=1.63ms  min=801µs med=1.35ms max=11.29ms p(90)=2.02ms p(95)=2.46ms
       { expected_response:true }...: avg=1.63ms  min=801µs med=1.35ms max=11.29ms p(90)=2.02ms p(95)=2.46ms
     http_req_failed................: 0.00% 0 out of 300
     http_req_receiving.............: avg=31.42µs min=8µs   med=20.5µs max=280µs   p(90)=60.3µs p(95)=84.09µs
     http_req_sending...............: avg=21.5µs  min=3µs   med=11µs   max=575µs   p(90)=37.2µs p(95)=62µs
     http_req_tls_handshaking.......: avg=0s      min=0s    med=0s     max=0s      p(90)=0s     p(95)=0s
     http_req_waiting...............: avg=1.58ms  min=751µs med=1.3ms  max=11.2ms  p(90)=1.94ms p(95)=2.41ms
     http_reqs......................: 300   9.972712/s
     iteration_duration.............: avg=1s      min=1s    med=1s     max=1.01s   p(90)=1s     p(95)=1s
     iterations.....................: 300   9.972712/s
     vus............................: 10    min=10       max=10
     vus_max........................: 10    min=10       max=10


running (0m30.1s), 00/10 VUs, 300 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs  30s

ㅇ k6로 테스트 실행

ㅇ Grafana 대시보드에서 실시간으로 결과 모니터링

 

ㅇ pm2 plus 지표 결과

 

ㅇ pm2 monit으로 서버 지표 및 로그 확인 결과

 

ㅇ pm2 imonit으로 처리 지연상황을 확인 할 수 있음.

 

ㅁ 과부하 테스트

$ k6 run --out influxdb=http://localhost:8086 --vus 1000 --duration 300s test.js
~~~~~~~

     data_received..................: 71 MB  237 kB/s
     data_sent......................: 24 MB  80 kB/s
     http_req_blocked...............: avg=102.67µs min=0s    med=2µs    max=101.1ms  p(90)=4µs    p(95)=5µs
     http_req_connecting............: avg=95.86µs  min=0s    med=0s     max=101.07ms p(90)=0s     p(95)=0s
     http_req_duration..............: avg=3.06ms   min=0s    med=1.63ms max=57.83ms  p(90)=6.75ms p(95)=11.8ms
       { expected_response:true }...: avg=3.03ms   min=198µs med=1.63ms max=57.83ms  p(90)=6.63ms p(95)=11.59ms
     http_req_failed................: 0.27%  823 out of 299000
     http_req_receiving.............: avg=34.24µs  min=0s    med=13µs   max=20.65ms  p(90)=30µs   p(95)=46µs
     http_req_sending...............: avg=38.37µs  min=0s    med=5µs    max=34.82ms  p(90)=25µs   p(95)=64µs
     http_req_tls_handshaking.......: avg=0s       min=0s    med=0s     max=0s       p(90)=0s     p(95)=0s
     http_req_waiting...............: avg=2.99ms   min=0s    med=1.6ms  max=47.45ms  p(90)=6.65ms p(95)=11.44ms
     http_reqs......................: 299000 995.960361/s
     iteration_duration.............: avg=1s       min=1s    med=1s     max=1.1s     p(90)=1s     p(95)=1.01s
     iterations.....................: 299000 995.960361/s
     vus............................: 1000   min=1000          max=1000
     vus_max........................: 1000   min=1000          max=1000


running (5m00.2s), 0000/1000 VUs, 299000 complete and 0 interrupted iterations
default ✓ [======================================] 1000 VUs  5m0s

ㅇ 가상사용자 1000명, 5분동안 부하를 발생시켰다.

ㅇ   823 out of 299000가 실패, 실패율: 0.27% 

 

ㅇ grafana 지표이다.

ㅇ 가상 사용자, 초당 인입량

ㅇ max, min의 처리지연 그래프.

ㅇ 요청 지연 시간을 확인할 수 있다.(오른쪽 하단)

 

ㅁ 함께 보면 좋은 사이트

k6 test script 

[Spring] SpringBoot K6 + Grafana 부하 https://yeon-dev.tistory.com/203테스트 및 모니터링

Grafana k6 사용하여 부하테스트 하는 방법

부하테스터 도구 k6 퀵 스타트

반응형