Pulzr ⚡
High-performance HTTP load testing tool written in Rust with real-time metrics, TUI, and WebUI.
⚠️Note: This is a my rust practice project I put together in just 2 days to explore a use case of my own. I’m still pretty new to Rust, but I’ve really loved it since my first try!
The code isn’t production-ready, but I’ve done my best to follow good practices where I can.
If you find any issues or have suggestions, feel free to open an issue or pull request — I’d really appreciate it!

Key Features
- Fast & Concurrent: Multi-threaded load testing with configurable concurrency
- WebSocket Streaming: Real-time metrics broadcasting for external integrations
- curl-Compatible Flags:
-X,--data,--no-follow-redirectsfor familiar syntax - Retry Support: Automatic retry of failed requests with
--retry - Warmup Period: Discard early results with
--warmupbefore recording stats - Response Validation: Fail requests that don't contain expected body text with
--expect-body - CI/CD Integration:
--json-output,--output-file,--fail-on-error-ratefor pipeline use - Baseline Comparison: Save and compare test runs to catch regressions with
--save-baseline/--compare-baseline - Configurable Alerts: Override error rate and latency thresholds with
--alert-error-rate/--alert-latency - User-Agent Management: Custom, random, or file-based User-Agent rotation (25+ built-in agents)
- Rate Limiting: Precise RPS control with token bucket algorithm
- CSV Export: Detailed request logs and aggregated summary reports
- Flexible HTTP: Support for all HTTP methods, custom headers, JSON/form payloads
- Scenario Testing: JSON/YAML config files for complex multi-step tests
- Ramp-up Patterns: Gradual load increase with linear, exponential, or step patterns
- Multiple Endpoints: Test different APIs simultaneously with weighted distribution
- Debug Mode: Detailed request/response logging with 3 verbosity levels
- Authentication: JWT tokens with auto-refresh and API key support
- Prometheus Export: Standard metrics endpoint for monitoring integrations
- Memory Optimization: Streaming stats with bounded memory usage for long tests
- HTTP/2 Support: Modern protocol with multiplexing and header compression
- Distributed Load Testing: Scale tests across multiple machines with coordinator-worker architecture
Installation
From Cargo (Recommended)
Quick Install Script
|
From Source
From GitHub Releases
Download pre-compiled binaries from GitHub Releases
Available platforms:
- Linux x86_64 (amd64)
- Windows x86_64 (amd64)
- macOS x86_64 (amd64)
- macOS ARM64 (Apple Silicon)
Note for ARM64 Linux users: Pre-compiled binaries are not available for ARM64 Linux. Please build from source using the instructions above.
Quick Start
Basic Load Test (TUI Mode)
# Run until manually stopped (Ctrl+C or 'q')
# Run for specific duration
# Run for specific number of requests
WebUI Mode (Recommended)
# Clean web interface - run until stopped
# WebUI with specific duration
# Request count mode - run exactly 1000 requests
Table of Contents
- Pulzr ⚡
- Key Features
- Installation
- Quick Start
- Table of Contents
- Usage Examples
- Output Formats
- Scenario Files
- Ramp-up Patterns
- Multiple Endpoints
- Debug Mode
- Web Dashboard
- WebSocket API
- CSV Export
- User-Agent Management
- TUI Interface
- Advanced Metrics & Monitoring
- Authentication & Security
- Prometheus Export & Monitoring
- Memory Optimization
- HTTP/2 Support
- Distributed Load Testing
- Real-World Examples
- License
Usage Examples
WebUI Testing
# Simple WebUI test with auto-browser opening (unlimited duration)
# Production API test with WebUI (runs until stopped)
# Load test with custom payload and specific duration
TUI Testing
# Basic TUI load test
# High-concurrency test with rate limiting
# Stealth testing with random User-Agents
HTTP Methods & Payloads
# POST JSON data (curl-style)
# POST with long-form flags
# PUT request with custom headers
# DELETE request test
Data Export & Analysis
# Export detailed CSV reports
# WebUI with CSV export
# Headless mode with CSV only
Specialized Testing
# Error testing (expect failures)
# Redirect testing
# Custom User-Agent testing
# File-based User-Agent rotation
Performance Testing
# High-throughput test
# Sustained load test
# Burst testing
# Request count performance test
Scenario-Based Testing
# JSON scenario file
# YAML scenario file
# Scenario with custom concurrency and duration
Ramp-up Load Testing
# Linear ramp-up over 30 seconds
# Exponential ramp-up with WebUI
# Step ramp-up pattern (25%, 50%, 75%, 100% at quarters)
# Scenario with ramp-up
Multiple Endpoints Testing
# Test multiple API endpoints simultaneously
# Multi-endpoint test with WebUI
# Multi-endpoint with ramp-up pattern
# High-throughput multi-endpoint test
Integration Testing
# WebSocket server for external monitoring
# Combined WebUI + WebSocket
CI/CD Integration
# Print final summary as JSON (pipe to jq, save, etc.)
|
# Write JSON summary to file
# Abort if error rate exceeds 5%
# Validate response content
# Save a baseline, then compare on next run
# Custom alert thresholds
# Warmup + headless with JSON output
# Retry transient network errors
Distributed Load Testing
# Start coordinator (central control)
# Connect workers from multiple machines
# Distributed test with automatic load distribution
# Worker with specific capabilities
Command Line Options
| Option | Short | Description | Default |
|---|---|---|---|
URL (positional) |
Target URL to test (optional with --scenario) | Required | |
--scenario |
-s |
Load test scenario from JSON/YAML file | None |
--endpoints |
Multiple endpoints configuration file (JSON/YAML) | None | |
--ramp-up |
Ramp-up duration in seconds (gradual load increase) | None | |
--ramp-pattern |
Ramp-up pattern (linear, exponential, step) | linear | |
--concurrent |
-c |
Number of concurrent requests | 10 |
--duration |
-d |
Test duration in seconds (default: run until stopped) | Until stopped |
--rps |
-r |
Requests per second limit | None |
--method |
-m |
HTTP method (get, post, put, delete, etc.) | get |
--payload |
-p |
Request payload (JSON or plain text) | None |
--headers |
-H |
Custom headers (format: 'Key: Value') | None |
--user-agent |
Custom User-Agent string | "pulzr" | |
--random-ua |
Use random User-Agent rotation | false | |
--ua-file |
User-Agent list file (one per line) | None | |
--output |
-o |
CSV export path (creates .detailed.csv & .summary.csv) | None |
--websocket |
Enable WebSocket server for metrics streaming | false | |
--websocket-port |
WebSocket server port | 9621 | |
--webui |
Enable Web Dashboard (auto-disables TUI) | false | |
--webui-port |
Web Dashboard port | 9622 | |
--open-browser |
Auto-open WebUI in default browser | false | |
--headless |
Run in headless mode (disable TUI display) | false | |
--no-tui |
Alias for --headless (backward compatibility) | false | |
--quiet |
-q |
Quiet mode - minimal output (only final summary) | false |
--output-format |
Output format (detailed, compact, minimal) | detailed | |
--timeout |
-t |
Request timeout in seconds | None |
--latencies |
-l |
Print latency statistics (enables latency distribution) | false |
--requests |
-n |
Total number of requests to make | None |
--body |
-b |
Request body (alias for payload) | None |
--body-file |
-f |
File to use as request body | None |
--insecure |
-k |
Skip TLS certificate verification | false |
--http1 |
Force HTTP/1.x protocol | false | |
--http2 |
Enable HTTP/2.0 protocol | false | |
--cert |
Path to client TLS certificate | None | |
--key |
Path to client TLS certificate private key | None | |
--print |
-P |
Control output sections (intro,progress,result) | All |
--no-print |
Don't output anything (compatibility mode) | false | |
--format |
-O |
Output format (plain-text, json) | None |
--connections |
Alias for --concurrent | 10 | |
--rate |
Alias for --rps | None | |
--verbose |
-v |
Verbose output | false |
--debug |
Enable debug mode with detailed request/response logging | false | |
--debug-level |
Debug verbosity level (1-3): 1=basic, 2=headers, 3=full | 1 | |
--coordinator |
Run as distributed coordinator (central control) | false | |
--coordinator-port |
Coordinator listening port | 9630 | |
--max-workers |
Maximum workers allowed to connect | 100 | |
--worker |
Run as distributed worker (connects to coordinator) | false | |
--coordinator-host |
Coordinator hostname/IP to connect to | localhost | |
--worker-id |
Unique worker identifier | auto-generated | |
--max-concurrent |
Worker maximum concurrent requests | 100 | |
--max-rps |
Worker maximum requests per second | None | |
--examples |
Show usage examples and exit | N/A | |
--retry |
Retry failed requests N times (network errors only) | 0 | |
--warmup |
Warmup period in seconds before recording stats | None | |
--json-output |
Print final summary as JSON to stdout (CI-friendly) | false | |
--output-file |
Write final JSON summary to a file | None | |
--fail-on-error-rate |
Abort and exit 1 if error rate exceeds N% | None | |
--save-baseline |
Save final summary as a JSON baseline file | None | |
--compare-baseline |
Compare run against saved baseline; exit 1 on regression | None | |
--alert-error-rate |
Override alert error rate threshold in percent | 10 | |
--alert-latency |
Override alert latency threshold in milliseconds | 500 | |
--expect-body |
Fail request if response body does not contain this string | None | |
--follow-redirects |
-L |
Follow HTTP redirects (enabled by default) | false |
--no-follow-redirects |
Disable following HTTP redirects | false |
Output Formats
Pulzr supports multiple output formats to match different use cases and preferences:
Available Formats
| Format | Description | Use Case |
|---|---|---|
detailed |
Full verbose output with all statistics (default) | Development, analysis |
compact |
Aligned statistics output with progress bar | Automation, CI/CD |
minimal |
Single-line summary | Scripts, quiet automation |
Output Format Examples
Detailed Format (Default)
# Shows full statistics with sections for response times, status codes, errors, etc.
Compact Format
# Output:
# Load testing https://httpbin.org/get for 30s using 10 connections
# [=========================================================================] 30s Done!
# Statistics Avg Stdev Max
# Reqs/sec 45.67 4.56 52
# Latency 21.86ms 2.45ms 89.23ms
# Latency Distribution
# 50% 20.15ms
# 75% 22.67ms
# 90% 25.89ms
# 99% 45.12ms
# HTTP codes:
# 1xx - 0, 2xx - 1370, 3xx - 0, 4xx - 0, 5xx - 0
# Throughput: 2.34MB/s
Minimal Format
# Output: 1370 requests in 30.00s, 0 failed, 45.67 req/s
Quiet Mode
# Shows only minimal output regardless of format, suppresses progress messages
Compatible CLI Syntax
Pulzr supports alternative command-line syntax for easy migration:
# Positional URL argument
# Alternative flag names
# Request body options
# Output control
Alternative Output Formats
| Format | Flag | Description |
|---|---|---|
plain-text (alias: pt) |
--format plain-text |
Structured text output with statistics table |
json (alias: j) |
--format json |
JSON formatted results for parsing |
Output Control Options
| Flag | Description | Example |
|---|---|---|
--print intro,progress,result |
Control which sections to show | --print result |
--no-print |
Silent mode (no output) | --no-print |
--latencies |
Enable latency distribution display | -l |
Migration Examples
# Basic load test with structured output
# JSON output for automation
# Silent operation with request count
# File-based request body
Scenario Files
Scenario files enable complex, multi-step load testing with variable substitution and weighted request distribution. Both JSON and YAML formats are supported.
Features
- Multi-step Testing: Define multiple HTTP requests in sequence
- Weighted Distribution: Control request frequency with weights
- Variable Substitution: Use
${variable}syntax for dynamic values - Per-step Configuration: Custom headers, payloads, timeouts per step
- Format Support: Both JSON and YAML scenario files
- Default Overrides: Scenario defaults can override CLI options
Example JSON Scenario
Example YAML Scenario
name: "E-commerce Load Test"
description: "Shopping cart and checkout flow testing"
version: "1.0"
variables:
host: "httpbin.org"
product_id: "abc123"
user_token: "user-session-token"
defaults:
concurrent: 15
duration: 300
rps: 25
timeout: 10
headers:
Authorization: "Bearer ${user_token}"
User-Agent: "ShopBot/2.0"
steps:
- name: "Browse Products"
url: "https://${host}/get"
method: "GET"
weight: 5.0
- name: "Add to Cart"
url: "https://${host}/post"
method: "POST"
payload: '{"product_id": "${product_id}", "quantity": 1}'
headers:
Content-Type: "application/json"
weight: 2.0
- name: "Checkout"
url: "https://${host}/post"
method: "POST"
payload: '{"payment_method": "card", "shipping": "standard"}'
headers:
Content-Type: "application/json"
weight: 1.0
Scenario Usage
# Run JSON scenario file
# Run YAML scenario with WebUI
# Override scenario defaults with CLI options
# Scenario with CSV export
Scenario Configuration
| Field | Type | Description |
|---|---|---|
name |
String | Scenario name (displayed in output) |
description |
String | Optional scenario description |
version |
String | Optional version number |
variables |
Object | Key-value pairs for ${variable} substitution |
defaults |
Object | Default test configuration (overrides CLI) |
steps |
Array | List of HTTP requests to execute |
Step Configuration
| Field | Type | Description |
|---|---|---|
name |
String | Step name for logging |
url |
String | Request URL (supports variables) |
method |
String | HTTP method (GET, POST, PUT, etc.) |
headers |
Object | Custom headers for this step |
payload |
String | Request body (supports variables) |
timeout |
Number | Request timeout in seconds |
weight |
Number | Request frequency weight (default: 1.0) |
Variable Substitution
- Use
${variable_name}syntax in URLs, payloads, and headers - Variables defined in the
variablessection - Special built-in variables:
${timestamp}(current Unix timestamp) - Variables are replaced at runtime for each request
Weighted Distribution
- Each step has a
weightvalue (default: 1.0) - Higher weights = more frequent requests
- Example: weight 3.0 = 3x more likely than weight 1.0
- Total weights are normalized to create probability distribution
Ramp-up Patterns
Ramp-up patterns enable gradual load increase over time instead of starting with maximum concurrency immediately. This helps identify breaking points and simulates realistic traffic growth.
Features
- Gradual Load Increase: Start with low concurrency and gradually increase
- Multiple Patterns: Linear, exponential, and step-wise increase patterns
- Flexible Duration: Configure ramp-up period from seconds to minutes
- Real-time Progress: Live console output showing current concurrency levels
- Scenario Integration: Works seamlessly with scenario-based testing
- Smart Transition: Smooth transition from ramp-up to steady-state testing
Ramp-up Patterns
1. Linear Pattern (--ramp-pattern linear)
Increases concurrency evenly over time:
- 0% → 25% → 50% → 75% → 100% (smooth progression)
- Best for: General load testing, finding gradual breaking points
- Example: 0 → 25 → 50 → 75 → 100 concurrent requests over 20 seconds
2. Exponential Pattern (--ramp-pattern exponential)
Slow start with rapid acceleration:
- 0% → 6% → 25% → 56% → 100% (curved growth)
- Best for: Stress testing, simulating viral/sudden traffic spikes
- Example: 0 → 6 → 25 → 56 → 100 concurrent requests over 20 seconds
3. Step Pattern (--ramp-pattern step)
Discrete jumps at quarter intervals:
- 25% → 50% → 75% → 100% (stepwise increases)
- Best for: Testing specific load thresholds, capacity planning
- Example: 25 → 50 → 75 → 100 concurrent requests over 20 seconds
Ramp-up Usage Examples
# Basic linear ramp-up (30s to reach 50 concurrent)
# Exponential stress test with WebUI
# Step-wise capacity testing
# Scenario-based ramp-up
# Production readiness test (15-minute ramp + 45-minute sustained)
Ramp-up Configuration
| Parameter | Description | Values |
|---|---|---|
--ramp-up |
Ramp-up duration in seconds | 1-3600 (1 second to 1 hour) |
--ramp-pattern |
Increase pattern type | linear, exponential, step |
--concurrent |
Maximum concurrent requests | Final target concurrency |
--duration |
Total test duration | Includes ramp-up + steady-state time |
Ramp-up Behavior
- Initialization: Starts with minimum concurrency (calculated based on pattern)
- Ramp-up Phase: Gradually increases workers every 500ms based on pattern
- Progress Reporting: Real-time console output showing current worker count
- Completion Detection: Automatically transitions to steady-state when target reached
- Steady State: Continues at maximum concurrency for remaining test duration
Best Practices
- Linear: Use for general load testing and finding gradual performance degradation
- Exponential: Use for stress testing and simulating sudden traffic bursts
- Step: Use for capacity planning and testing specific load thresholds
- Duration: Allow enough ramp-up time (30-120s) for meaningful traffic patterns
- Monitoring: Use WebUI (
--webui) for visual monitoring during ramp-up - Scenarios: Combine with scenario files for realistic multi-endpoint ramp-up
Multiple Endpoints
Multiple endpoints testing enables simultaneous load testing of different APIs with weighted distribution, perfect for testing microservices, API gateways, and complex system integrations.
Features
- Simultaneous Testing: Test multiple APIs concurrently in one session
- Weighted Distribution: Control request frequency per endpoint with weights
- Per-Endpoint Configuration: Custom methods, headers, payloads, timeouts per endpoint
- Expected Status Validation: Define expected status codes per endpoint
- Real-time Monitoring: Live endpoint-specific logging with success indicators
- Integration Ready: Works with ramp-up patterns and all existing features
- Flexible Config: JSON/YAML configuration files
Example Endpoints Configuration
JSON Format:
Multiple Endpoints Usage
# Basic multi-endpoint testing
# Multi-endpoint with WebUI monitoring
# Gradual ramp-up across endpoints
# High-throughput production test
# Rate-limited multi-endpoint test
Endpoint Configuration
| Field | Type | Description |
|---|---|---|
name |
String | Endpoint name for logging and identification |
url |
String | Target URL for this endpoint |
method |
String | HTTP method (GET, POST, PUT, DELETE, etc.) |
headers |
Object | Custom headers for this endpoint |
payload |
String | Request body (for POST/PUT requests) |
timeout |
Number | Request timeout in seconds |
weight |
Number | Request frequency weight (default: 1.0) |
expected_status |
Array | Expected HTTP status codes (default: 2xx) |
Weighted Distribution
- Weight Values: Higher weights = more frequent requests
- Example: weight 3.0 = 3x more likely than weight 1.0
- Distribution: Weights are normalized to create probability distribution
- Real-time: Live console output shows which endpoints are being hit
Use Cases
Microservices Testing:
# Test user, payment, and notification services simultaneously
API Gateway Load Testing:
# Test multiple routes through API gateway
CI/CD Integration Testing:
# Validate all API endpoints after deployment
Capacity Planning:
# Test system capacity across all services
Best Practices
- Weight Distribution: Use weights to simulate realistic traffic patterns
- Expected Status: Define expected status codes to catch regressions
- Timeouts: Set appropriate timeouts per endpoint based on SLAs
- Monitoring: Use WebUI for real-time endpoint monitoring
- Ramp-up: Combine with ramp-up patterns for realistic load progression
- Documentation: Document endpoint purposes and expected behaviors
Debug Mode
Debug mode provides detailed request/response logging with multiple verbosity levels, perfect for troubleshooting API issues, analyzing request patterns, and understanding HTTP interactions during load testing.
Features
- Request/Response Correlation: Each request gets a unique session ID for easy tracking
- Three Verbosity Levels: Choose the right level of detail for your needs
- Timing Information: Precise request timing and duration tracking
- Scenario Integration: Works seamlessly with scenario and endpoint testing
- Structured Output: Clean, readable debug output with timestamps
- CLI Integration: Simple command-line options for immediate debugging
Debug Levels
Level 1: Basic (--debug-level 1)
Shows essential request/response information:
- HTTP method and URL
- Response status code and timing
- Content length
- Session ID for correlation
Level 2: Headers (--debug-level 2)
Includes everything from Level 1 plus:
- Request headers (including User-Agent)
- Response headers
- Custom headers from scenarios/endpoints
Level 3: Full (--debug-level 3)
Includes everything from Level 2 plus:
- Request body content
- Response body content (truncated for large responses)
- Complete HTTP transaction details
Debug Usage Examples
# Basic debug mode (Level 1) with scenarios
# Debug mode with headers (Level 2) for endpoint testing
# Full debug mode (Level 3) for detailed troubleshooting
# Debug mode with WebUI for visual monitoring
# Debug mode with ramp-up patterns
Debug Output Example
[DEBUG] Request 000001 [14:30:15.123]
POST https://httpbin.org/post
Headers:
Authorization: Bearer token123
Content-Type: application/json
User-Agent: pulzr-test/1.0
Body: {"name": "test", "email": "test@httpbin.org"}
[DEBUG] Response 000001 [14:30:15.456]
Status: 201 (332ms)
Content-Length: 156 bytes
Headers:
Location: /users/12345
Content-Type: application/json
Body: {"id": 12345, "name": "test", "email": "test@httpbin.org", "created": "2024-01-01T14:30:15Z"}
Use Cases
API Development & Testing:
# Debug new API endpoints during development
Issue Troubleshooting:
# Debug failing requests with full details
Performance Analysis:
# Analyze request patterns with timing information
Authentication Debugging:
# Debug authentication headers and responses
Debug Best Practices
- Level 1: Use for performance testing to track basic request/response flow
- Level 2: Use for authentication and header debugging
- Level 3: Use for payload debugging and detailed troubleshooting
- Combine with WebUI: Use
--webuialongside debug mode for visual monitoring - Single Concurrency: Use
-c 1for cleaner debug output during troubleshooting - Scenario Testing: Debug mode works best with scenario and endpoint configurations
Important Notes
- Performance Impact: Debug mode has minimal impact on Level 1, increasing with higher levels
- Output Volume: Level 3 can generate significant output with large payloads
- Security: Be cautious with Level 3 when debugging sensitive data
- Session Correlation: Use session IDs to track request/response pairs in concurrent tests
Web Dashboard
The WebUI provides a modern, self-contained web interface with real-time monitoring, charts, and detailed request logging.
Features
- 3-Tab Layout: Live metrics, Summary, and Logs tabs — auto-switches to Summary when test completes
- Canvas Line Chart: Dual-axis real-time chart showing RPS (green) and avg response time (amber) over a 120-point rolling window
- Test Progress Bar: Smooth animated bar for both duration mode and request-count mode
- Color-coded Metric Cards: Cards turn amber or red as error rate / latency thresholds are exceeded; critical values pulse
- Canvas Histogram: Latency distribution with hover tooltips showing bucket range, count, and percentage
- Filterable Logs Tab: Filter by 2xx/3xx/4xx/5xx/Errors, auto-scroll toggle, up to 1000 recent entries
- Final Summary Tab: Full percentile breakdown and test config rendered after test completion
- Responsive Design: Works on desktop and mobile; canvases resize automatically
- Dynamic Connection Status: Shows "Connected — waiting for test" vs "Connecting..." state
- Auto Port Selection: Finds available ports automatically (default: 9622)
- Browser Integration: Auto-open in default browser with
--open-browser
WebUI vs TUI
- WebUI Mode:
--webuiautomatically disables TUI for clean web-only experience - TUI Mode: Default terminal interface with sparkline charts and live metrics
- Headless Mode:
--headlessfor automation and CI/CD pipelines (alias:--no-tui)
Usage Examples
# Quick WebUI test with auto-open browser
# Production load test with WebUI
# Custom ports for WebUI
# WebUI + WebSocket for external monitoring
WebSocket API
WebSocket server provides real-time metrics streaming for external monitoring and integrations.
Connection
- Default Port:
9621(auto-selected if busy) - URL Format:
ws://localhost:9621 - Enabled by:
--websocketor--webuiflags
Message Types
| Type | Description | Frequency |
|---|---|---|
test_started |
Test configuration and parameters | Once at start |
metrics_update |
Aggregated statistics (RPS, response times, etc.) | Every 1 second |
request_log |
Individual HTTP request details | Real-time per request |
test_completed |
Final summary with percentiles | Once at end |
error_event |
Error notifications and issues | As needed |
Message Examples
Test Started
Metrics Update
Request Log (New!)
Integration Examples
JavaScript WebSocket Client
const ws = ;
ws ;
Python Monitoring Script
=
=
=
=
# Usage: Run this while pulzr test is running
CSV Export
When using --output filename, two CSV files are generated:
filename.detailed.csv: Individual request resultsfilename.summary.csv: Aggregated test summary
User-Agent Management
Random User-Agents
Use --random-ua to rotate between 25 built-in realistic User-Agents including:
- Chrome (Windows, macOS, Linux)
- Firefox (Windows, macOS, Linux)
- Safari (macOS, iOS)
- Edge (Windows)
- Mobile browsers (Android, iOS)
Custom User-Agent File
Create a file with one User-Agent per line:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
Custom-Bot/1.0
Then use: --ua-file agents.txt
TUI Interface
The Terminal User Interface provides a rich, real-time monitoring experience in your terminal.
TUI Features:
- Live Metrics: Real-time RPS, response times, success rates
- Sparkline Charts: Visual response time trends over time
- Status Code Distribution: Color-coded HTTP response breakdown
- Error Tracking: Real-time error monitoring and counts
- Test Progress: Duration, remaining time, and completion status
- Interactive Controls:
qkey orCtrl+Cto quit early - Responsive Layout: Adapts to terminal size
When to Use TUI vs WebUI:
- TUI: Default mode, great for development and quick tests
- WebUI: Use
--webuifor detailed request logging and browser-based monitoring - Headless: Use
--headlessfor automation, CI/CD, or background processes
TUI Controls:
| Key | Action |
|---|---|
q |
Quit test early |
Ctrl+C |
Force quit |
Esc |
Alternative quit |
TUI Examples:
# Basic TUI load test
# High-performance test with TUI monitoring
# Stealth testing with TUI
Advanced Metrics & Monitoring
Pulzr provides comprehensive real-time metrics analysis and monitoring capabilities for deep performance insights.
Advanced Metrics Features
- Response Time Percentiles: Real-time P50, P90, P95, and P99 calculations
- Latency Histograms: Visual distribution charts with configurable buckets
- Smart Alerts: Configurable error rate and performance degradation detection
- Trend Analysis: Automatic performance baseline tracking
- Real-time Updates: Live streaming metrics via WebSocket
- Custom Thresholds: User-defined alert thresholds for different scenarios
Percentile Metrics
# Basic load test with percentile monitoring
# High-performance test with detailed percentiles
Available Percentiles:
- P50 (Median): 50% of requests complete within this time
- P90: 90% of requests complete within this time
- P95: 95% of requests complete within this time
- P99: 99% of requests complete within this time
Latency Histograms
The WebUI displays real-time latency distribution charts showing:
- Response Time Buckets: Configurable time ranges (e.g., 0-10ms, 10-50ms, 50-100ms)
- Request Distribution: Visual representation of response time spread
- Performance Patterns: Identify outliers and performance trends
- Real-time Updates: Live histogram updates during testing
Smart Alerts
Configure intelligent alerts for automated monitoring:
# Enable alerts with custom thresholds
Alert Types:
- Error Rate Alerts: Trigger when error percentage exceeds threshold
- Performance Degradation: Detect when response times increase significantly
- Threshold Monitoring: Custom alerts for specific performance criteria
- Real-time Notifications: Instant alerts in TUI and WebUI interfaces
Performance Degradation Detection
Automatic performance monitoring with baseline comparison:
- Baseline Tracking: Establishes performance baselines during test execution
- Trend Analysis: Monitors response time trends over time
- Degradation Alerts: Automatic warnings when performance degrades
- Severity Levels: Low, Medium, High, and Critical alert classifications
Authentication & Security
Comprehensive authentication support for testing secured APIs and services.
Authentication Features:
- JWT Token Support: Bearer tokens with automatic refresh capability
- API Key Management: Multiple API key locations and formats
- Auto-Refresh: Automatic token renewal before expiration
- Multiple Providers: Support for various authentication services
- Flexible Placement: Headers, query parameters, or Bearer format
JWT Authentication:
# Basic JWT authentication
# JWT with auto-refresh
# JWT with custom claims
JWT Configuration Options:
--jwt-token: JWT token string--jwt-secret: Secret key for token validation--jwt-auto-refresh: Enable automatic token refresh--jwt-refresh-endpoint: Token refresh URL--jwt-issuer: Token issuer validation--jwt-audience: Token audience validation
API Key Authentication:
# API key in header (default)
# API key in query parameter
# API key as Bearer token
API Key Locations:
- Header: Custom header name (default:
X-API-Key) - Query: URL query parameter
- Bearer: Authorization header with Bearer format
Security Best Practices:
- Token Security: Tokens are not logged in debug mode
- Automatic Refresh: Prevents authentication failures during long tests
- Multiple Methods: Use different auth methods for different endpoints
- Validation: Built-in token validation and error handling
Prometheus Export & Monitoring
Export load testing metrics to Prometheus for advanced monitoring and alerting.
Prometheus Features:
- Standard Metrics: Request counts, response times, error rates
- Custom Labels: Endpoint, method, status code labeling
- Real-time Export: Live metrics during test execution
- Grafana Integration: Compatible with Grafana dashboards
- Multiple Formats: Counter, Histogram, and Gauge metrics
Prometheus Setup:
# Enable Prometheus metrics endpoint
# Custom Prometheus port
# Prometheus with scenario testing
Available Metrics:
pulzr_requests_total: Total number of HTTP requestspulzr_request_duration_seconds: Request duration histogrampulzr_response_time_p50: 50th percentile response timepulzr_response_time_p90: 90th percentile response timepulzr_response_time_p95: 95th percentile response timepulzr_response_time_p99: 99th percentile response timepulzr_error_rate: Current error rate percentagepulzr_requests_per_second: Current requests per second
Grafana Dashboard Integration:
# List available dashboards
# Get dashboard information
# Generate import instructions
# Validate dashboard configuration
Pre-built Dashboards:
- Pulzr Overview: Comprehensive load testing dashboard
- Performance Details: Detailed response time and throughput analysis
- Error Analysis: Error rate monitoring and debugging dashboard
Integration Example:
# Prometheus configuration (prometheus.yml)
scrape_configs:
- job_name: 'pulzr-load-tests'
static_configs:
- targets:
scrape_interval: 5s
Memory Optimization
Advanced memory management for long-running and high-throughput load tests.
Memory Optimization Features:
- Streaming Statistics: Bounded memory usage with rolling windows
- Smart Aggregation: Time-based data bucketing (minute/hour intervals)
- Automatic Cleanup: Configurable cleanup intervals and retention
- Multiple Profiles: Pre-configured optimization profiles
- Memory Monitoring: Real-time memory usage tracking
- Performance Tuning: Optimized for different use cases
Memory Profiles:
# Streaming profile (default for long tests)
# Low memory profile (minimal RAM usage)
# High throughput profile (performance optimized)
# Custom memory configuration
Memory Profile Configurations:
| Profile | Max Results | Result Age | Cleanup | Best For |
|---|---|---|---|---|
default |
10,000 | 3600s | Manual | General testing |
streaming |
5,000 | 1800s | Auto (300s) | Long tests |
low-memory |
1,000 | 900s | Auto (60s) | Limited RAM |
high-throughput |
20,000 | 7200s | Auto (600s) | High performance |
Memory Configuration Options:
--memory-profile: Pre-configured optimization profile--memory-optimize: Enable memory optimization features--max-results: Maximum results kept in memory--max-result-age: Maximum age of results in seconds--auto-cleanup: Enable automatic memory cleanup--cleanup-interval: Cleanup interval in seconds
Memory Monitoring:
# Memory optimization demo with monitoring
# Show current memory usage during tests
Memory Monitoring Features:
- System Memory: Total and available system RAM
- Process Memory: Current Pulzr memory usage
- Optimization Status: Active memory settings and cleanup intervals
- Usage Trends: Memory usage patterns over time
HTTP/2 Support
Modern HTTP/2 protocol support for enhanced performance and efficiency.
HTTP/2 Features:
- Multiplexing: Multiple requests over single connection
- Header Compression: Reduced bandwidth usage with HPACK
- Binary Framing: Efficient binary protocol processing
- Configurable Settings: Custom window sizes and frame sizes
- Prior Knowledge: Force HTTP/2 without negotiation
- Performance Monitoring: Protocol-specific metrics
HTTP/2 Configuration:
# Enable HTTP/2 with fallback
# Force HTTP/2 prior knowledge
# Force HTTP/1.1 only
# Custom HTTP/2 window sizes
HTTP/2 Configuration Options:
--http2: Enable HTTP/2 support with fallback--http2-prior-knowledge: Force HTTP/2 without negotiation--http1-only: Force HTTP/1.1 only (disable HTTP/2)--http2-initial-connection-window-size: Connection window size in bytes--http2-initial-stream-window-size: Stream window size in bytes--http2-max-frame-size: Maximum frame size in bytes
Protocol Information:
During test execution, Pulzr displays active protocol information:
Protocol: HTTP/2 (with fallback)
Features: HTTP/2 multiplexing, Header compression, Binary framing, Adaptive window, Keep-alive
Performance Benefits:
- Connection Efficiency: Fewer connections, reduced overhead
- Bandwidth Optimization: Header compression reduces data transfer
- Latency Reduction: Multiplexing eliminates head-of-line blocking
- Server Push: Compatible with HTTP/2 server push (if supported)
HTTP/2 Best Practices:
- High Concurrency: HTTP/2 performs better with higher concurrency
- Single Domain: Most effective when testing single domains/hosts
- Window Tuning: Optimize window sizes for your specific use case
- Fallback Support: Allow fallback for broader compatibility
Distributed Load Testing
Scale your load tests across multiple machines with Pulzr's distributed architecture. Perfect for testing high-capacity systems, simulating geographically distributed traffic, and breaking through single-machine limitations.
Distributed Features
- Coordinator-Worker Architecture: Central coordination with distributed execution
- Automatic Load Distribution: Intelligent request distribution across workers
- Real-time Metrics Aggregation: Centralized statistics from all workers
- WebSocket Communication: Low-latency coordination protocol
- Load Balancing Algorithms: Round-robin, load-based, and custom distribution
- Worker Auto-Discovery: Automatic worker registration and management
- Fault Tolerance: Automatic worker failure detection and recovery
- WebUI Integration: Real-time monitoring of distributed tests
- Geographic Distribution: Deploy workers across different regions/networks
Architecture Overview
┌─────────────────┐ WebSocket ┌─────────────────┐
│ Coordinator │◄───────────────►│ Worker 1 │
│ (Control Hub) │ │ (Test Execution)│
│ │ WebSocket ┌─────────────────┐
│ • Load Balancing│◄───────────────►│ Worker 2 │
│ • Metrics Agg. │ │ (Test Execution)│
│ • WebUI Dashboard│ WebSocket ┌─────────────────┐
│ • Test Control │◄───────────────►│ Worker N │
└─────────────────┘ │ (Test Execution)│
└─────────────────┘
Quick Start Guide
1. Start the Coordinator
# Basic coordinator setup
# Coordinator with WebUI monitoring
# Production coordinator with advanced settings
2. Connect Workers (run on different machines)
# Basic worker connection
# High-performance worker
# Regional worker with specific configuration
3. Run Distributed Tests (from coordinator)
# Automatic distributed load test
# Distributed scenario testing
# Multi-endpoint distributed testing
Coordinator Configuration
| Parameter | Description | Default | Example |
|---|---|---|---|
--coordinator |
Enable coordinator mode | false | --coordinator |
--coordinator-port |
Listening port for workers | 9630 | --coordinator-port 9630 |
--max-workers |
Maximum concurrent workers | 100 | --max-workers 50 |
--auto-balance-load |
Enable automatic load balancing | true | --auto-balance-load |
--heartbeat-timeout |
Worker timeout in seconds | 30 | --heartbeat-timeout 60 |
Worker Configuration
| Parameter | Description | Default | Example |
|---|---|---|---|
--worker |
Enable worker mode | false | --worker |
--coordinator-host |
Coordinator hostname/IP | localhost | --coordinator-host 10.0.1.100 |
--coordinator-port |
Coordinator port | 9630 | --coordinator-port 9630 |
--worker-id |
Unique worker identifier | auto-generated | --worker-id "worker-gpu-1" |
--max-concurrent |
Max concurrent requests | 100 | --max-concurrent 500 |
--max-rps |
Max requests per second | unlimited | --max-rps 1000 |
Load Distribution Algorithms
1. Round Robin Distribution (Default)
Evenly distributes requests across all available workers:
# Coordinator automatically balances 1000 concurrent across all workers
- Best for: Uniform worker capabilities
- Distribution: Equal load per worker
- Use case: Homogeneous infrastructure
2. Load-Based Distribution
Dynamically adjusts based on worker performance and current load:
# Intelligent load balancing based on worker performance
- Best for: Mixed worker capabilities
- Distribution: Performance-weighted allocation
- Use case: Heterogeneous infrastructure
3. Weighted Distribution
Manual weight assignment for custom load distribution:
# Custom worker weights (worker-1: 50%, worker-2: 30%, worker-3: 20%)
- Best for: Known performance characteristics
- Distribution: User-defined weights
- Use case: Capacity planning and testing
Real-time Metrics Aggregation
The coordinator automatically aggregates metrics from all workers:
Global Metrics:
- Total Requests: Cumulative requests across all workers
- Aggregated RPS: Combined requests per second
- Response Time Percentiles: Weighted percentiles (P50, P90, P95, P99)
- Success/Error Rates: Combined success and failure statistics
- Throughput: Total bandwidth across all workers
Per-Worker Metrics:
- Individual Performance: Each worker's specific metrics
- Load Distribution: Current request allocation per worker
- Health Status: Worker connectivity and performance status
- Resource Usage: CPU, memory, and connection utilization
Geographic Distribution Examples
Multi-Region Setup
# US East Coordinator (Virginia)
# EU West Worker (Ireland)
# Asia Pacific Worker (Singapore)
# Distributed global test
Hybrid Cloud Setup
# On-premises coordinator
# AWS worker (high-performance instance)
# Azure worker (standard instance)
# Google Cloud worker (CPU-optimized)
Fault Tolerance & Recovery
Automatic Worker Recovery
- Heartbeat Monitoring: Regular health checks (default: 10 seconds)
- Automatic Failover: Redistribute load when workers disconnect
- Graceful Reconnection: Workers automatically rejoin when available
- Load Rebalancing: Dynamic adjustment when worker count changes
Network Resilience
# Coordinator with extended timeouts for unstable networks
# Worker with connection retry
Use Cases & Best Practices
Large-Scale Load Testing
# 10,000 concurrent users across 20 workers
Geographic Performance Testing
# Test CDN and edge performance from multiple regions
Microservices Stress Testing
# Distributed testing of microservices architecture
CI/CD Distributed Testing
# Automated distributed testing in CI pipeline
Performance Tips
- Network Bandwidth: Ensure adequate bandwidth between coordinator and workers
- Worker Placement: Distribute workers across different networks/regions for realistic testing
- Resource Monitoring: Monitor coordinator and worker resource usage during tests
- Load Balancing: Use load-based distribution for heterogeneous worker environments
- WebUI Monitoring: Use coordinator WebUI for real-time visibility into distributed tests
- Gradual Scaling: Start with fewer workers and scale up to identify bottlenecks
Important Considerations
- Coordinator Capacity: The coordinator can handle up to 100 workers by default
- Network Requirements: Stable WebSocket connections between coordinator and workers
- Synchronization: All workers should have synchronized clocks for accurate metrics
- Security: Use secure networks or VPN for distributed setups across untrusted networks
- Resource Planning: Factor in network overhead and coordination latency
Real-World Examples
API Testing with WebUI
# Comprehensive API test with browser dashboard
# E-commerce API stress test
Performance Benchmarking
# High-throughput performance test
# Sustained load test (30 minutes)
Stealth & Security Testing
# Low-profile reconnaissance
# User-Agent rotation test
CI/CD Integration
# Automated testing in CI pipeline - compact output
# Quiet automation for scripts
# Health check with WebSocket monitoring
|
# Minimal output for log parsing
# Request count mode for CI testing
Distributed Load Testing
# Large-scale e-commerce platform testing (Black Friday simulation)
# Coordinator (main control server)
# Multi-region workers
# US East worker (Virginia)
# EU West worker (Ireland)
# Asia Pacific worker (Singapore)
# Execute distributed test (run from coordinator)
# Global API performance testing
# Coordinator for global CDN testing
# Regional workers testing different CDN edges
# Microservices stress testing with mixed workloads
# Financial services compliance testing (high-security, multi-region)
License
MIT License