Documentation for automated readers
A curated documentation index is available at: https://grafana.com/llms.txt
A complete documentation index is available at: https://grafana.com/llms-full.txt
These indexes can help with page discovery before fetching individual documents.
This page is also available in Markdown, which may be easier for automated readers and AI tools to parse than HTML. The Markdown version is available at https://grafana.com/docs/k6/next/examples/websockets.md, or by sending Accept: text/markdown to https://grafana.com/docs/k6/next/examples/websockets/. For broader documentation discovery, the curated index is available at https://grafana.com/llms.txt and the complete index is available at https://grafana.com/llms-full.txt.
This is documentation for the next version of Grafana k6 documentation. For the latest stable release, go to the latest version.
WebSockets
Here’s a load test for the QuickPizza WebSocket API, available on https://quickpizza.grafana.com/ws.
Multiple VUs connect using a VU-indexed user name, and send random messages.
Each VU receives messages sent by all other VUs.
import { randomString, randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
import ws from 'k6/ws';
import { check, sleep } from 'k6';
const sessionDuration = randomIntBetween(3000, 6000); // user session between 3s and 6s
export const options = {
vus: 10,
iterations: 10,
};
export default function () {
const url = `wss://quickpizza.grafana.com/ws`;
const params = { tags: { my_tag: 'my ws session' } };
const user = `user_${__VU}`;
const res = ws.connect(url, params, function (socket) {
socket.on('open', function open() {
console.log(`VU ${__VU}: connected`);
socket.send(JSON.stringify({ msg: 'Hello!', user: user }));
socket.setInterval(function timeout() {
socket.send(
JSON.stringify({
user: user,
msg: `I'm saying ${randomString(5)}`,
foo: 'bar',
})
);
}, randomIntBetween(1000, 2000)); // say something every 1-2 seconds
});
socket.on('ping', function () {
console.log('PING!');
});
socket.on('pong', function () {
console.log('PONG!');
});
socket.on('close', function () {
console.log(`VU ${__VU}: disconnected`);
});
socket.on('message', function (message) {
const data = JSON.parse(message);
console.log(`VU ${__VU} received message: ${data.msg}`);
});
socket.setTimeout(function () {
console.log(`VU ${__VU}: ${sessionDuration}ms passed, leaving the website`);
socket.send(JSON.stringify({ msg: 'Goodbye!', user: user }));
}, sessionDuration);
socket.setTimeout(function () {
console.log(`Closing the socket forcefully 3s after graceful LEAVE`);
socket.close();
}, sessionDuration + 3000);
});
check(res, { 'Connected successfully': (r) => r && r.status === 101 });
sleep(1);
}Was this page helpful?
Related resources from Grafana Labs

