Setting Up Load Testing and Monitoring with Docker, k6, Prometheus, Grafana, and InfluxDB

Justine Peterson Mahinyila
3 min readNov 2, 2024

This guide covers configuring k6 for load testing, Prometheus and Grafana for monitoring, and InfluxDB for optional long-term metric storage using Docker. Each tool will be configured to work together in a containerized environment, allowing you to simulate high loads and monitor real-time performance metrics effectively.

Table of Contents

  1. Load Testing with k6
  • Setting up k6
  • Creating a load test script

2. Prometheus and Grafana Monitoring Setup

  • Configuring Prometheus
  • Integrating Grafana for visualizations

3. Optional: Long-Term Storage with InfluxDB

4. Complete docker-compose.yml Setup

Step 1: Load Testing with k6 k6 is a popular tool for running load tests to simulate real-world usage and assess your application’s performance under pressure.

1.1 Setting Up k6 in Docker Compose Add a k6 service to your docker-compose.yml file:

YAML

services:
k6:
image: grafana/k6
volumes:
- type: bind
source: ./load-testing
target: /load-testing
entrypoint: ["k6", "run", "/load-testing/load-test.js"]

Here:

  • volumes: Mounts the load-testing folder from your host to /load-testing in the container, so k6 can access the load-test.js script.
  • entrypoint: Defines the default command for k6 to run the test script.

1.2 Writing a k6 Load Test Script Create a load-test.js file inside a load-testing folder on your host machine:

JavaScript

import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
stages: [
{ duration: '1m', target: 200 },
{ duration: '3m', target: 200 },
{ duration: '1m', target: 0 },
],
};
export default function () {
http.get('http://host.docker.internal:3000'); // Adjust if needed
sleep(1);
}

This script simulates a ramp-up to 200 requests per second, maintains that load for 3 minutes, and then ramps down.

Step 2: Prometheus and Grafana Monitoring Setup Prometheus and Grafana allow you to monitor and visualize metrics like response times, request rates, and system load in real-time.

2.1 Configuring Prometheus Create a prometheus.yml file for Prometheus:

YAML

global:
scrape_interval: 15s
scrape_configs:
- job_name: 'kafka'
static_configs:
- targets: ['kafka:9092']
- job_name: 'express-app'
static_configs:
- targets: ['host.docker.internal:3000'] # No "http://"

In this configuration:

  • scrape_interval: Determines how often Prometheus collects metrics.
  • scrape_configs: Specifies targets, such as Kafka on 9092 and your application on 3000.

Add the Prometheus service to your docker-compose.yml file:

YAML

services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"

This setup maps your configuration file to Prometheus and exposes it on port 9090 for access.

2.2 Configuring Grafana Add Grafana to your docker-compose.yml file:

YAML

services:
grafana:
image: grafana/grafana
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- prometheus

To set up Grafana:

  • Open Grafana at http://localhost:3001.
  • Add Prometheus as a data source:
  • Navigate to Configuration > Data Sources.
  • Select Prometheus.
  • Set the URL to http://prometheus:9090.
  • Save the data source.
  • Import or create dashboards to visualize metrics, such as request rates and response times.

Step 3: Optional Long-Term Storage with InfluxDB InfluxDB is a time-series database that stores metrics for historical analysis. Add InfluxDB to your docker-compose.yml file if you need extended metric retention:

YAML

services:
influxdb:
image: influxdb:latest
ports:
- "8086:8086"

Integrating InfluxDB with Grafana

  • In Grafana, go to Configuration > Data Sources and add InfluxDB.
  • Set the URL to http://influxdb:8086.

Complete docker-compose.yml Setup Here’s the full docker-compose.yml file with all services configured:

YAML

version: '3.8'
services:
your-app-service:
image: your-app-image
ports:
- "3000:3000"
kafka:
image: bitnami/kafka:latest
environment:
- KAFKA_BROKER_ID=1
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
ports:
- "9092:9092"
depends_on:
- zookeeper
zookeeper:
image: bitnami/zookeeper:latest
ports:
- "2181:2181"
k6:
image: grafana/k6
volumes:
- type: bind
source: ./load-testing
target: /load-testing
entrypoint: ["k6", "run", "/load-testing/load-test.js"]
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- prometheus
influxdb:
image: influxdb:latest
ports:
- "8086:8086"

Running the Setup

  • Start the Services:
  • Bash
  • docker-compose up -d
  • Access Grafana at http://localhost:3001 and add Prometheus and InfluxDB as data sources.
  • Run the k6 Load Test: If k6 is configured to run automatically, it will begin the load test upon starting.

Monitoring Your Application

  • Prometheus: Access Prometheus at http://localhost:9090 to view raw metrics.
  • Grafana: Use Grafana dashboards for real-time insights and to visualize performance metrics such as HTTP request rates, response times, and Kafka throughput.

With this setup, you have a complete environment for load testing, monitoring, and analyzing your application’s performance under load.

Next we will see how to create producers and topic consumers and monitor some transactions from a real api also we will be saving this data to an sql database

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Justine Peterson Mahinyila
Justine Peterson Mahinyila

Written by Justine Peterson Mahinyila

My mission is to improve people’s lives and solve problems using technology in Africa

Responses (1)

Write a response

I have just read your blog on Setting Up Load Testing and Monitoring with Docker, k6, Prometheus, Grafana, and InfluxDB and wanted to thank you for the thorough and practical guide! The breakdown of each tool and their configuration in a Dockerized…

Recommended from Medium

Lists

See more recommendations