K6: stack overflow while processing a encrypt http request

Created on 23 May 2018  Â·  7Comments  Â·  Source: loadimpact/k6

The k6 process get a stack overflow fatal error while processing a encrypted http request.
In my case, the request body is packed in AES/ECB/PCKS5Padding with CryptoJS.

Here is the test code below, and see the modified CryptoJS here.

import { group, check, sleep } from 'k6';
import http from 'k6/http';
import crypto from 'k6/crypto';
import encoding from "k6/encoding";

import CryptoJS from "./crypto-js.js";


export function setup() {
    var key = "UITN25LMUQC436IM";
    var plain = 'this is a string will be AES_Encrypt';

    var encryptText = encrypt(key, plain);
    console.log(encryptText); // fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9

    var decryptedText = decrypt(key, encryptText);
    console.log(decryptedText);
}

export default function(data) {

    let appId = 1001;
    let appKey = "1234567890123456";

    let timestamp = new Date().getTime();
    let device = {"deviceId":"230a361e-25cc-3e40-bf44-c30761386b94"};
    let extraJson = {};
    var testData={
        "channelUid": 111,
        "channelToken": 111,
        "channelId": 9,
        "platformId": 1,
        "device": device,
        "extraJson": extraJson,
        "version": 1
    };

    let key = appKey.slice(16);
    let payload = encrypt(key, JSON.stringify(testData));

    let params = {
        "headers": {
            "Content-Type": "application/octet-stream; charset=UTF-8"
        }
    };

    // there is no statck overflow if uncomment the comments below
    //payload = "8LuVSO6p8PUwmP2UAWNv8ZqUtNXtoRsxTgGIjr52wRxEeKZTJgUNy6IUhNDTjWHJ1MaBmnkVbB9T0+N8nnDVvyysF8uoILurs9UDsHJ0DsDs3hOf5uCvCyNDIRvhBoTOgZdGNwDpdrwa2mGQ8tSLdR6hmkuyBevRuaiJG1fMpro85FVusUWg8dcsx0MaNB4dH5NGTNcTqwFHO9bBOeuanWe2A6Cn3gqLp+MQLhgH4zoC5AISQLQX0ChChDh8Yedy";
    let url = "https://apidev.any.com/testapi";
    let result = http.post(url, payload, params);
}

function encrypt(key, plain) {    
    key = CryptoJS.enc.Utf8.parse(key);
    plain = CryptoJS.enc.Utf8.parse(plain);
    var ciphertext = CryptoJS.AES.encrypt(plain, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
    return ciphertext;
}

function decrypt(key, cipher) {
    key = CryptoJS.enc.Utf8.parse(key);
    var decryptBytes = CryptoJS.AES.decrypt(cipher, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
    return decryptBytes.toString(CryptoJS.enc.Utf8);
}

Here is the stack trace:

INFO[0001] 0baa840038a54b78b9eff8d38cdf4865
runtime: goroutine stack exceeds 1000000000-byte limit==============] 1s / 1s
fatal error: stack overflow

runtime stack:
runtime.throw(0xc9296b, 0xe)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/panic.go:605 +0x9c
runtime.newstack(0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/stack.go:1050 +0x6ef
runtime.morestack()
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/asm_amd64.s:415 +0x8e

goroutine 30 [running]:
runtime.mapaccess1_faststr(0xb9e080, 0xc0440f4420, 0xc0468c2379, 0xf, 0xc0a8ff9438)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/hashmap_fast.go:208 +0x448 fp=0xc0a8ff9370 sp=0xc0a8ff9368 pc=0x40bc48
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*objectPropIter).next(0xc0ff67bb00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5166830)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:587 +0xdc fp=0xc0a8ff9440 sp=0xc0a8ff9370 pc=0x823a5c
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*objectPropIter).(github.com/loadimpact/k6/vendor/github.com/dop251/goja.next)-fm(0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:589 +0x98 fp=0xc0a8ff94b0 sp=0xc0a8ff9440 pc=0x86c6a8
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*propFilterIter).next(0xc0ff6674c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:559 +0xdf fp=0xc0a8ff9548 sp=0xc0a8ff94b0 pc=0x82370f
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*propFilterIter).(github.com/loadimpact/k6/vendor/github.com/dop251/goja.next)-fm(0x0, 0x0, 0x0, 0x0, 0x0, 0xc0e03633e0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/array.go:307 +0x98 fp=0xc0a8ff95b8 sp=0xc0a8ff9548 pc=0x866da8
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5e50, 0xc044d045c0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:511 +0xc9 fp=0xc0a8ff9698 sp=0xc0a8ff95b8 pc=0x823369
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d045c0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff96c0 sp=0xc0a8ff9698 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff97a0 sp=0xc0a8ff96c0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff97c8 sp=0xc0a8ff97a0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff98a8 sp=0xc0a8ff97c8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff98d0 sp=0xc0a8ff98a8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff99b0 sp=0xc0a8ff98d0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff99d8 sp=0xc0a8ff99b0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff9ab8 sp=0xc0a8ff99d8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff9ae0 sp=0xc0a8ff9ab8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff9bc0 sp=0xc0a8ff9ae0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff9be8 sp=0xc0a8ff9bc0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff9cc8 sp=0xc0a8ff9be8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff9cf0 sp=0xc0a8ff9cc8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff9dd0 sp=0xc0a8ff9cf0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff9df8 sp=0xc0a8ff9dd0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff9ed8 sp=0xc0a8ff9df8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ff9f00 sp=0xc0a8ff9ed8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ff9fe0 sp=0xc0a8ff9f00 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa008 sp=0xc0a8ff9fe0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa0e8 sp=0xc0a8ffa008 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa110 sp=0xc0a8ffa0e8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa1f0 sp=0xc0a8ffa110 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa218 sp=0xc0a8ffa1f0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa2f8 sp=0xc0a8ffa218 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa320 sp=0xc0a8ffa2f8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa400 sp=0xc0a8ffa320 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa428 sp=0xc0a8ffa400 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa508 sp=0xc0a8ffa428 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa530 sp=0xc0a8ffa508 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa610 sp=0xc0a8ffa530 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa638 sp=0xc0a8ffa610 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa718 sp=0xc0a8ffa638 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa740 sp=0xc0a8ffa718 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa820 sp=0xc0a8ffa740 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa848 sp=0xc0a8ffa820 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffa928 sp=0xc0a8ffa848 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffa950 sp=0xc0a8ffa928 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffaa30 sp=0xc0a8ffa950 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffaa58 sp=0xc0a8ffaa30 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffab38 sp=0xc0a8ffaa58 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffab60 sp=0xc0a8ffab38 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffac40 sp=0xc0a8ffab60 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffac68 sp=0xc0a8ffac40 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffad48 sp=0xc0a8ffac68 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffad70 sp=0xc0a8ffad48 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffae50 sp=0xc0a8ffad70 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffae78 sp=0xc0a8ffae50 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffaf58 sp=0xc0a8ffae78 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffaf80 sp=0xc0a8ffaf58 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb060 sp=0xc0a8ffaf80 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb088 sp=0xc0a8ffb060 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb168 sp=0xc0a8ffb088 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb190 sp=0xc0a8ffb168 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb270 sp=0xc0a8ffb190 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb298 sp=0xc0a8ffb270 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb378 sp=0xc0a8ffb298 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb3a0 sp=0xc0a8ffb378 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb480 sp=0xc0a8ffb3a0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb4a8 sp=0xc0a8ffb480 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb588 sp=0xc0a8ffb4a8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb5b0 sp=0xc0a8ffb588 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb690 sp=0xc0a8ffb5b0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb6b8 sp=0xc0a8ffb690 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb798 sp=0xc0a8ffb6b8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb7c0 sp=0xc0a8ffb798 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb8a0 sp=0xc0a8ffb7c0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb8c8 sp=0xc0a8ffb8a0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffb9a8 sp=0xc0a8ffb8c8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffb9d0 sp=0xc0a8ffb9a8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffbab0 sp=0xc0a8ffb9d0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffbad8 sp=0xc0a8ffbab0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffbbb8 sp=0xc0a8ffbad8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffbbe0 sp=0xc0a8ffbbb8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffbcc0 sp=0xc0a8ffbbe0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffbce8 sp=0xc0a8ffbcc0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffbdc8 sp=0xc0a8ffbce8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffbdf0 sp=0xc0a8ffbdc8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffbed0 sp=0xc0a8ffbdf0 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffbef8 sp=0xc0a8ffbed0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffbfd8 sp=0xc0a8ffbef8 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc000 sp=0xc0a8ffbfd8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc0e0 sp=0xc0a8ffc000 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc108 sp=0xc0a8ffc0e0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc1e8 sp=0xc0a8ffc108 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc210 sp=0xc0a8ffc1e8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc2f0 sp=0xc0a8ffc210 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc318 sp=0xc0a8ffc2f0 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc3f8 sp=0xc0a8ffc318 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc420 sp=0xc0a8ffc3f8 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc500 sp=0xc0a8ffc420 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d048e0, 0x6, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc528 sp=0xc0a8ffc500 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc04329e050, 0xc044d04ae0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc608 sp=0xc0a8ffc528 pc=0x8234a9
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*Object).Export(0xc044d04ae0, 0x9, 0x117db00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/value.go:700 +0x3b fp=0xc0a8ffc630 sp=0xc0a8ffc608 pc=0x84a7fb
github.com/loadimpact/k6/vendor/github.com/dop251/goja.(*baseObject).export(0xc044ce5f40, 0xc044d048e0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/dop251/goja/object.go:517 +0x209 fp=0xc0a8ffc710 sp=0xc0a8ffc630 pc=0x8234a9
...additional frames elided...
created by github.com/loadimpact/k6/core/local.(*Executor).scale
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/local/local.go:337 +0x366

goroutine 1 [select]:
github.com/loadimpact/k6/cmd.glob..func11(0x1303ce0, 0xc044df9bd0, 0x1, 0x5, 0x0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/cmd/run.go:336 +0x211a
github.com/loadimpact/k6/vendor/github.com/spf13/cobra.(*Command).execute(0x1303ce0, 0xc043cc7c00, 0x5, 0x8, 0x1303ce0, 0xc043cc7c00)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/spf13/cobra/command.go:698 +0x481
github.com/loadimpact/k6/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0x1303ac0, 0x52, 0xc044a60ea0, 0xc042041340)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/spf13/cobra/command.go:783 +0x315
github.com/loadimpact/k6/vendor/github.com/spf13/cobra.(*Command).Execute(0x1303ac0, 0x4044ab, 0xc04204c058)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/vendor/github.com/spf13/cobra/command.go:736 +0x32
github.com/loadimpact/k6/cmd.Execute()
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/cmd/root.go:81 +0x38
main.main()
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/main.go:28 +0x27

goroutine 18 [syscall]:
os/signal.signal_recv(0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/sigqueue.go:131 +0xad
os/signal.loop()
        /usr/local/Cellar/go/1.9.3/libexec/src/os/signal/signal_unix.go:22 +0x29
created by os/signal.init.0
        /usr/local/Cellar/go/1.9.3/libexec/src/os/signal/signal_unix.go:28 +0x48

goroutine 11 [select]:
net/http.(*persistConn).writeLoop(0xc0434a6000)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/transport.go:1759 +0x16c
created by net/http.(*Transport).dialConn
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/transport.go:1187 +0xa5a

goroutine 20 [IO wait]:
internal/poll.runtime_pollWait(0x52b6088, 0x72, 0xc0461c6018)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/netpoll.go:173 +0x5e
internal/poll.(*pollDesc).wait(0xc0461c6158, 0x72, 0x116c400, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_poll_runtime.go:85 +0xb5
internal/poll.(*ioSrv).ExecIO(0x130ac60, 0xc0461c6018, 0xc0454f2b60, 0x2, 0x1, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_windows.go:205 +0x13a
internal/poll.(*FD).acceptOne(0xc0461c6000, 0x1f0, 0xc046156000, 0x2, 0x2, 0xc0461c6018, 0x51aa028, 0xc0424b3be8, 0x41156f, 0x10)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_windows.go:767 +0xae
internal/poll.(*FD).Accept(0xc0461c6000, 0xc0438400a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_windows.go:801 +0x171
net.(*netFD).accept(0xc0461c6000, 0x1c40000, 0x0, 0xcbb148)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/fd_windows.go:192 +0x88
net.(*TCPListener).accept(0xc042078058, 0xc0424b3d98, 0x41156f, 0x30)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/tcpsock_posix.go:136 +0x35
net.(*TCPListener).AcceptTCP(0xc042078058, 0xc043d6c3c0, 0xc043d6c3c0, 0xb94b20)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/tcpsock.go:234 +0x50
net/http.tcpKeepAliveListener.Accept(0xc042078058, 0xc04205a0d8, 0xb94b20, 0x12f9750, 0xc4f4e0)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/server.go:3120 +0x36
net/http.(*Server).Serve(0xc042ce20d0, 0x11789e0, 0xc042078058, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/server.go:2695 +0x1b9
net/http.(*Server).ListenAndServe(0xc042ce20d0, 0xc042ce20d0, 0xc0454f2620)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/server.go:2636 +0xb0
net/http.ListenAndServe(0xc92837, 0xe, 0x116ed20, 0xc043d6c090, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/server.go:2882 +0x86
github.com/loadimpact/k6/api.ListenAndServe(0xc92837, 0xe, 0xc042d0ad20, 0x0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/api/server.go:51 +0x220
github.com/loadimpact/k6/cmd.glob..func11.2(0xc042d0ad20)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/cmd/run.go:206 +0x4e
created by github.com/loadimpact/k6/cmd.glob..func11
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/cmd/run.go:205 +0xfd0

goroutine 21 [select]:
github.com/loadimpact/k6/core.(*Engine).Run(0xc042d0ad20, 0x1178f60, 0xc0454345c0, 0x0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:205 +0xa15
github.com/loadimpact/k6/cmd.glob..func11.3(0xc04204d860, 0xc042d0ad20, 0x1178f60, 0xc0454345c0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/cmd/run.go:254 +0x46
created by github.com/loadimpact/k6/cmd.glob..func11
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/cmd/run.go:254 +0x1e66

goroutine 37 [select]:
github.com/loadimpact/k6/core.(*Engine).runMetricsEmission(0xc042d0ad20, 0x1178f60, 0xc04546e380)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:239 +0x12d
github.com/loadimpact/k6/core.(*Engine).Run.func2(0xc042d0ad20, 0x1178f60, 0xc04546e380, 0xc043844020)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:148 +0x4a
created by github.com/loadimpact/k6/core.(*Engine).Run
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:147 +0x6f0

goroutine 38 [select]:
github.com/loadimpact/k6/core.(*Engine).runThresholds(0xc042d0ad20, 0x1178f60, 0xc04546e380, 0xc0434cc010)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:267 +0x13a
github.com/loadimpact/k6/core.(*Engine).Run.func3(0xc042d0ad20, 0x1178f60, 0xc04546e380, 0xc0434cc010, 0xc043844020)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:157 +0x54
created by github.com/loadimpact/k6/core.(*Engine).Run
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:156 +0xd41

goroutine 39 [select]:
github.com/loadimpact/k6/core/local.(*Executor).Run.func1(0xc043976c60, 0x1178f60, 0xc04546e380, 0xc064f29f70, 0xc0434a21e0, 0xc046190ea0, 0xc0434a2180, 0xc043a51d48, 0xc0434d0000)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/local/local.go:185 +0x5a0
github.com/loadimpact/k6/core/local.(*Executor).Run(0xc043976c60, 0x1178f60, 0xc04546e380, 0xc0434d0000, 0x0, 0x0)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/local/local.go:260 +0x1045
github.com/loadimpact/k6/core.(*Engine).Run.func4(0xc04371c000, 0xc042d0ad20, 0x1178f60, 0xc04546e380, 0xc0434d0000, 0xc043844020)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:168 +0x60
created by github.com/loadimpact/k6/core.(*Engine).Run
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/engine.go:167 +0x801

goroutine 10 [IO wait]:
internal/poll.runtime_pollWait(0x52b5fc8, 0x72, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/netpoll.go:173 +0x5e
internal/poll.(*pollDesc).wait(0xc043350ed8, 0x72, 0x116c400, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_poll_runtime.go:85 +0xb5
internal/poll.(*ioSrv).ExecIO(0x130ac60, 0xc043350d98, 0xcba880, 0xc04657c00d, 0x1a57, 0x1ff3)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_windows.go:205 +0x13a
internal/poll.(*FD).Read(0xc043350d80, 0xc04657c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/internal/poll/fd_windows.go:458 +0x266
net.(*netFD).Read(0xc043350d80, 0xc04657c000, 0x2000, 0x2000, 0x10, 0xb666c0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/fd_windows.go:151 +0x59
net.(*conn).Read(0xc0438f2730, 0xc04657c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/net.go:176 +0x74
github.com/loadimpact/k6/lib/netext.(*Conn).Read(0xc0454a3aa0, 0xc04657c000, 0x2000, 0x2000, 0xc06b40, 0xc043d81300, 0x52b6208)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/lib/netext/dialer.go:89 +0x5c
crypto/tls.(*block).readFromUntil(0xc043d813b0, 0x52b6208, 0xc0454a3aa0, 0x5, 0xc0454a3aa0, 0xc04354e0f0)
        /usr/local/Cellar/go/1.9.3/libexec/src/crypto/tls/conn.go:488 +0x9c
crypto/tls.(*Conn).readRecord(0xc045806a80, 0xcbb117, 0xc045806ba0, 0x42e732)
        /usr/local/Cellar/go/1.9.3/libexec/src/crypto/tls/conn.go:590 +0xe7
crypto/tls.(*Conn).Read(0xc045806a80, 0xc043f0b000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
        /usr/local/Cellar/go/1.9.3/libexec/src/crypto/tls/conn.go:1134 +0x117
net/http.(*persistConn).Read(0xc0434a6000, 0xc043f0b000, 0x1000, 0x1000, 0xc043f57f00, 0xc0434a2118, 0x4524c0)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/transport.go:1391 +0x147
bufio.(*Reader).fill(0xc0453ae300)
        /usr/local/Cellar/go/1.9.3/libexec/src/bufio/bufio.go:97 +0x121
bufio.(*Reader).Peek(0xc0453ae300, 0x1, 0x0, 0x0, 0x0, 0xc04204dd40, 0xc0454d8380)
        /usr/local/Cellar/go/1.9.3/libexec/src/bufio/bufio.go:129 +0x41
net/http.(*persistConn).readLoop(0xc0434a6000)
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/transport.go:1539 +0x18c
created by net/http.(*Transport).dialConn
        /usr/local/Cellar/go/1.9.3/libexec/src/net/http/transport.go:1186 +0xa35

goroutine 32 [semacquire]:
sync.runtime_Semacquire(0xc043976c8c)
        /usr/local/Cellar/go/1.9.3/libexec/src/runtime/sema.go:56 +0x40
sync.(*WaitGroup).Wait(0xc043976c80)
        /usr/local/Cellar/go/1.9.3/libexec/src/sync/waitgroup.go:131 +0x79
github.com/loadimpact/k6/core/local.(*Executor).Run.func1.1(0xc043976c60, 0xc05beb0240)
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/local/local.go:179 +0x38
created by github.com/loadimpact/k6/core/local.(*Executor).Run.func1
        /Users/robin/Projects/go/src/github.com/loadimpact/k6/core/local/local.go:178 +0x15e
bug js-compat

All 7 comments

~Judging by your comment in the other issue, you're using the CryptoJS library. I'd be difficult to understand why the stack explodes just from that stack trace, can you share a minimal example of a k6 script that triggers this?~
Edit: nevermind, just saw that you edited the issue and added an example

And just for reference, assuming that this is some sort of JavaScript incompatibility, it may be related to https://github.com/loadimpact/k6/issues/594

Hi @na-- , I have upload a minimal example, it seams this stack overflow occurs before the request is sending, and if I asign the payload with a constant value, there is no stack overflow in this case. the symptom is different with #594 .

I did look into this, as I came about it by accident.
I did

console.log(typeof payload);
console.log(Object.keys(payload));
console.log(JSON.stringify(payload));

which got me

INFO[0002] object
INFO[0001] init,$super,ciphertext,key,iv,algorithm,mode,padding,blockSize,formatter
ERRO[0002] TypeError: Converting circular structure to JSON
        at apply (native)
        at stringify (core-js/shim.min.js:8:12588(84))
        at file:///home/mstoykov/.gvm/pkgsets/go1.14.4/global/src/github.com/loadimpact/k6/bug_644/base.js:52:31(90)

So apparently it is some kind of circular structure that explains the stackoverflow above. To fix it I called payload.toString which outputted

INFO[0001] 8LuVSO6p8PUwmP2UAWNv8ZqUtNXtoRsxTgGIjr52wRxEeKZTJgUNy6IUhNDTjWHJ1MaBmnkVbB9T0+N8nnDVvyysF8uoILurs9UDsHJ0DsDs3hOf5uCvCyNDIRvhBoTOgZdGNwDpdrwa2mGQ8tSLdR6hmkuyBevRuaiJG1fMpro85FVusUWg8dcsx0MaNB4d5NGTNcTqwFHO9bBOeuanWe2A6Cn3gqLp+MQLhgH4zoC5AISQLQX0ChChDh8Yedy

Arguably though k6 should find out this is a circular structure somehow and abort in a nicer way, similar to how JSON.stringify does

I implement the AES encrypt and decrypt in golang for k6 due to the stack overflow and performance issues, the performance is so bad if the script executes AES using crypto-js.js in k6.

@gushengyuan as I said above, the code you provided was almost correct and with the small change provided I ran the below code on my laptop(with AMD Ryzen 5 3500U and not at full rest):

import { group, check, sleep } from 'k6';
import http from 'k6/http';
import crypto from 'k6/crypto';
import encoding from "k6/encoding";

import CryptoJS from "./crypto-js.js";


export function setup() {
    var key = "UITN25LMUQC436IM";
    var plain = 'this is a string will be AES_Encrypt';

    var encryptText = encrypt(key, plain);
    console.log(encryptText); // fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9

    var decryptedText = decrypt(key, encryptText);
    console.log(decryptedText);
}

export default function(data) {

    let appId = 1001;
    let appKey = "1234567890123456";

    let timestamp = new Date().getTime();
    let device = {"deviceId":"230a361e-25cc-3e40-bf44-c30761386b94"};
    let extraJson = {};
    var testData={
        "channelUid": 111,
        "channelToken": 111,
        "channelId": 9,
        "platformId": 1,
        "device": device,
        "extraJson": extraJson,
        "version": 1
    };

    let key = appKey.slice(16);
    let payload = encrypt(key, JSON.stringify(testData));

    let params = {
        "headers": {
            "Content-Type": "application/octet-stream; charset=UTF-8"
        }
    };

    // there is no statck overflow if uncomment the comments below
    //payload = "8LuVSO6p8PUwmP2UAWNv8ZqUtNXtoRsxTgGIjr52wRxEeKZTJgUNy6IUhNDTjWHJ1MaBmnkVbB9T0+N8nnDVvyysF8uoILurs9UDsHJ0DsDs3hOf5uCvCyNDIRvhBoTOgZdGNwDpdrwa2mGQ8tSLdR6hmkuyBevRuaiJG1fMpro85FVusUWg8dcsx0MaNB4dH5NGTNcTqwFHO9bBOeuanWe2A6Cn3gqLp+MQLhgH4zoC5AISQLQX0ChChDh8Yedy";
    let url = "https://apidev.any.com/testapi";
    // let result = http.post(url, payload, params);
    //console.log(typeof payload);
//    console.log(payload);
}

function encrypt(key, plain) {    
    key = CryptoJS.enc.Utf8.parse(key);
    plain = CryptoJS.enc.Utf8.parse(plain);
    var ciphertext = CryptoJS.AES.encrypt(plain, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
    return ciphertext.toString();
}

function decrypt(key, cipher) {
    key = CryptoJS.enc.Utf8.parse(key);
    var decryptBytes = CryptoJS.AES.decrypt(cipher, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
    return decryptBytes.toString(CryptoJS.enc.Utf8);
}

$ /usr/bin/time -v k6.v0.27.1 run -u 300 -d 1m base.js

          /\      |‾‾|  /‾‾/  /‾/
     /\  /  \     |  |_/  /  / /
    /  \/    \    |      |  /  ‾‾\
   /          \   |  |‾\  \ | (_) |
  / __________ \  |__|  \__\ \___/ .io

  execution: local
     script: base.js
     output: -

  scenarios: (100.00%) 1 executors, 300 max VUs, 1m30s max duration (incl. graceful stop):
           * default: 300 looping VUs for 1m0s (gracefulStop: 30s)

INFO[0005] fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9
INFO[0005] this is a string will be AES_Encrypt

running (1m00.2s), 000/300 VUs, 62913 complete and 0 interrupted iterations
default ✓ [======================================] 300 VUs  1m0s


    â–ˆ setup

    data_received........: 0 B   0 B/s
    data_sent............: 0 B   0 B/s
    iteration_duration...: avg=285.96ms min=2.64ms med=221.53ms max=1.78s p(90)=511.79ms p(95)=569.14ms
    iterations...........: 62913 1045.374544/s
    vus..................: 300   min=300 max=300
    vus_max..............: 300   min=300 max=300

        Command being timed: "k6.v0.27.1 run -u 300 -d 1m base.js"
        User time (seconds): 391.23
        System time (seconds): 5.35
        Percent of CPU this job got: 595%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 1:06.62
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2644224
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 694278
        Voluntary context switches: 14573
        Involuntary context switches: 358960
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

I wouldn't say this performance is great, but arguably can be used if you won't just AES encode/decode things all the time

Hi, I have the same use case but it's using RS256 for the encryption. For the RSA I'm using jsencrypt and for the hashing using k6/crypto and it's working.

import crypto from 'k6/crypto';
import { sleep } from 'k6';
import { JSEncrypt } from './jsencrypt.js'

const secretFile = open("./artifacts/secrets/secret.key");

let encrypt = (secret, data) => {
  let sign = new JSEncrypt();
  sign.setPrivateKey(secret);

  return sign.sign(data, (d) => {
      return crypto.sha256(d, 'hex');
  }, "sha256");
};

export function setup() {
  let payload = {
    "username": "your-username",
    "password": "your-password"
  };

  let token = encrypt(secretFile, JSON.stringify(payload));
  return {
    payload: payload,
    token: token
  }
}

export default function(data) {
  // console.log("payload", data.payload);
  console.log("token", data.token);
  sleep(1);
}

and this is the result


          /\      |‾‾|  /‾‾/  /‾/
     /\  /  \     |  |_/  /  / /
    /  \/    \    |      |  /  ‾‾\
   /          \   |  |‾\  \ | (_) |
  / __________ \  |__|  \__\ \___/ .io

  execution: local
     script: main.js
     output: -

  scenarios: (100.00%) 1 executors, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)

INFO[0011] token                                         0="ItF/IwHDnyirvBWNVJFLLeGBpgVm4qB16znin8YZePL7y+e1YYglPaDDWElMI+un0VUlsrd6eBc5MoPX2TS6WF2GY1ds247UWaXMOynHNpAPQGmmqv+b/snyABMFbaRoZviZaFRhiI97CVc08mL6GVf8PSZqfkJgcqcLsqfGzsZvY7V9r9JuS5M499VapQZ1bwRkLRKzVs7U7q/2ttQkdGJwmKziWjSY/d/Vk7W3YVzJMZD7+k8+bvNdhRGsx42AR9+hV5w1hXo7cqVJ5QS7V6z4rjgaw0jsiX/JUpbzt425sDtqfvqR0PrdwAom8LTbAHJgJTefirYk3SgXWY8eVA=="

running (00m11.7s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m01.0s/10m0s  1/1 iters, 1 per VU


    data_received........: 0 B 0 B/s
    data_sent............: 0 B 0 B/s
    iteration_duration...: avg=5.8s min=1s med=5.8s max=10.6s p(90)=9.64s p(95)=10.12s
    iterations...........: 1   0.085826/s
    vus..................: 1   min=0 max=1
    vus_max..............: 1   min=1 max=1

_notes: you have to make small modification in jsencrypt file, just comment out all the code that using navigator and window_

After https://github.com/dop251/goja/commit/536f9d946569e0a079a1b6a7ec8fcdea3086aeed it seems like the object is correctly exported to a recursive structure in go, but then fails when we transform it to a string


goroutine 57 [running]:
fmt.(*pp).handleMethods(0xc000a77c70, 0xc000000076, 0x98)
        fmt/print.go:574 +0x6ac fp=0xc023a00538 sp=0xc023a00530 pc=0x4e2dac
fmt.(*pp).printValue(0xc000a77c70, 0xdde6a0, 0xc0110fcf50, 0x98, 0x76, 0x115b0b)
        fmt/print.go:727 +0x25e4 fp=0xc023a00710 sp=0xc023a00538 pc=0x4e5d64
fmt.(*pp).printValue(0xc000a77c70, 0xe279a0, 0xc000cf2270, 0x15, 0xc000000076, 0x115b0a)
        fmt/print.go:782 +0xddb fp=0xc023a008e8 sp=0xc023a00710 pc=0x4e455b
fmt.(*pp).printValue(0xc000a77c70, 0xe0f800, 0xc0110fcec0, 0x94, 0x76, 0x115b09)
        fmt/print.go:823 +0x17f7 fp=0xc023a00ac0 sp=0xc023a008e8 pc=0x4e4f77
fmt.(*pp).printValue(0xc000a77c70, 0xe279a0, 0xc000cf2480, 0x15, 0xc000000076, 0x115b08)
        fmt/print.go:784 +0xe6b fp=0xc023a00c98 sp=0xc023a00ac0 pc=0x4e45eb
fmt.(*pp).printValue(0xc000a77c70, 0xe0f800, 0xc0110fce40, 0x94, 0x76, 0x115b07)
        fmt/print.go:823 +0x17f7 fp=0xc023a00e70 sp=0xc023a00c98 pc=0x4e4f77
fmt.(*pp).printValue(0xc000a77c70, 0xe279a0, 0xc000cf2450, 0x15, 0xc000000076, 0x115b06)
        fmt/print.go:784 +0xe6b fp=0xc023a01048 sp=0xc023a00e70 pc=0x4e45eb
fmt.(*pp).printValue(0xc000a77c70, 0xe0f800, 0xc0110fcd80, 0x94, 0x76, 0x115b05)
        fmt/print.go:823 +0x17f7 fp=0xc023a01220 sp=0xc023a01048 pc=0x4e4f77
fmt.(*pp).printValue(0xc000a77c70, 0xe279a0, 0xc000cf24e0, 0x15, 0xc000000076, 0x115b04)

https://github.com/loadimpact/k6/blob/229c3c3ca0bbf8ffe2b1c1ec93c6a10404416d5d/js/console.go#L56-L67

maybe that should be a goja issue as well :thinking:

Was this page helpful?
0 / 5 - 0 ratings

Related issues

StephenRadachy picture StephenRadachy  Â·  3Comments

ppcano picture ppcano  Â·  3Comments

if-kenn picture if-kenn  Â·  4Comments

msznek picture msznek  Â·  3Comments

na-- picture na--  Â·  3Comments