K6 extension to perform tests on couchbase.
- Supports inserting a document.
- Supports Batch insertion.
- Supports findOne (Fetch by primary key)
- Supports deleting a document by id
- Supports upserts
- Testing query performance
- Prepared statement query performance
- Install xk6 using (go install go.k6.io/xk6/cmd/xk6@latest)
git clone git@github.com:thotasrinath/xk6-couchbase.git
cd xk6-couchbase
xk6 build --output xk6-couchbase --with github.com/thotasrinath/xk6-couchbase=.
xk6 build --with github.com/thotasrinath/xk6-couchbase@latest
import xk6_couchbase from 'k6/x/couchbase';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default () => {
let doc = {
correlationId: `test--couchbase`,
title: 'Perf test experiment',
url: 'example.com',
locale: 'en',
time: `${new Date(Date.now()).toISOString()}`
};
client.insert("test", "_default", "_default", makeId(15), doc);
}
function makeId(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
# Update examples/test-insert.js with cluster credentials and bucket name
./xk6-couchbase run --vus 10 --duration 30s examples/test-insert.js
import xk6_couchbase from 'k6/x/couchbase';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
const batchsize = 50;
export default () => {
var docobjs = {}
for (var i = 0; i < batchsize; i++) {
docobjs[makeId(15)] = getRecord();
}
client.insertBatch("test", "_default", "_default", docobjs);
}
function getRecord() {
return {
correlationId: `test--couchbase`,
title: 'Perf test experiment',
url: 'example.com',
locale: 'en',
time: `${new Date(Date.now()).toISOString()}`
};
}
function makeId(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
import xk6_couchbase from 'k6/x/couchbase';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default () => {
// syntax :: client.findOne("<db>", "<scope>", "<keyspace>", "<docId>");
var res = client.findOne("test", "_default", "_default", "002wPJwiJArcUpz");
console.log(res);
}
import xk6_couchbase from 'k6/x/couchbase';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default () => {
client.remove("test", "_default", "_default", "002wPJwiJArcUpz", doc);
}
import xk6_couchbase from 'k6/x/couchbase';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default () => {
var res = client.find("select * from test._default._default use keys \"00096zszpZaT47X\"");
//console.log(res);
}
import xk6_couchbase from 'k6/x/couchbase';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default () => {
var res = client.findByPreparedStmt("select * from test._default._default use keys \"00096zszpZaT47X\"");
//console.log(res);
}
Initial data load is expected. Data with sequential Id's could be generated with below script. File - examples/load-sequential-data.js
import xk6_couchbase from 'k6/x/couchbase';
const jobConfig = {
vus: 10,
count: 10000
}
export const options = {
scenarios: {
contacts: {
executor: 'per-vu-iterations',
vus: jobConfig.vus,
iterations: jobConfig.count
},
},
};
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default function () {
let doc = {
correlationId: `test--couchbase`,
title: 'Perf test experiment',
url: 'example.com',
locale: 'en',
time: `${new Date(Date.now()).toISOString()}`
};
let docId = ((__VU - 1) * jobConfig.count) + __ITER;
client.insert("test", "_default", "_default", String(docId), doc);
}
import xk6_couchbase from 'k6/x/couchbase';
import {randomIntBetween} from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
const client = xk6_couchbase.newClient('localhost', '<username>', '<password>');
export default () => {
let doc = {
correlationId: `test--couchbase`,
title: 'Perf test experiment',
url: 'example.com',
locale: 'en',
time: `${new Date(Date.now()).toISOString()}`,
randomNo: randomIntBetween(0,1000000)
};
client.upsert("test", "_default", "_default", String(randomIntBetween(0, 100000)), doc);
}