k6スクリプト — 基本コントロールセグメント
このページは基本コントロールk6スクリプトがどのように動作するか、各部分が何をするかを説明します。
完全なスクリプト (コピーおよび貼り付け)
希望するファイル名で保存してください(例: basic-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'] = "basic_control"; // セグメントID
vars['btn_click_delay'] = "2.5"; // シミュレートされたサービス持続時間(秒)
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
});
}
// キー返却(完了)
if (parseInt(retval) === 200) {
// ここにビジネスロジックを配置してください
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 basic-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'] = "basic_control"; // セグメントID
vars['btn_click_delay'] = "2.5"; // シミュレートされたサービス持続時間(秒)
return vars;
}
主要フィールド:
apiurl: NetFUNNEL基本URLsid/aid: プロジェクト/セグメント識別子btn_click_delay: キーを返却する前のシミュレートされた作業時間
区間コントロールとの違い
基本コントロールはAlive Notice(5003)を送信しません。進入が許可された後(200) btn_click_delayの間キーを保持し、5004で完了します。
コード分析
1) 構成アセット取得
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);
});
});
2) 進入キーリクエスト(5101)
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);
3) キューで待機中の場合(201)、ttlを待機して200になるまで再試行(5002)
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);
// 応答を再度パース ...
}
4) 200後作業をシミュレートしてからキー返却(5004)
if (parseInt(retval) === 200) {
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);
}