viberadar 0.3.210 → 0.3.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +33 -12
- package/dist/server/index.js.map +1 -1
- package/dist/ui/dashboard.html +59 -3
- package/package.json +1 -1
package/dist/ui/dashboard.html
CHANGED
|
@@ -1786,6 +1786,9 @@ let loadVusDraft = 10;
|
|
|
1786
1786
|
let loadDurationDraft = '30s';
|
|
1787
1787
|
let loadDataDirDraft = '';
|
|
1788
1788
|
let loadResultDirDraft = '';
|
|
1789
|
+
let loadExecutionModeDraft = 'auto';
|
|
1790
|
+
let loadVusEnvNameDraft = 'SMOKE_VUS';
|
|
1791
|
+
let loadDurationEnvNameDraft = 'SMOKE_DURATION';
|
|
1789
1792
|
let loadView = 'library'; // 'library' | 'editor'
|
|
1790
1793
|
|
|
1791
1794
|
function toggleObsHint(id) {
|
|
@@ -7763,16 +7766,25 @@ function applyLoadConfigToFields(cfg) {
|
|
|
7763
7766
|
loadDurationDraft = cfg.duration || loadDurationDraft;
|
|
7764
7767
|
loadDataDirDraft = cfg.dataDir || loadDataDirDraft;
|
|
7765
7768
|
loadResultDirDraft = cfg.resultDir || loadResultDirDraft;
|
|
7769
|
+
loadExecutionModeDraft = cfg.executionMode || loadExecutionModeDraft;
|
|
7770
|
+
loadVusEnvNameDraft = cfg.vusEnvName || loadVusEnvNameDraft;
|
|
7771
|
+
loadDurationEnvNameDraft = cfg.durationEnvName || loadDurationEnvNameDraft;
|
|
7766
7772
|
const baseEl = document.getElementById('loadBaseUrl');
|
|
7767
7773
|
const vusEl = document.getElementById('loadVus');
|
|
7768
7774
|
const durEl = document.getElementById('loadDuration');
|
|
7769
7775
|
const dataEl = document.getElementById('loadDataDir');
|
|
7770
7776
|
const resultEl = document.getElementById('loadResultDir');
|
|
7777
|
+
const modeEl = document.getElementById('loadExecutionMode');
|
|
7778
|
+
const vusEnvEl = document.getElementById('loadVusEnvName');
|
|
7779
|
+
const durationEnvEl = document.getElementById('loadDurationEnvName');
|
|
7771
7780
|
if (baseEl) baseEl.value = loadBaseUrlDraft;
|
|
7772
7781
|
if (vusEl) vusEl.value = loadVusDraft;
|
|
7773
7782
|
if (durEl) durEl.value = loadDurationDraft;
|
|
7774
7783
|
if (dataEl) dataEl.value = loadDataDirDraft;
|
|
7775
7784
|
if (resultEl) resultEl.value = loadResultDirDraft;
|
|
7785
|
+
if (modeEl) modeEl.value = loadExecutionModeDraft;
|
|
7786
|
+
if (vusEnvEl) vusEnvEl.value = loadVusEnvNameDraft;
|
|
7787
|
+
if (durationEnvEl) durationEnvEl.value = loadDurationEnvNameDraft;
|
|
7776
7788
|
}
|
|
7777
7789
|
|
|
7778
7790
|
function renderLoad(c) {
|
|
@@ -7902,6 +7914,25 @@ function renderLoad(c) {
|
|
|
7902
7914
|
</div>
|
|
7903
7915
|
</div>
|
|
7904
7916
|
<div class="load-config-hint">VUs и Duration применяются через CLI k6 и переопределяют значения из <code>export const options</code>. Base URL доступен в скрипте как <code>__ENV.BASE_URL</code>.</div>
|
|
7917
|
+
<div class="load-config-row" style="margin-top:8px">
|
|
7918
|
+
<div class="load-config-field">
|
|
7919
|
+
<label>Execution</label>
|
|
7920
|
+
<select id="loadExecutionMode" style="width:150px">
|
|
7921
|
+
<option value="auto" ${loadExecutionModeDraft === 'auto' ? 'selected' : ''}>Auto</option>
|
|
7922
|
+
<option value="cli" ${loadExecutionModeDraft === 'cli' ? 'selected' : ''}>CLI override</option>
|
|
7923
|
+
<option value="script" ${loadExecutionModeDraft === 'script' ? 'selected' : ''}>Script scenarios</option>
|
|
7924
|
+
</select>
|
|
7925
|
+
</div>
|
|
7926
|
+
<div class="load-config-field">
|
|
7927
|
+
<label>VUs env</label>
|
|
7928
|
+
<input id="loadVusEnvName" type="text" value="${escapeHtml(loadVusEnvNameDraft)}" style="width:130px" placeholder="SMOKE_VUS" />
|
|
7929
|
+
</div>
|
|
7930
|
+
<div class="load-config-field">
|
|
7931
|
+
<label>Duration env</label>
|
|
7932
|
+
<input id="loadDurationEnvName" type="text" value="${escapeHtml(loadDurationEnvNameDraft)}" style="width:150px" placeholder="SMOKE_DURATION" />
|
|
7933
|
+
</div>
|
|
7934
|
+
</div>
|
|
7935
|
+
<div class="load-config-hint">Auto: если скрипт содержит <code>options.scenarios</code>, VibeRadar не передаёт <code>--vus/--duration</code>, а кладёт значения в env-переменные, например <code>SMOKE_VUS</code> и <code>SMOKE_DURATION</code>.</div>
|
|
7905
7936
|
<div class="load-config-row" style="margin-top:8px">
|
|
7906
7937
|
<div class="load-config-field" style="flex:1;min-width:260px">
|
|
7907
7938
|
<label>Data dir / file <span style="color:var(--dim);font-weight:400">(для <code>open('./users.csv')</code> и локальных lib)</span></label>
|
|
@@ -8004,11 +8035,17 @@ function renderLoad(c) {
|
|
|
8004
8035
|
const durationInput = document.getElementById('loadDuration');
|
|
8005
8036
|
const dataInput = document.getElementById('loadDataDir');
|
|
8006
8037
|
const resultInput = document.getElementById('loadResultDir');
|
|
8038
|
+
const modeInput = document.getElementById('loadExecutionMode');
|
|
8039
|
+
const vusEnvInput = document.getElementById('loadVusEnvName');
|
|
8040
|
+
const durationEnvInput = document.getElementById('loadDurationEnvName');
|
|
8007
8041
|
if (baseInput) baseInput.addEventListener('input', () => { loadBaseUrlDraft = baseInput.value || 'http://localhost:5000'; });
|
|
8008
8042
|
if (vusInput) vusInput.addEventListener('input', () => { loadVusDraft = parseInt(vusInput.value || '10', 10) || 10; });
|
|
8009
8043
|
if (durationInput) durationInput.addEventListener('input', () => { loadDurationDraft = durationInput.value || '30s'; });
|
|
8010
8044
|
if (dataInput) dataInput.addEventListener('input', () => { loadDataDirDraft = dataInput.value || ''; });
|
|
8011
8045
|
if (resultInput) resultInput.addEventListener('input', () => { loadResultDirDraft = resultInput.value || ''; });
|
|
8046
|
+
if (modeInput) modeInput.addEventListener('change', () => { loadExecutionModeDraft = modeInput.value || 'auto'; });
|
|
8047
|
+
if (vusEnvInput) vusEnvInput.addEventListener('input', () => { loadVusEnvNameDraft = vusEnvInput.value || 'SMOKE_VUS'; });
|
|
8048
|
+
if (durationEnvInput) durationEnvInput.addEventListener('input', () => { loadDurationEnvNameDraft = durationEnvInput.value || 'SMOKE_DURATION'; });
|
|
8012
8049
|
|
|
8013
8050
|
// Feature selector auto-generates script
|
|
8014
8051
|
const featSel = document.getElementById('loadFeature');
|
|
@@ -8048,6 +8085,9 @@ function loadOpenScript(name) {
|
|
|
8048
8085
|
if (s.duration) loadDurationDraft = s.duration;
|
|
8049
8086
|
loadDataDirDraft = s.dataDir || loadDataDirDraft;
|
|
8050
8087
|
loadResultDirDraft = s.resultDir || loadResultDirDraft;
|
|
8088
|
+
loadExecutionModeDraft = s.executionMode || loadExecutionModeDraft;
|
|
8089
|
+
loadVusEnvNameDraft = s.vusEnvName || loadVusEnvNameDraft;
|
|
8090
|
+
loadDurationEnvNameDraft = s.durationEnvName || loadDurationEnvNameDraft;
|
|
8051
8091
|
loadView = 'editor';
|
|
8052
8092
|
renderContent();
|
|
8053
8093
|
}
|
|
@@ -8078,12 +8118,19 @@ async function runLoadTest() {
|
|
|
8078
8118
|
const scriptName = (document.getElementById('loadScriptName')?.value || loadScriptNameDraft || 'Новый тест').trim();
|
|
8079
8119
|
const dataDir = (document.getElementById('loadDataDir')?.value || loadDataDirDraft || '').trim();
|
|
8080
8120
|
const resultDir = (document.getElementById('loadResultDir')?.value || loadResultDirDraft || '').trim();
|
|
8121
|
+
const executionModeRaw = (document.getElementById('loadExecutionMode')?.value || loadExecutionModeDraft || 'auto').trim();
|
|
8122
|
+
const executionMode = executionModeRaw === 'auto' ? undefined : executionModeRaw;
|
|
8123
|
+
const vusEnvName = (document.getElementById('loadVusEnvName')?.value || loadVusEnvNameDraft || 'SMOKE_VUS').trim();
|
|
8124
|
+
const durationEnvName = (document.getElementById('loadDurationEnvName')?.value || loadDurationEnvNameDraft || 'SMOKE_DURATION').trim();
|
|
8081
8125
|
loadBaseUrlDraft = baseUrl;
|
|
8082
8126
|
loadVusDraft = vus;
|
|
8083
8127
|
loadDurationDraft = duration;
|
|
8084
8128
|
loadScriptNameDraft = scriptName;
|
|
8085
8129
|
loadDataDirDraft = dataDir;
|
|
8086
8130
|
loadResultDirDraft = resultDir;
|
|
8131
|
+
loadExecutionModeDraft = executionModeRaw;
|
|
8132
|
+
loadVusEnvNameDraft = vusEnvName;
|
|
8133
|
+
loadDurationEnvNameDraft = durationEnvName;
|
|
8087
8134
|
|
|
8088
8135
|
loadLogLines = [];
|
|
8089
8136
|
loadBuckets = [];
|
|
@@ -8095,7 +8142,7 @@ async function runLoadTest() {
|
|
|
8095
8142
|
const r = await fetch('/api/load/run', {
|
|
8096
8143
|
method: 'POST',
|
|
8097
8144
|
headers: { 'Content-Type': 'application/json' },
|
|
8098
|
-
body: JSON.stringify({ script, vus, duration, baseUrl, scriptName, dataDir, resultDir, envVars }),
|
|
8145
|
+
body: JSON.stringify({ script, vus, duration, baseUrl, scriptName, dataDir, resultDir, executionMode, vusEnvName, durationEnvName, envVars }),
|
|
8099
8146
|
});
|
|
8100
8147
|
const d = await r.json();
|
|
8101
8148
|
if (!r.ok) { alert('Ошибка запуска: ' + (d.error || r.status)); return; }
|
|
@@ -8176,7 +8223,7 @@ ${featureList || '(нет данных)'}
|
|
|
8176
8223
|
**Шаг 2 — составь k6 скрипт.**
|
|
8177
8224
|
Требования:
|
|
8178
8225
|
1. Валидный JavaScript для k6 (import from 'k6/http', 'k6', 'k6/data')
|
|
8179
|
-
2.
|
|
8226
|
+
2. Можно использовать \`options.scenarios\`; тогда VibeRadar в Auto-режиме не будет передавать \`--vus/--duration\`, а прокинет значения UI в \`__ENV.SMOKE_VUS\` и \`__ENV.SMOKE_DURATION\`
|
|
8180
8227
|
3. \`export default function() { ... }\` с проверками \`check()\`
|
|
8181
8228
|
4. Base URL бери из \`__ENV.BASE_URL || '${baseUrl}'\`
|
|
8182
8229
|
5. Если нужна авторизация — добавь заголовок Authorization (Bearer-токен как переменную __ENV.TOKEN)
|
|
@@ -8297,17 +8344,23 @@ async function loadSaveScript() {
|
|
|
8297
8344
|
const duration = (document.getElementById('loadDuration')?.value || loadDurationDraft || '30s').trim();
|
|
8298
8345
|
const dataDir = (document.getElementById('loadDataDir')?.value || loadDataDirDraft || '').trim();
|
|
8299
8346
|
const resultDir = (document.getElementById('loadResultDir')?.value || loadResultDirDraft || '').trim();
|
|
8347
|
+
const executionMode = (document.getElementById('loadExecutionMode')?.value || loadExecutionModeDraft || 'auto').trim();
|
|
8348
|
+
const vusEnvName = (document.getElementById('loadVusEnvName')?.value || loadVusEnvNameDraft || 'SMOKE_VUS').trim();
|
|
8349
|
+
const durationEnvName = (document.getElementById('loadDurationEnvName')?.value || loadDurationEnvNameDraft || 'SMOKE_DURATION').trim();
|
|
8300
8350
|
loadScriptNameDraft = name;
|
|
8301
8351
|
loadBaseUrlDraft = baseUrl;
|
|
8302
8352
|
loadVusDraft = vus;
|
|
8303
8353
|
loadDurationDraft = duration;
|
|
8304
8354
|
loadDataDirDraft = dataDir;
|
|
8305
8355
|
loadResultDirDraft = resultDir;
|
|
8356
|
+
loadExecutionModeDraft = executionMode;
|
|
8357
|
+
loadVusEnvNameDraft = vusEnvName;
|
|
8358
|
+
loadDurationEnvNameDraft = durationEnvName;
|
|
8306
8359
|
try {
|
|
8307
8360
|
const r = await fetch('/api/load/scripts', {
|
|
8308
8361
|
method: 'POST',
|
|
8309
8362
|
headers: { 'Content-Type': 'application/json' },
|
|
8310
|
-
body: JSON.stringify({ name, script, baseUrl, vus, duration, dataDir, resultDir }),
|
|
8363
|
+
body: JSON.stringify({ name, script, baseUrl, vus, duration, dataDir, resultDir, executionMode, vusEnvName, durationEnvName }),
|
|
8311
8364
|
});
|
|
8312
8365
|
if (!r.ok) { const d = await r.json().catch(() => ({})); alert('Ошибка: ' + (d.error || r.status)); return; }
|
|
8313
8366
|
await loadRefreshScripts();
|
|
@@ -8327,6 +8380,9 @@ async function loadLoadScript(name) {
|
|
|
8327
8380
|
if (s.duration) loadDurationDraft = s.duration;
|
|
8328
8381
|
loadDataDirDraft = s.dataDir || loadDataDirDraft;
|
|
8329
8382
|
loadResultDirDraft = s.resultDir || loadResultDirDraft;
|
|
8383
|
+
loadExecutionModeDraft = s.executionMode || loadExecutionModeDraft;
|
|
8384
|
+
loadVusEnvNameDraft = s.vusEnvName || loadVusEnvNameDraft;
|
|
8385
|
+
loadDurationEnvNameDraft = s.durationEnvName || loadDurationEnvNameDraft;
|
|
8330
8386
|
const ta = document.getElementById('loadScriptEditor');
|
|
8331
8387
|
if (ta) { ta.value = s.script; ta.style.borderColor = 'var(--blue)'; setTimeout(() => { ta.style.borderColor = ''; }, 1500); }
|
|
8332
8388
|
const nameEl = document.getElementById('loadScriptName');
|