일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 체크인미팅
- 캡스톤디자인프로젝트
- 인프라
- 백엔드개발자
- CICD
- UNICON
- 개발공부
- springai
- 라피신
- 티스토리챌린지
- 42서울
- 게임개발동아리
- UNICON2023
- 도커
- 프리티어
- 스프링부트
- 오블완
- 생활코딩
- 프롬프트엔지니어링
- 전국대학생게임개발동아리연합회
- Route53
- openAI API
- AWS
- 프로그래밍
- UNIDEV
- Spring boot
- NAT gateway
- EC2
- bastion host
- Redis
- Today
- Total
Hyun's Wonderwall
부하 테스트 도구 k6 설치 & Grafana k6으로 시각화 본문
부하 테스트 도구 k6 설치 & Grafana k6으로 시각화
참고글 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
등..
'Study > Cloud' 카테고리의 다른 글
[ACC Ewha] 대규모 채팅 시스템 설계 프로젝트 - (1) 주제 선정, 유저 시나리오 작성, 아키텍처 초안 작성 (2) | 2025.05.12 |
---|---|
[AWS] Storage - S3, CloudFront (0) | 2025.03.25 |
[AWS] Route53, VPC 이론과 실습 (+ NAT Gateway, Bastion Host) (0) | 2025.03.21 |