influxdb 2.x 와 k6 사용 시 발생한 문제
Summary
주요 내용
이 포스트는 grafana 에 dashboard 를 추가하던 중 발생한 문제에 대해 크게 2가지를 다루고 있습니다.
첫째로, k6 와 influxdb 2.x 를 사용할 때 발생하는 호환성 문제
둘째로, dashboard 를 import 했을 때 QueryFailed error 문제
k6 실행 명령어의 경우 window 를 기준으로 설명하고 있으므로 참고하시기 바랍니다.
환경 세팅
grafana, k6, influxdb 를 별도로 각각 설치하거나
xk6-output-influxdb 이 extension 을 이용하여 docker 로 한 번에 간편하게 설치할 수도 있다.
k6 로 실행할 스크립트 작성
1
2
3
4
5
6
7
8
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
// 부하를 가할 사이트의 endpoint 를 입력
http.get('http://localhost:8080/api/v1/novels/home-best');
sleep(1);
}
k6 binary 실행
1
2
3
4
./k6.exe run --out xk6-influxdb=localhost:8086 script.js `
-e K6_INFLUXDB_TOKEN="my-token" `
-e K6_INFLUXDB_ORGANIZATION="my-org" `
-e K6_INFLUXDB_BUCKET="my-bucket"
influxdb 2.x 호환성 문제
로컬로 k6 를 설치하고 해당 실행 결과를 influxdb 2.x 으로 보내면 호환성 관련 문제가 생기면서 xk6-output-influxdb extension 를 설치하는 것을 고려하라는 메세지가 나온다. 이 문제의 원인은 아래와 같이 잘 설명되어 있다.
결론적으로 이 문제를 해결하기 위해서는 xk6-output-influxdb extension 을 이용해 호환성 문제를 해결해야 한다.
설치 방법
Using Docker
아직 사용해보지는 않았지만, 해당 레포에서 제공하는 docker-compose 파일을 이용해 container 를 만들면 grafana, k6, influxdb 를 별도의 설치없이 사용할 수 있고 위에서 발생한 호환성 문제도 쉽게 해결 가능할 것이다.
로컬 설치
아래 3가지가 설치되어 있어야 한다.
- go 언어 설치 ($GOPATH/bin 경로를 시스템 환경변수에 추가)
Go toolchain installation - Git
-
xk6
1
go install go.k6.io/xk6/cmd/xk6@latest
위의 3가지가 설치된 상태로 아래의 명령어를 실행하면 현재 경로에 k6.exe 파일이 생성된다.
1
xk6 build --with github.com/grafana/xk6-output-influxdb
생성된 k6 binary 로 다시 스크립트 실행
- grafana service 실행
- influxd.exe 파일을 실행
- 아래의 명령어로 k6 binary 실행
1 2 3 4
./k6.exe run --out xk6-influxdb=localhost:8086 script.js ` -e K6_INFLUXDB_TOKEN="my-token" ` -e K6_INFLUXDB_ORGANIZATION="my-org" ` -e K6_INFLUXDB_BUCKET="my-bucket"
이제 influxdb 2.x 버전으로 k6 의 load test 결과를 전송할 수 있게 되었다.
dash board 추가
k6 로 전송한 load test 의 결과값을 시각화하기 위해 grafana 의 dashboard 를 사용할 차례이다. 그라파나 대쉬보드 로 가서 dashboard 를 추가해야 한다. k6 를 이용한 load test 가 목적이었고, grafana.com/dashboards 에서 간편하게 제공되는 dashboard 를 import 해서 사용하려고 하였다.
Copy to clipboard 를 클릭하면, 해당 dashboard 를 import 할 수 있는 id 값이 복사된다. 간편하게 나의 dashboard 에 완성된 대쉬보드를 생성할 수 있다.
문제 발생
문제는 간편하게 import 해서 사용하려는 해당 dashboard 들의 대부분이 influxdb 1.x 버전에서 사용되던 InfluxQL 를 기준으로 만들어져 있다는 점이다. influxdb 2.x 버전을 사용할 때는 flux 를 사용하지 않으면 QueryFailed error 가 발생한다.
해결 방법
InfluxQL 을 flux 로 migration 하였다.
migration 예시
1
2
3
4
5
6
7
8
influx
SELECT
mean("value")
FROM
http_req_duration
WHERE
$timeFilter
1
2
3
4
5
6
7
flux
from(bucket: "appPerformance")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "http_req_blocked")
|> filter(fn: (r) => r._field == "value")
|> mean()
위의 예시와 같이, 오류가 나는 panel 마다 edit 버튼으로 해당 query 들을 flux 버전으로 잘 수정하여 문제를 해결할 수 있다.
percentile 함수는 flux 에서 quantile 함수로 replace 되었다.
1
2
3
4
5
from(bucket: "appPerformance")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "http_req_duration")
|> filter(fn: (r) => r._field == "value")
|> quantile(q: 0.9)
Migration guide
아래의 링크에 다양한 flux 함수들에 대해 잘 설명이 되어있다.
InfluxQL to flux migration guide
마치며
현재는 local 로 test 한 정도이지만 ec2 에서 제대로 된 load test 를 진행할 때는 flux 로 수정한 dashboard 를 공유할 수 있도록 해봐야겠다.