본문으로 건너뛰기
버전: 4.5.2.5-onprem

k6 스크립트 — 구간 제어 세그먼트

이 페이지는 구간 제어 k6 스크립트가 어떻게 작동하는지와 각 부분이 무엇을 하는지, Alive Notice 주기를 포함하여 설명합니다.

전체 스크립트 (복사 및 붙여넣기)

원하는 파일 이름으로 저장하세요(예: section-control-script.js).

import { URL } from 'https://jslib.k6.io/url/1.0.0/index.js';
import moment from 'https://momentjs.com/downloads/moment.min.js';
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
import { SharedArray } from 'k6/data';
import http from "k6/http";
import { group, sleep, check } from "k6";
import { Trend } from 'k6/metrics';
import { uuidv4 } from 'https://jslib.k6.io/k6-utils/1.1.0/index.js';

const nginxTrend = new Trend('z0_NGINX');
const nf5101Trend = new Trend('z1_NF_5101');
const nf5002Trend = new Trend('z2_NF_5002');
const nf5003Trend = new Trend('z3_NF_5003');
const nf5004Trend = new Trend('z4_NF_5004');
const eumTrend = new Trend('z5_EUM');

export const options = {
vus: 30, // 가상 사용자 수
duration: "600s", // 테스트 지속 시간
// iterations: 3000, // 총 반복 횟수의 선택적 상한선; 생략하면 지속 시간 동안 루프
};

export function setup() {
const vars = {};

vars["apiurl"] = "https://nf4-onprem-test.stclab.com"; // NetFUNNEL 기본 URL

vars['sid'] = "service_1"; // 프로젝트 ID
vars['aid'] = "section_control"; // 세그먼트 ID

vars['btn_click_delay'] = "2.5"; // 시뮬레이션된 서비스 지속 시간(초)
vars['section_count'] = "10"; // Alive Notice 주기 수

return vars;
}

export default function (vars) {
group("NGINX", function () {
const resources = [
{ url: `${vars.apiurl}/assets/nf-setting/1/nf-setting.json`, type: "json" }
];

let response;
// 통합 자산 요청
resources.forEach((resource) => {
const response = http.get(resource.url.toString(), {
tags: { name: "NGINX" }
})

check(response, {
"NGINX status 200": r => r.status === 200
});

nginxTrend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration);
});
});

group("NF", function () {
let response;

const nf4URL = new URL(vars.apiurl + "/ts.wseq")

nf4URL.searchParams.append('opcode', '5101')
nf4URL.searchParams.append('sid', vars.sid)
nf4URL.searchParams.append('aid', vars.aid)

// 진입 키 요청(토큰 발급)
response = http.get(nf4URL.toString(), {
tags: { name: "NF_5101" }
})

check(response, {
"NF_5101 status 200": r => r.status === 200
});
nf5101Trend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration);

let [retval, other] = response.body.split(":")
let data = {}
other.split('&').forEach(item => {
const [k, v] = item.split("=")
data[k] = v
});

let ttl;

// 진입이 허용되지 않을 때 대기 통신 수행
while (parseInt(retval) === 201) {
ttl = parseInt(data.ttl);
sleep(ttl);

const nf4RetryActionURL = new URL(`${vars.apiurl}:${data.port || 443}/ts.wseq`)
nf4RetryActionURL.searchParams.append('opcode', '5002')
nf4RetryActionURL.searchParams.append('key', data.key)
nf4RetryActionURL.searchParams.append('sticky', data.sticky)
response = http.get(nf4RetryActionURL.toString(), {
tags: { name: "NF_5002" }
})
check(response, {
"NF_5002 status 200": r => r.status === 200
});
nf5002Trend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration);

[retval, other] = response.body.split(":")
data = {}
other.split('&').forEach(item => {
const [k, v] = item.split("=")
data[k] = v
});
}

// Alive Notice 주기 전송
if (parseInt(retval) === 200) {
retval = 201;
let count = 0;

while (parseInt(retval) === 201 && count < parseInt(vars.section_count)) {
ttl = parseInt(data.ttl);
sleep(ttl);

const nf4AliveActionURL = new URL(`${vars.apiurl}:${data.port || 443}/ts.wseq`);
nf4AliveActionURL.searchParams.append('opcode', '5003');
nf4AliveActionURL.searchParams.append('key', data.key);
nf4AliveActionURL.searchParams.append('sticky', data.sticky);

response = http.get(nf4AliveActionURL.toString(), {
tags: { name: "NF_5003" }
});

check(response, {
"NF_5003 status 200": r => r.status === 200
});

nf5003Trend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration
);

[retval, other] = response.body.split(":");
data = {};
other.split('&').forEach(item => {
const [k, v] = item.split("=");
data[k] = v;
});

count++;
}
}

// 키 반환(완료)
if (parseInt(retval) === 201) {
// 여기에 비즈니스 로직을 배치하세요
sleep(vars.btn_click_delay)

// 작업 후 NetFUNNEL에 키 반환
const nf4CompleteURL = new URL(`${vars.apiurl}:${data.port || 443}/ts.wseq`)
nf4CompleteURL.searchParams.append('opcode', '5004')
nf4CompleteURL.searchParams.append('key', data.key)
nf4CompleteURL.searchParams.append('sticky', data.sticky)
response = http.get(nf4CompleteURL.toString(), {
tags: { name: "NF_5004" }
})
check(response, {
"NF_5004 status 200": r => r.status === 200
});
nf5004Trend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration);
}
});
}

실행 방법

# 예제 파일 이름 — 저장한 이름에 맞게 조정
k6 run section-control-script.js

옵션 및 설정

가상 사용자 및 지속 시간:

export const options = {
vus: 30, // 가상 사용자 수
duration: "600s", // 테스트 지속 시간
// iterations: 3000, // 총 반복 횟수의 선택적 상한선; 생략하면 지속 시간 동안 루프
};

환경 변수(setup()):

export function setup() {
const vars = {};

vars["apiurl"] = "https://nf4-onprem-test.stclab.com"; // NetFUNNEL 기본 URL

vars['sid'] = "service_1"; // 프로젝트 ID
vars['aid'] = "section_control"; // 세그먼트 ID

vars['btn_click_delay'] = "2.5"; // 시뮬레이션된 서비스 지속 시간(초)
vars['section_count'] = "10"; // Alive Notice 주기 수

return vars;
}

주요 필드:

  • section_count: 구간에서 더 오래 머무르는 것을 시뮬레이션하기 위한 Alive Notice 주기 수
기본 제어와의 차이점

구간 제어는 진입(200)과 완료(5004) 사이에 Alive Notice(5003) 주기를 전송하여 구간 내에서 더 오래 머무르는 것을 시뮬레이션합니다.

코드 분석

1) 구성 자산 가져오기

group("NGINX", function () {
const resources = [
{ url: `${vars.apiurl}/assets/nf-setting/1/nf-setting.json`, type: "json" }
];
// ... 요청 및 타이밍 트렌드
});

2) 진입 키 요청(5101), 재시도(5002)로 큐 처리

const nf4URL = new URL(vars.apiurl + "/ts.wseq")
nf4URL.searchParams.append('opcode', '5101')
nf4URL.searchParams.append('sid', vars.sid)
nf4URL.searchParams.append('aid', vars.aid)
response = http.get(nf4URL.toString(), { tags: { name: "NF_5101" }})
// 파싱하고 201이면 opcode=5002로 허용될 때까지 루프

3) 200 후 Alive Notice 주기(5003)를 section_count 횟수만큼 실행

if (parseInt(retval) === 200) {
retval = 201;
let count = 0;
while (parseInt(retval) === 201 && count < parseInt(vars.section_count)) {
ttl = parseInt(data.ttl);
sleep(ttl);
const nf4AliveActionURL = new URL(`${vars.apiurl}:${data.port || 443}/ts.wseq`);
nf4AliveActionURL.searchParams.append('opcode', '5003');
nf4AliveActionURL.searchParams.append('key', data.key);
nf4AliveActionURL.searchParams.append('sticky', data.sticky);
response = http.get(nf4AliveActionURL.toString(), { tags: { name: "NF_5003" } });
check(response, { "NF_5003 status 200": r => r.status === 200 });
nf5003Trend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration);
// 응답을 파싱하고 계속
count++;
}
}

4) 작업을 시뮬레이션한 다음 키 반환(5004)

if (parseInt(retval) === 201) {
sleep(vars.btn_click_delay)
const nf4CompleteURL = new URL(`${vars.apiurl}:${data.port || 443}/ts.wseq`)
nf4CompleteURL.searchParams.append('opcode', '5004')
nf4CompleteURL.searchParams.append('key', data.key)
nf4CompleteURL.searchParams.append('sticky', data.sticky)
response = http.get(nf4CompleteURL.toString(), { tags: { name: "NF_5004" }})
check(response, { "NF_5004 status 200": r => r.status === 200 });
nf5004Trend.add(response.timings.blocked + response.timings.connecting + response.timings.tls_handshaking + response.timings.duration);
}