k6 with InfluxDB(& Prometheus)

maro's avatar
Sep 07, 2024
k6 with InfluxDB(& Prometheus)
이 글에서는 k6의 결과물을 외부 서비스로 스트리밍하여 시계열 데이터를 시각화하는 방법을 알아봅니다.
이 글은 다음 글들과 이어집니다.
 
k6는 거의 실시간으로 metric을 보낼 수 있습니다. 보낸 metric 데이터들은 다양한 서드파티 서비스에서 저장하고 시각화 할 수 있는데, 이중 가장 자주 보이는 것은 InfluxDB + Grafana 조합입니다. 그래서 우선 공식 문서를 통해 InfluxDB로 metric을 스트리밍하는 방법을 알아보고, 그 외 다른 방법들을 살펴보겠습니다.
실시간 스트림을 지원하는 다른 서비스들은 공식 문서에서 확인하실 수 있습니다.
 
결론부터 말하자면, InfluxDB의 버전 이슈로 InfluxDB보다는 Prometheus로 설정하는 것이 훨씬 나았습니다. InfluxDB로 설정하는 다양한 방법을 찾아서 시도해보았지만 어느 것도 만족스럽지 못했습니다. 시각화 방법만 궁금하신 분은 Prometheus 부분부터 보시면 됩니다.
 

InfluxDB

공식 문서 버전

InfluxDB v2.0과 연동하려면 InfluxDB extension을 사용해야 합니다. InfluxDB extension을 통해 k6 메트릭을 InfluxDB에 저장하고 Grafana 또는 다른 도구를 사용하여 성능 결과를 분석할 수 있습니다. Grafana 문서에는 연동 방법이 자세히 설명되어 있습니다.
 
InfluxDB extension 추가
# Install xk6 go install go.k6.io/xk6/cmd/xk6@latest # Build the k6 binary xk6 build --with github.com/grafana/xk6-output-influxdb
k6에서 influxDB로 데이터를 보내기 위해서는 xk6-output-influxdb를 설치해야 합니다.
extension을 k6에 추가하기 위해 xk6 라이브러리를 사용합니다. xk6는 k6의 확장 빌더 도구로 커스텀 k6 빌더라고 이해하시면 됩니다. 위 작업을 통해 xk6-output-influxdb를 추가한 커스텀 k6를 만들 수 있습니다.
 
docker run --rm -it -e GOOS=darwin -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" \ grafana/xk6 build v0.43.1 \ --with github.com/mostafa/xk6-kafka@v0.17.0 \ --with github.com/grafana/xk6-output-influxdb@v0.3.0
더 쉬운 방법은 Docker 이미지를 사용하는 것입니다. 이렇게 하면 xk6를 수동으로 설치할 필요가 없고 현재 작업 디렉토리에 커스텀 k6 바이너리가 생성됩니다.
위 명령어는 grafana/xk6의 도커 이미지를 사용하여 k6 버전 0.43.1을 기반으로 빌드합니다. 중간에 k6에서 Kafka와 상호작용할 수 있게 해주는 xk6-kafka가 포함되어 있는데 필요없으면 빼도 됩니다.
 
InfluxDB 실행
brew install influxdb brew services start influxdb
metric 데이터를 받아 저장할 InfluxDB도 설치 후 실행합니다. http://localhost:8086/ 로 접속하여 접근 가능합니다.
 
Test 실행
K6_INFLUXDB_ORGANIZATION="<INFLUXDB-ORGANIZATION-NAME>" \ K6_INFLUXDB_BUCKET="<INFLUXDB-BUCKET-NAME>" \ K6_INFLUXDB_TOKEN="<INFLUXDB-TOKEN>" \ K6_INFLUXDB_ADDR="<INFLUXDB-HTTP-ADDRESS>" \ ./k6 run script.js -o xk6-influxdb
k6로 스크립트를 실행하면 InfluxDB의 설정된 버킷으로 metric 지표가 저장됩니다.
 
Grafana 실행
저장된 InfluxDB의 데이터를 Grafana로 시각화하는 방법을 알아보겠습니다. 설정은 InfluxDB 문서를 참고하여 진행하시면 됩니다.
brew update brew install grafana brew services start grafana
http://localhost:3000/로 접근할 수 있습니다. 초기 계정 정보는 admin/admin(id/pw) 입니다.
 
Grafana 설정
그라파나 왼쪽 메뉴에서 connection 섹션에서 ‘Add new connection’로 들어가 InfluxDB를 검색합니다. ‘Add new Datasource’ 메뉴를 선택하고 아래와 같이 설정합니다.
인증/인가 정보를 입력하고 Save&test 버튼을 눌러 저장하면 InfluxDB와 연동됩니다. 이 Datasource로 대시보드를 구성하면 시각화된 데이터를 볼 수 있습니다.
notion image
 

더 간단한 방법(with. Docker-Compose)

공식 문서에는 위와 같이 안내가 되어있지만, 하나하나 설치하고 설정하는 일이 여간 번거로운 것이 아닙니다. 또한 실행하다보면 Go Path 이슈로 인해 오류 뿜뿜하는데, ‘이렇게까지 해야하나’ 하는 생각마저 듭니다.
그런 우리를 위해 친절하게 docker-compose를 구성해주신 분들이 있습니다. 앞서 보았던, xk6-output-influxdb 리포지토리에는 influxdb부터 grafana까지 포함된 docker-compose 파일이 있습니다. 우리는 그냥 이 리포지토리를 클론 받아서 스크립트 파일만 수정하고 실행 명령어만 입력하면 됩니다!
docker compose 실행하기 귀찮을까봐 실행 스크립트까지 만들어준 이 스윗함..
./docker-run.sh samples/http_2.js
 

하지만…

k6 테스트 데이터 시각화를 위해 자료를 찾다보면 extension을 추가하는 등의 번거로운 작업 없이 너무나 쉽게 설정하는 글들을 볼 수 있습니다. 실제로 따라서 설정해보면 동작도 너무 잘 됩니다. 그럼 왜 공식 문서에는 이처럼 번거로운 작업을 안내하고 있는 걸까요?
Why is this output not directly part of k6 core? The k6 core already supports the InfluxDB v1 so the natural feeling would be to do the same for the v2. Unfortunately, the v2 has introduced some breaking changes in the core parts of the API. This would make it difficult to support both versions without taking a bunch of compromises for maintaining the retro-compatibility or introducing breaking changes in the current user experience of the k6's InfluxDB output, with a high probability to create more confusion for k6's users. For this main reason, the k6 development team has decided to create a new and independent extension for InfluxDB v2. [xk6-output-influxdb README]
xk6-output-influxdb README에는 위와 같은 글이 제일 먼저 나옵니다. 하위 호환성을 유지하기 위해 별도로 extension을 추가하는 방법을 택했다는 것입니다.
그런데 v2의 문제는 이것만이 아닙니다. Grafana에서는 여러가지 Dashboard들을 제공해주고 있는데, v1에서 사용 가능했던 Dashboard들이 InfluxDB v2로 저장한 데이터에서는 사용 불가능한 이슈가 발생합니다. 데이터를 사용불가능한 데이터라고 하거나, UID 변수가 제대로 할당되지 않으면서 차트가 제대로 생성되지 않습니다. 이 역시 버전 호환 문제입니다.
그렇다고 v1을 사용하자니 기존 Grafana Dashboard를 사용할 수 있으나 influxdb의 웹 인터페이스가 지원되지 않는 문제가 있습니다. 물론, Grafana를 사용하는 데는 문제가 없지만 그닥 만족스러운 상황은 아닙니다.
 

Prometheus

여러가지 이슈를 안고 굳이 influxdb를 사용해야하나 하는 생각이 듭니다. 성능 모니터링에서 influxdb는 데이터베이스 역할 밖에 하지 않기 때문에 influxdb를 고집할 필요는 없어보입니다.
다시 원점으로 돌아가 지원하는 서비스들을 살펴보면, 대부분의 서비스들이 extension을 필요로 합니다. 그런데 Prometheus 그런 이슈가 없습니다.
 
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \ K6_PROMETHEUS_RW_USERNAME=USERNAME \ K6_PROMETHEUS_RW_PASSWORD=PASSWORD \ k6 run -o experimental-prometheus-rw script.js
Prometheus는 k6를 다시 빌드할 필요 없이 –web.enable-remote-write-receiver 플래그를 활성화하는 것으로 충분합니다.
 

docker-compose

Prometheus와 Grafana를 하나하나 설정하지 않고, 한 번에 실행할 수 있도록 docker-compose로 구성할 수도 있습니다. 한 블로그 글에서 docker-compose를 올려주셔서 참고하여 구성하였습니다.
// docker-compose.yml services: grafana: image: grafana/grafana ports: - 3000:3000 volumes: - ./grafana/provisioning:/etc/grafana/provisioning - ./grafana/dashboard:/dashboard depends_on: - prometheus prometheus: image: prom/prometheus ports: - 9090:9090 command: - --web.enable-remote-write-receiver - --enable-feature=native-histograms - --config.file=/etc/prometheus/prometheus.yml k6: image: grafana/k6 volumes: - ./script:/scripts command: run -o experimental-prometheus-rw /scripts/script.js environment: - K6_PROMETHEUS_RW_SERVER_URL=http://prometheus:9090/api/v1/write - K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true depends_on: - prometheus
참고 글과 달리 extra_hosts 설정은 제외하고 로컬에서 테스트할 때는 url에 localhost 대신 host.docker.internal 를 사용하여 접근하도록 하였습니다.
 
command: - --enable-feature=native-histograms
environment: - K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true
설정 중 native histogram 설정이 있습니다. 해당 설정은 k6 지표 변환 옵션을 설정하는 것입니다. 변환 옵션은 다음 두 가지가 있습니다. (prometheus-native-histogram)
 
// prometheus.yml apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090
// dashboards.yml apiVersion: 1 providers: - name: "k6 Test" orgId: 1 folder: "" type: file disableDeletion: false updateIntervalSeconds: 10 options: path: /dashboard/18030_rev8.json foldersFromFilesStructure: true
Grafana에서 datasource와 dashboard를 매번 설정할 필요 없도록 프로비저닝을 통해 설정합니다.
설정 시, dashboard에 필요한 json 파일은 Grafana k6 관리자가 제공하는 ‘공식’ 대시보드에서 json 파일을 다운받으시면 됩니다.
notion image
검색을 통해 다른 dashboard 들도 사용할 수 있는데, 특히 지표 변환 옵션에서 native histogram이 아닌 기본 설정을 했을 경우 기본 k6 prometheus 대시보드를 사용하셔야 합니다.
 

정리

k6 테스트 결과 시각화를 위해 InfluxDB와 Prometheus를 설정하는 방법을 알아보았습니다. 다음 글에서는 실제로 성능을 테스트하고 개선한 이야기를 다뤄보겠습니다.
Share article

maro