BlazeMeter: Cloud-Scale Load Testing Without Infrastructure Management

BlazeMeter: Cloud-Scale Load Testing Without Infrastructure Management

Running a large load test on your own infrastructure is painful: provisioning machines, managing networking, cleaning up after. BlazeMeter eliminates this by running your JMeter, Gatling, or Locust scripts in cloud infrastructure on demand, scaling to millions of virtual users without touching a server.

This guide covers BlazeMeter's architecture, how to upload and run tests, CI/CD integration, and practical configuration for realistic load testing.

What Is BlazeMeter?

BlazeMeter is a SaaS continuous testing platform that runs performance tests in cloud infrastructure. It's built around JMeter compatibility — any JMeter .jmx file runs in BlazeMeter without modification — but also supports Gatling, Locust, Selenium, Taurus YAML, and proprietary Scriptless testing.

Key capabilities:

  • Cloud load generation — run from AWS, GCP, Azure across multiple regions simultaneously
  • Massive scale — millions of VUs without managing a single load generator
  • Private locations — deploy agents in your own infrastructure for testing internal systems
  • CI/CD integration — native plugins for Jenkins, GitHub Actions, Azure DevOps
  • Real-time reporting — live dashboards during test execution
  • Reporting and trends — historical comparison across test runs

BlazeMeter is owned by Perforce Software (acquired from CA Technologies).

Getting Started

Account Setup

Sign up at blazemeter.com. The free plan includes:

  • 50 concurrent users
  • 10-minute test duration max
  • 1 test at a time
  • Basic reporting

Paid plans start at ~$99/month for 1000 VUs and longer durations.

Your First Test

The quickest path: upload an existing JMeter script.

  1. Create a test in BlazeMeter → Performance Tests
  2. Upload your .jmx file
  3. Configure load parameters (override JMeter's own settings)
  4. Click Run

BlazeMeter handles provisioning cloud machines, distributing load, collecting results, and tearing down infrastructure.

Test Configuration

Load Configuration

Override JMeter's thread count and duration from BlazeMeter's UI:

# Equivalent to BlazeMeter test settings
concurrent_users: 500
ramp_up: 5m
hold_for: 30m
iterations: 0  # Run for duration, not fixed iterations

This separation means your JMeter script stays generic (doesn't hardcode VU counts) and BlazeMeter drives the load profile.

Geographic Distribution

Distribute load from multiple regions simultaneously:

  • US East (N. Virginia)
  • US West (Oregon)
  • EU West (Ireland)
  • EU Central (Frankfurt)
  • Asia Pacific (Singapore, Tokyo, Sydney)

Configure in test settings:

locations:
  - location: us-east-1
    weight: 40   # 40% of VUs from US East
  - location: eu-west-1
    weight: 35   # 35% from EU West
  - location: ap-southeast-1
    weight: 25   # 25% from Singapore

Multi-region testing verifies global performance, not just from a single data center. A page that loads in 200ms from US East might take 800ms from Singapore.

Private Locations

For testing internal applications not exposed to the internet:

  1. Install BlazeMeter Private Location agent in your network:
docker run -d \
  --name blazemeter-agent \
  -e BLAZEMETER_API_KEY=your_api_key \
  blazemeter/bzm-private-agent:latest
  1. Register the agent in BlazeMeter UI under Private Locations
  2. Select it as a load source in your test configuration

This maintains firewall security while allowing cloud-managed load generation from inside your network.

Taurus: Script-as-Code for BlazeMeter

Taurus is BlazeMeter's open-source test automation framework. It provides a clean YAML format that can drive JMeter, Gatling, Locust, or other executors:

# test.yaml
execution:
  - concurrency: 500
    ramp-up: 5m
    hold-for: 30m
    scenario: main-scenario

scenarios:
  main-scenario:
    requests:
      - url: https://example.com/
        label: Homepage
        
      - url: https://example.com/api/login
        method: POST
        headers:
          Content-Type: application/json
        body:
          username: ${username}
          password: ${password}
        label: Login
        assert:
          - contains:
              - token
              
      - url: https://example.com/dashboard
        label: Dashboard
        think-time: 2s

modules:
  console:
    disable: false
  blazemeter:
    token: ${BLAZEMETER_API_KEY}
    project: MyApp

reporting:
  - module: blazemeter
    test: Load Test - Main Scenario

Run locally: bzt test.yaml — executes with local JMeter. Upload to BlazeMeter: bzt test.yaml -o modules.blazemeter.token=API_KEY — executes in cloud.

The same configuration file runs locally and in the cloud.

Data Parameterization in Taurus

scenarios:
  main-scenario:
    variables:
      username: ${__property(test.user,defaultuser)}
    data-sources:
      - path: users.csv
        delimiter: ","
        quoted: false
        loop: true
        variable-names: username,password

CI/CD Integration

GitHub Actions

name: Performance Test

on:
  push:
    branches: [main]

jobs:
  load-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Install Taurus
        run: pip install bzt
        
      - name: Run BlazeMeter test
        env:
          BLAZEMETER_API_KEY: ${{ secrets.BLAZEMETER_API_KEY }}
        run: |
          bzt tests/performance/test.yaml \
            -o modules.blazemeter.token=$BLAZEMETER_API_KEY \
            -o modules.blazemeter.project=MyApp \
            -o execution.concurrency=200 \
            -o execution.hold-for=10m

Jenkins

stage('Performance Test') {
    steps {
        withCredentials([string(credentialsId: 'blazemeter-api-key', variable: 'BZM_KEY')]) {
            sh """
                bzt tests/performance/test.yaml \
                    -o modules.blazemeter.token=${BZM_KEY} \
                    -o execution.hold-for=15m
            """
        }
    }
}

BlazeMeter API Direct Integration

For more control, use BlazeMeter's REST API:

# Start a test
TEST_ID=your_test_id
API_KEY=your_api_key

curl -X POST \
  "https://a.blazemeter.com/api/v4/tests/${TEST_ID}/start" \
  -H "Authorization: Basic $(echo -n ${API_KEY}: | base64)" \
  -H "Content-Type: application/json"

# Poll for completion
MASTER_ID=from_start_response

while true; do
  STATUS=$(curl -s \
    "https://a.blazemeter.com/api/v4/masters/${MASTER_ID}" \
    -H "Authorization: Basic $(echo -n ${API_KEY}: | base64)" \
    | jq -r '.result.status')
  
  if [ "$STATUS" = "ENDED" ]; then
    break
  fi
  
  echo "Status: $STATUS — waiting..."
  sleep 30
done

# Get result
curl -s \
  "https://a.blazemeter.com/api/v4/masters/${MASTER_ID}/reports/thresholds" \
  -H "Authorization: Basic $(echo -n ${API_KEY}: | base64)" \
  | jq '.result.data.overallPass'

Real-Time Monitoring

BlazeMeter's dashboard during test execution shows:

  • Active Users — current VU count vs. target
  • Response Time — average, p90, p95 in real time
  • Throughput — requests/second
  • Error Rate — with error breakdown (HTTP status codes, connection errors)
  • Percentile Distribution — p50, p75, p90, p95, p99

Set up Live Monitoring Thresholds to auto-stop tests if error rate exceeds a limit:

modules:
  blazemeter:
    address: https://a.blazemeter.com
    test: My Load Test
    monitoring-threshold: 5%  # Stop test if error rate exceeds 5%

This prevents a runaway load test from causing extended downtime in staging.

Reporting and Comparison

Test Report Components

After test completion, BlazeMeter generates:

  • Summary — VUs, duration, total requests, error rate, response time percentiles
  • Transactions — per-request breakdown with p90/p95/p99
  • Errors — grouped by type with count and percentage
  • Load Profile — VU count and throughput over time

Compare Reports

Compare two test runs side-by-side to detect regressions:

  1. Open test history
  2. Select two runs
  3. Click "Compare"

BlazeMeter overlays the graphs and highlights statistically significant differences. A 15% response time increase between runs is immediately visible.

Automated Pass/Fail via Thresholds

Define pass/fail criteria that integrate with CI:

services:
  - module: passfail
    criteria:
      - p90 of LoginTransaction > 1.5s for 10s: fail
      - fail rate of CheckoutTransaction > 1%: fail
      - avg response time > 3s: warn

Bzt exits with code 0 (pass) or non-zero (fail) based on these criteria, which maps directly to CI pipeline success/failure.

Cost Optimization

BlazeMeter charges by VU-minutes. To keep costs controlled:

  • Smoke tests on PR — 50 VUs for 5 minutes (~0.1% of a full test)
  • Full load tests on main merges — 500+ VUs for 30 minutes
  • Schedule off-peak — many plans allow scheduled tests at lower rates
  • Use private locations for staging — reduces cloud VU usage for internal testing

A typical smoke test (50 VU, 5 min) costs a few cents. A weekly full regression (1000 VU, 60 min) costs a few dollars. Budget varies significantly by plan tier.

BlazeMeter vs. k6 Cloud vs. Gatling Cloud

BlazeMeter k6 Cloud Gatling Cloud
JMeter support Yes (core feature) Via plugin No
Script format JMX, Taurus YAML, Locust k6 JS Gatling Scala/Java
Free tier 50 VU, 10 min 50 VU, limited Limited
Private locations Yes Yes Yes
Historical trends Yes Yes Yes
Geographic distribution Extensive Good Good

Choose BlazeMeter if you already have JMeter scripts. Choose k6 Cloud for code-first performance testing. Choose Gatling Cloud for Gatling scripts.

Summary

BlazeMeter's value is eliminating the infrastructure overhead of large load tests. Instead of provisioning load generator instances, managing networking, and cleaning up after, you upload a script and BlazeMeter handles the rest.

The Taurus YAML format is worth adopting even if you're staying with JMeter as the executor — it gives you a cleaner, version-controlled test definition that works both locally and in the cloud. The CI/CD integration turns performance testing from a manual activity into an automated gate, which is where load testing needs to be for modern development teams.

Read more

Start now free