influxdb 2.x 와 k6 사용 시 발생한 문제

주요 내용

이 포스트는 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 를 설치하는 것을 고려하라는 메세지가 나온다. 이 문제의 원인은 아래와 같이 잘 설명되어 있다.

img.png

결론적으로 이 문제를 해결하기 위해서는 xk6-output-influxdb extension 을 이용해 호환성 문제를 해결해야 한다.

설치 방법

Using Docker

아직 사용해보지는 않았지만, 해당 레포에서 제공하는 docker-compose 파일을 이용해 container 를 만들면 grafana, k6, influxdb 를 별도의 설치없이 사용할 수 있고 위에서 발생한 호환성 문제도 쉽게 해결 가능할 것이다.

참조 링크

로컬 설치

아래 3가지가 설치되어 있어야 한다.

  1. go 언어 설치 ($GOPATH/bin 경로를 시스템 환경변수에 추가)
    Go toolchain installation
  2. Git
  3. 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 로 다시 스크립트 실행

  1. grafana service 실행
  2. influxd.exe 파일을 실행
  3. 아래의 명령어로 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 해서 사용하려고 하였다.

k6 load test dashboard

img.png

Copy to clipboard 를 클릭하면, 해당 dashboard 를 import 할 수 있는 id 값이 복사된다. 간편하게 나의 dashboard 에 완성된 대쉬보드를 생성할 수 있다.

문제 발생

문제는 간편하게 import 해서 사용하려는 해당 dashboard 들의 대부분이 influxdb 1.x 버전에서 사용되던 InfluxQL 를 기준으로 만들어져 있다는 점이다. influxdb 2.x 버전을 사용할 때는 flux 를 사용하지 않으면 QueryFailed error 가 발생한다.

img.png

해결 방법

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 를 공유할 수 있도록 해봐야겠다.

comments powered by Disqus