ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 부하 테스트 - K6, Grafana, InfluxDB
    카테고리 없음 2024. 2. 18. 14:53

    들어가며

    저번 글 3개에서 간단한 REST API를 만들어 Docker로 컨테이너화 하고 Spring Actuator, Prometheus, Grafana로 모니터링 시스템 구축까지 해보았다. 그럼 이제 부하 테스트를 진행하여 어느 수준의 트래픽까지 받을 수 있을지 가늠해볼 수 있다.

    3개 작업만 하면 된다. K6로 테스트 스크립트 작성하고, 부하테스트에 따른 지표 데이터를 수집하고, 이 지표를 Grafana로 확인할 수 있게 대시보드를 구성하는 것이다. 

    아래 그림과 같은 구조로, Grafana 블로그(https://grafana.com/blog/2023/04/11/how-to-visualize-load-testing-results/)에 잘 설명되어 있다.


    K6 설치하고 스크립트 만들기

    K6가 뭔지부터 알아보자. 오픈소스 기반 부하 테스트 도구이다. Grafana와 마찬가지로 Grafana Labs에서 개발하였다. jMeter와 같은 UI 기반으로 부하 테스트를 설정하는 것이 아니라 Javascript로 테스트 스크립트를 작성해서 한다. 테스트도 UI를 제공하지 않기 때문에 CLI로 하는 것이 특징이다.

    자세한 내용은 공식 가이드(https://k6.io/docs/)를 참조하자.

     

    이제 설치를 해보자.

    역시 전체 팀원들이 일관성있는 테스트를 해야하니 docker로 해보자. 아주 좋은 건 k6 github(https://github.com/grafana/k6)에서 docker-compose.yml를 제공해준다. 해당 내용을 바탕으로 아래와 같이 docker-compose.yml을 수정하였다.

    version: '3'
    
    networks:
      k6:
      grafana:
      prometheus:
    
    services:
      greeting:
        build:
          context: .
          dockerfile: Dockerfile
        ports:
          - "9000:9000"
          - "9001:9001"
    
      prometheus:
        image: prom/prometheus
        networks:
          - grafana
        ports:
          - "9090:9090"
        volumes:
          - ./prometheus.yml:/etc/prometheus/prometheus.yml
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
      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:
          - ./k6:/scripts
    
      influxdb:
        image: influxdb:1.8
        networks:
          - k6
          - grafana
        ports:
          - "8086:8086"
        environment:
          - INFLUXDB_DB=k6

     

    k6를 설치하는데 갑자기 컴포즈 파일이 비대해졌다 ㅎㅎ일단 k6만 보자.

    image는 grafana/k6에서 받아오고, 컨테이너 network를 k6로 포트를 6565번으로 설정한다. 부하 테스트한 데이터를 InfluxDB로 보내야하기 때문에 K6_OUT 환경변수에 influxdb 컨테이너 정보를 입력하였다.

     

    이렇게 구성 후 아래처럼 프로젝트 최상위 경로에 k6라는 디렉터리를 만들고 샘플 테스트 파일을 만들자. greeting_test.js이다.

    그럼 k6 docker를 실행할 때 k6 디렉터리 밑에 있는 테스트 스크립트를 컨테이너로 복사해간다. 그리고 도커 실행할 때 실행 변수로 원하는 스크립트를 지정해 테스트할 수 있다.

    greeting_test.js

    코드는 아래와 같다.

    import http from 'k6/http';
    import { sleep } from 'k6';
    
    export default function () {
      const names = ['Alice', 'Bob', 'Charlie', 'David', 'Emily', 'Frank', 'Grace', 'Henry', 'Ivy', 'Jack'];
      const randomName = names[Math.floor(Math.random() * names.length)];
      const url = `http://host.docker.internal:9000/greeting?name=${randomName}`;
      http.get(url);
      sleep(1);
    }

     

    아래 커맨드로 k6 도커를 실행하자.

    docker-compose run -v $(pwd)/k6 k6 run /scripts/greeting_test.js --vus 10 --duration 1m

    가상 유저 10명이 1분간 요청한다는 내용이다.

    k6 도커로 실행

    성공적으로 테스트가 수행되었다.


    InfluxDB와 Grafana 연동

    InfluxDB란 InflunxData가 개발한 오픈소스 기반 시계열 데이터베이스(TSDB : Time Series Database)이다. TSDB란 '시간'과 '값' 쌍으로 이루어진 데이터를 관리하는 데이터베이스를 의미한다. 당연히 RDB에 비해 이러한 시간 기반의 데이터를 저장하고 관리하고 꺼네어 조회하는데 특화되어있다. 그리고 InfluxDB는 이러한 TSDB 중 가장 대표적인 제품이다.

     

    연동은 이미 docker-compose.yml 파일에 되어있다.

    services에 Influxdb가 추가되었다. networks는 k6와 Grafana를 사용하는데, K6에서 부하테스트 지표 데이터를 전송해야 하므로 K6 컨테이너와 네트워크 연결이 필요하다. 마찬가지로 Grafana에서 InfluxDB에 접근해 시계열 데이터를 가져가야 하므로 두 컨테이너를 grafana network로 묶은 것이다. 

     

    이제 부하테스트 지표가 K6에서 InfluxDB에 저장되고, 이를 Grafana에서 시각화되었는지 확인하자.

    잘 나온다! 샘플로 가져온 대시보드에서 보여주는 판넬이 적어서 그렇지 K6와 관련된 대시보드 공유되어있는 것 잘 사용하면 효과적으로 부하테스트 결과를 분석할 수 있을 것이다.


    마무리

    이전에는 DevOps 팀에서 만들어준 APM 환경에서 분석만하였는데, 이번에는 전체적으로 다 같이해야 하는 상황이라 시간내서 공부해보았다. 운영 이슈에 더 예민해졌는데 이렇게 전체 프로세스를 간략하게나마 구성해보니 심리적으로 안정이된다. 언제든 원하는 데이터를 보기 수월해졌으니까 말이다.

     

     

    댓글

Designed by Tistory.