Skip to content
This repository has been archived by the owner on May 21, 2024. It is now read-only.

Latest commit

 

History

History
193 lines (151 loc) · 4.86 KB

README.md

File metadata and controls

193 lines (151 loc) · 4.86 KB

Ultron

Go Report Card codecov GoDoc Ultron CI CodeQL

a http load testing tool in go

Usage

Requirements

Go 1.16+

Install

go get github.com/wosai/ultron/v2

Example

LocalRunner

package main

import (
	"net/http"
	"time"

	"github.com/wosai/ultron/v2"
)

func main() {
	task := ultron.NewTask()
	attacker := ultron.NewHTTPAttacker("google")
	attacker.Apply(
		ultron.WithPrepareFunc(func() (*http.Request, error) { // 压测事务逻辑实现
			return http.NewRequest(http.MethodGet, "https://www.google.com/ncr", nil)
		}),
		ultron.WithCheckFuncs(ultron.CheckHTTPStatusCode),
	)
	task.Add(attacker, 1)

	plan := ultron.NewPlan("google homepage")
	plan.AddStages(
		&ultron.V1StageConfig{
			Duration:        10 * time.Minute,
			ConcurrentUsers: 200,
			RampUpPeriod:    10,
		}
	)

	runner := ultron.NewLocalRunner()
	runner.Assign(task)   

	if err := runner.Launch(); err != nil {
		panic(err)
	}

	if err := runner.StartPlan(plan); err != nil {
		panic(err)
	}

	block := make(chan struct{}, 1)
	<-block
}

SlaveRunner

package main

import (
	"net/http"

	"github.com/wosai/ultron/v2"
	"google.golang.org/grpc"
)

func main() {
	task := ultron.NewTask()
	attacker := ultron.NewHTTPAttacker("google")
	attacker.Apply(
		ultron.WithPrepareFunc(func() (*http.Request, error) { // 压测事务逻辑实现
			return http.NewRequest(http.MethodGet, "https://www.google.com/ncr", nil)
		}),
		ultron.WithCheckFuncs(ultron.CheckHTTPStatusCode),
	)
	task.Add(attacker, 1)

	// 启动runner
	runner := ultron.NewSlaveRunner()
	runner.Assign(task)
	runner.SubscribeResult(nil)                                          // 订阅单次压测结果
	if err := runner.Connect(":2021", grpc.WithInsecure()); err != nil { // 连接master的grpc服务
		panic(err)
	}

	// 阻塞当前goroutine,避免程序推出
	block := make(chan struct{}, 1)
	<-block
}

MasterRunner

ultron

master

Web Portal

plan

stats

Report

Terminal Table

stats report

JSON Format

{
    "first_attack": "2021-11-02T03:09:08.419359417Z",
    "last_attack": "2021-11-02T03:09:21.209236204Z",
    "total_requests": 139450,
    "total_tps": 10903.15429322517,
    "full_history": true,
    "reports": {
        "benchmark": {
            "name": "benchmark",
            "requests": 139450,
            "min": 10000253,
            "max": 40510983,
            "median": 10000000,
            "average": 11869156,
            "tps": 10903.15429322517,
            "distributions": {
                "0.50": 10000000,
                "0.60": 10000000,
                "0.70": 10000000,
                "0.80": 10000000,
                "0.90": 20000000,
                "0.95": 21000000,
                "0.97": 26000000,
                "0.98": 29000000,
                "0.99": 30000000,
                "1.00": 40510983
            },
            "full_history": true,
            "first_attack": "2021-11-02T03:09:08.419359417Z",
            "last_attack": "2021-11-02T03:09:21.209236204Z"
        }
    },
    "extras": {
        "plan": "benchmark test"
    }
}

Grafana Dashboard

scripts/grafana/dashboard.json

Enhancements

Module Description
github.com/wosai/ultron/attacker/fastattacker/v2 Another http attacker implemented by fasthttp
github.com/wosai/ultron/attacker/jsonrpc/v2 A attacker used for jsonrpc protocol
github.com/wosai/ultron/handler/influxdbv1/v2 A handler that save attack result and report in InfluxDB v1
github.com/wosai/ultron/attacker/mqtt/v2 A attacker used for MQTT protocol v3.3

Contributors

Made with contrib.rocks.