Hyun's Wonderwall

부하 테스트 도구 k6 설치 & Grafana k6으로 시각화 본문

Study/Cloud

부하 테스트 도구 k6 설치 & Grafana k6으로 시각화

Hyun_! 2025. 7. 9. 15:01

부하 테스트 도구 k6 설치 & Grafana k6으로 시각화

(참고글 1: https://velog.io/@heka1024/Grafana-k6%EC%9C%BC%EB%A1%9C-%EB%B6%80%ED%95%98-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0

참고글 2: https://co-yong.tistory.com/entry/Grafana-%EC%84%A4%EC%B9%98-%EB%B0%8F-InfluxDB-%EC%97%B0%EB%8F%99)

 

Docker가 설치되어 있어야 한다!

나는 Mac이어서 brew로 k6와 influxdb-cli를 설치했고

docker-compose.yml을 작성한 뒤 docker compose up으로 influxdb와 grafana 각각의 이미지를 받아 컨테이너를 올렸다.

(도커 최신 버전에서는 docker-compose를 따로 설치할 필요 없다)

version: '3.8'

services:
  influxdb:
    image: bitnami/influxdb:1.8.5
    container_name: influxdb
    ports:
      - "8086:8086"
      - "8085:8088"
    environment:
      - INFLUXDB_ADMIN_USER_PASSWORD=bitnami123
      - INFLUXDB_ADMIN_USER_TOKEN=admintoken123
      - INFLUXDB_HTTP_AUTH_ENABLED=false
      - INFLUXDB_DB=myk6db
  granafa:
    image: bitnami/grafana:latest
    ports:
      - "3000:3000"

 

터미널에 influx ping을 입력해 OK가 응답되는 것을 확인하고

http://localhost:3000/에 접속하니, 로그인 화면이 표시된다.

초기 이메일과 비밀번호는 모두 admin이다.

 

로그인을 완료하고 Connections > Data sources > Add data source에서 InfluxDB를 선택 

URL을 http://influxdb:8086로

Database를 myk6db로 작성한다 

아래의 Save & Test 파란색 버튼을 클릭했을 때 database is working이 뜨면 성공이다.

 

이제 아래와 같은 공식 대시보드를 임포트하거나 시각화 패널을 생성하여 시각화할 수 있다.

 https://grafana.com/grafana/dashboards/2587-k6-load-testing-results/ 

 

스크립트는 이렇게 작성해보았다.

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

export const options = {
  vus: 10,
  duration: '30s',
  thresholds: {
    http_req_duration: ['p(95)<800'],
    checks: ['rate>0.8'],       // check 통과율 80% 이상 기대
    http_req_failed: ['rate<0.2'], // 실패율 20% 이하 기대
  },
};

export default function () {
  // 요청을 랜덤하게 정상/비정상 URL로 보냄
  const isError = Math.random() < 0.2;  // 20% 확률로 오류 발생
  const url = isError ? 'https://test.k6.io/404' : 'https://test.k6.io';
  const res = http.get(url);

  const passed = check(res, {
    'status is 200': (r) => r.status === 200,
  });

  if (!passed) {
    fail(`Request failed with status ${res.status}`);
  }

  sleep(1);
}

 

스크립트를 작성한 곳에서 아래 커맨드를 입력하면

 k6 run \
  --out influxdb=http://localhost:8086/myk6db \
  script.js

 

아래처럼 의도적으로 ERROR 가 나서 로그에 찍힌다.

 

Grafana를 보니 시각화 패널들에 No data 문구와 함께 핑크색 경고 표시가 떠서 의아했는데

Queries > Query options의 Min interval 때문인 것 같았다. 아래의 이미지에서 >1s라고 적혀있는 것을 삭제해주니 차트가 보인다.

 

대시보드 결과!! 신기하다 ㅎㅎ

 

종료할 때는 터미널에 docker compose down을 입력하면 된다

필요시 컨테이너, 이미지, 볼륨을 지워준다!

docker image prune -a -f

docker system prune -a --volumes -f

등..