こんにちは。よっしーです(^^)
今日は、k6におけるk6/executionについてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のk6/executionについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
k6/execution
k6/executionは、テストスクリプト内で現在のテスト実行状態に関する情報を取得する機能を提供します。テスト実行中に、テストスクリプト内で実行状態を読み取り、現在の状態に基づいてスクリプトのロジックを変更することができます。
k6/executionモジュールは、以下のプロパティを使用してテスト実行情報を提供します:
- インスタンス(instance)
- シナリオ(scenario)
- テスト(test)
- VU(Virtual User)
import exec from 'k6/execution';
const options = {
scenarios: {
myscenario: {
// this will be the returned name
executor: 'shared-iterations',
maxDuration: '30m',
},
},
};
export default function () {
console.log(exec.scenario.name); // myscenario
}
すべてのユニークな識別子は、ゼロ(反復回数)またはワン(VU ID)から始まる連続的に生成されます。分散/クラウドテスト実行では、テスト全体の反復回数とVU識別子はインスタンス間で依然として一意であるはずですが、例えば一部のインスタンスが他のインスタンスよりも速い反復を実行したり、テスト中により多くのVUを割り当てたりすると、シーケンスにギャップが生じるかもしれません。
インスタンス(instance)
インスタンスオブジェクトは、ロードジェネレーターインスタンスに関連する情報を提供します。これは、ローカルマシンでk6を実行している場合、おそらく単一のプロセスと考えることができます。複数のロードジェネレーターインスタンスを使用してクラウド/分散テストを実行する場合、以下のプロパティの値はインスタンスごとに異なることがあります。
- iterationsInterrupted integer 現在のインスタンスで中断された反復の数。
- iterationsCompleted integer 現在のインスタンスで完了した反復の数。
- vusActive integer アクティブなVUの数。
- vusInitialized integer 現在初期化されているVUの数。
- currentTestRunDuration float 現在のテスト実行の開始からの経過時間(ミリ秒単位)。
シナリオ(scenario)
現在実行中のシナリオに関するメタ情報および実行の詳細情報です。
- name string 実行中のシナリオに割り当てられた名前。
- executor string 実行中のエグゼキュータータイプの名前。
- startTime integer シナリオが開始されたUnixタイムスタンプ(ミリ秒単位)。
- progress float シナリオの進行状況を0から1の間の割合で表したもの。
- iterationInInstance integer シナリオ内の現在の反復のユニークでゼロベースの連続番号で、現在のインスタンス全体で一意です。
- iterationInTest integer シナリオ内の現在の反復のユニークでゼロベースの連続番号で、ローカル、クラウド、分散/セグメンテーションテストのすべてのk6実行モードで一意です。ただし、クラウド/分散テストではすべてのインスタンスが重複しないインデックス値を取得しますが、それらを異なる速度で反復することがあるため、値は異なるインスタンス間で連続的ではないかもしれません。
テスト(test)
テスト実行を制御します。
- abort([String]) 関数 この関数は、エラーコード108でテスト実行を中断し、オプションの文字列パラメーターを指定することでエラーメッセージを提供できます。テストを中断しても teardown() の実行を防ぎません。
- options オブジェクト この関数は、すべてのテストオプションをプロパティとして持つオブジェクトを返します。オプションの値は、優先順位の順序に従って統合され、ショートカットが使用されている場合は派生します。相対オプションが定義されていないプロパティについては null を返します。
Virtual User(vu)
vu 現在のVirtual User(VU)に関するメタ情報と実行の詳細情報です。
- iterationInInstance integer 現在のインスタンス内でのこのVUの反復の識別子。これは現在のVUとこのインスタンス(複数のインスタンスの場合)に対してのみ一意です。特定のVUが複数のシナリオ間で再利用される場合、これは集約され続けます。
- iterationInScenario integer 現在のシナリオ内でのこのVUの反復の識別子。これは現在のVUと現在実行中のシナリオに対してのみ一意です。
- idInInstance integer インスタンス全体でのVUの識別子。複数のインスタンス間では一意ではありません。
- idInTest integer テスト全体の中で一意なVUの識別子。
- metrics.tags object VUのタグを制御するマップ。タグはVUによって発行されるすべてのメトリクスに含まれ、VUが存在する間、同じシナリオの異なる反復間でタグの状態が維持されます。
- metrics.metadata object VUのメタデータを制御するマップ。メタデータはVUによって発行されるすべてのメトリクスに含まれ、VUが存在する間、同じシナリオの異なる反復間でメタデータの状態が維持されます。
例と使用ケース
ユニークなデータの取得
これはデータのパラメータ化の一般的な使用ケースです。scenario.iterationInTestおよびvu.idInTestを使用して、ユニークなデータを読み取る例があります。
タイミング操作
scenarioオブジェクトのstartTimeプロパティは、操作のタイミングを計測するために使用できます。
import exec from 'k6/execution';
export default function () {
// do some long operations
// ...
console.log(`step1: scenario ran for ${new Date() - new Date(exec.scenario.startTime)}ms`);
// some more long operations
//...
console.log(`step2: scenario ran for ${new Date() - new Date(exec.scenario.startTime)}ms`);
}
スクリプトの命名
nameプロパティは、現在実行中のスクリプトに基づいてロジックを実行するために使用できます。
ヒント: スクリプト内で複数のシナリオを実行する必要がある場合、execオプションを使用して類似の目標を達成できます。
import exec from 'k6/execution';
const options = {
scenarios: {
'the-first': {
// ...
},
'the-second': {
// ...
},
},
};
export default function () {
if (exec.scenario.name === 'the-first') {
// do some logic during this scenario
} else {
// do some other logic in the others
}
}
テストの中断
テストの初期化中に中断することができます。
import exec from 'k6/execution';
exec.test.abort();
デフォルトの関数内でも中断することができます。
import exec from 'k6/execution';
export default function () {
// Note that you can abort with a specific message too
exec.test.abort('this is the reason');
}
export function teardown() {
console.log('teardown will still be called after test.abort()');
}
テストオプションを取得する
統合および派生したオプションの値を取得します。
import exec from 'k6/execution';
export const options = {
stages: [
{ duration: '5s', target: 100 },
{ duration: '5s', target: 50 },
],
};
export default function () {
console.log(exec.test.options.paused); // null
console.log(exec.test.options.scenarios.default.stages[0].target); // 100
}
タグ
vu.metrics.tagsプロパティを使用して、VUのタグを取得または設定できます。
import http from 'k6/http';
import exec from 'k6/execution';
export default function () {
exec.vu.metrics.tags['mytag'] = 'value1';
exec.vu.metrics.tags['mytag2'] = 2;
// the metrics these HTTP requests emit will get tagged with `mytag` and `mytag2`:
http.batch(['https://test.k6.io', 'https://test-api.k6.io']);
}
vu.tags(metricsなし)も使用できますが、よりコンテキストに合ったバリアントがあるため、非推奨です。
メタデータ
vu.metrics.metadataプロパティを使用して、VUのメタデータを取得または設定できます。これはタグと類似していますが、高カーディナリティのデータに使用できます。また、しきい値で使用することはできず、各出力で異なる方法で処理される可能性があります。
import http from 'k6/http';
import exec from 'k6/execution';
export default function () {
exec.vu.metrics.metadata['trace_id'] = 'somecoolide';
// the metrics these HTTP requests emit will get the metadata `trace_id`:
http.batch(['https://test.k6.io', 'https://test-api.k6.io']);
delete exec.vu.metrics.metadata['trace_id'] // this will unset it
// which will make the metrics these requests to not have the metadata `trace_id` set on them.
http.batch(['https://test.k6.io', 'https://test-api.k6.io']);
}
おわりに
今日は、k6におけるk6/executionについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント