Unlocking the Power of k6 with xk6-sql: A Step-by-Step Guide

Feb 10, 2023 | Programming

Have you ever wondered how to harness the power of the k6 extension known as xk6-sql to interact with various relational databases? In this guide, we will take you through the process of building and using xk6-sql, supported RDBMSs, and troubleshooting tips that will ensure your journey into load testing becomes smooth and effective.

Table of Contents

Building Your k6 Binary with xk6-sql

To begin, you need to ensure you have the right prerequisites installed. This includes:

  • Go toolchain
  • If using SQLite, ensure you have a build toolchain installed that includes gcc or another C compiler. On Debian-based systems, you can install the build-essential package.
  • If you’re on Windows, tdm-gcc should be set up.
  • Git

Once you have these installed, here’s how you can build the k6 binary:

go install go.k6.io/xk6/cmd/xk6@latest
xk6 build --with github.com/grafana/xk6-sql

If you’re using SQLite, you must set CGO_ENABLED=1:

CGO_ENABLED=1 xk6 build --with github.com/grafana/xk6-sql

On Windows, the command looks slightly different:

set CGO_ENABLED=1 & xk6 build --with github.com/grafana/xk6-sql

Streamlining Development

To make your development process more seamless, you can use the Makefile provided in the root folder. The default target will:

  • Format your code
  • Run tests
  • Create a k6 binary with your local code instead of from GitHub

Simply execute:

make

Once you’ve built your k6 binary, you can run it with the following command:

.k6 run examples/sqlite3_test.js

Example Usage: Understanding the Code

Let’s dig into the script that showcases how to use xk6-sql. Think of it like a recipe in a kitchen:

  • Your ingredients are the required packages and the database you’re using.
  • The setup function is like preparing your kitchen – you’re creating the necessary table.
  • The teardown function is cleaning up – you’re closing the database connection afterward.
  • The default function executes like cooking – it runs the commands to insert and query data.

Here’s the script in action:

import sql from 'k6/x/sql';
const db = sql.open('sqlite3', './test.db');

export function setup() {
   db.exec('CREATE TABLE IF NOT EXISTS keyvalues (id integer PRIMARY KEY AUTOINCREMENT, key varchar NOT NULL, value varchar);');
}

export function teardown() {
   db.close();
}

export default function () {
   db.exec('INSERT INTO keyvalues (key, value) VALUES("plugin-name", "k6-plugin-sql");');
   let results = sql.query(db, 'SELECT * FROM keyvalues;');
   for (const row of results) {
     console.log('key: ' + row.key + ', value: ' + row.value);
   }
}

TLS Support: Keeping Connections Secure

It’s crucial to safeguard your database connections. Currently, TLS support is available exclusively for the MySQL driver. You can enable it by incorporating sql.loadTLS before opening your database connection. Here’s how:

sql.loadTLS({
    enableTLS: true,
    insecureSkipTLSverify: true,
    minVersion: sql.TLS_1_2,
    caCertFile: 'filepath/to/ca.pem',
    clientCertFile: 'filepath/to/client-cert.pem',
    clientKeyFile: 'filepath/to/client-key.pem',
});

Support for Additional RDBMSs

The current project limits support to specific SQL implementations. While additional RDBMS support is not accepted, there are community forks available that extend functionality, such as:

These forks can be included in your build commands, making it easier to work with different databases.

Using Docker for Extended k6

If you want to avoid local installation or simply prefer running the extended k6 in a container, Docker is your friend. Build a custom k6 image using:

docker build -t grafana/k6-for-sql:latest .

Then, run your script with:

docker run -v $PWD:/scripts -it --rm grafana/k6-for-sql:latest run scripts/sqlite3_test.js

For easier execution, you can also utilize the docker-run.sh script on Mac or Linux:

./docker-run.sh examples/sqlite3_test.js

Troubleshooting Tips

If you encounter any issues during your setup or execution, here are some troubleshooting ideas:

  • Ensure that all prerequisites are installed correctly.
  • Double-check your Docker configuration if running within a container.
  • Verify environment variables and paths are correctly set for the C compiler.

For more insights, updates, or to collaborate on AI development projects, stay connected with fxis.ai.

At fxis.ai, we believe that such advancements are crucial for the future of AI, as they enable more comprehensive and effective solutions. Our team is continually exploring new methodologies to push the envelope in artificial intelligence, ensuring that our clients benefit from the latest technological innovations.

Stay Informed with the Newest F(x) Insights and Blogs

Tech News and Blog Highlights, Straight to Your Inbox