背景
之前在公司做壓測工作的時候,使用了web壓測工具vegeta。後續又接到過dns的性能壓測、redis的性能壓測等任務。http的壓測工具vegeta並不能滿足需求了。於是模仿vegeta的lib包寫了attacker 這個項目。
Attacker
attacker是一個支持自定義任務的項目。 attacker模仿了vegeta的壓測邏輯,支持自定義任務。可以按照指定的壓測週期,壓測頻率執行自定義任務。
每個任務可以分爲幾個順序相關或無關的子任務。
使用
package main
import (
"os"
"time"
attacker "github.com/FengGeSe/attacker/lib"
cmd "github.com/FengGeSe/attacker/cmd"
)
// implements attacker.Task
type myTask struct{}
var _ attacker.Task = &myTask{}
var count = 0
func (t *myTask) Run() *attacker.Result {
rst := attacker.NewResult("流程壓測")
// A
{
subRst := rst.SubResult("操作A")
subRst.StartTiming()
// do something
time.Sleep(1 * time.Millisecond)
subRst.EndTiming()
}
// B
{
subRst := rst.SubResult("操作B")
subRst.StartTiming()
// do something
time.Sleep(1 * time.Millisecond)
subRst.EndTiming()
// mock error
if count == 1 {
subRst.Code = 500
subRst.Error = "出錯了偶"
count++
return rst
}
count++
}
// C
{
subRst := rst.SubResult("操作C")
subRst.StartTiming()
// do something
time.Sleep(1 * time.Millisecond)
subRst.EndTiming()
}
return rst
}
func main() {
task := &myTask{}
cmd.Run(task, os.Stdout)
}
運行:go run main.go attack -d 1s -r 10
開始壓測: 2020-02-05 21:01:59 , rate=10/s, duration=1s
+--------------+------+--------+--------+--------+-------+---------+---------+--------+--------+--------+
| Task | Rate | Ratio | Mean | Max | Total | Success | Failure | P50 | P95 | P99 |
+--------------+------+--------+--------+--------+-------+---------+---------+--------+--------+--------+
| 流程壓測 | 9.89 | 90.0% | 4.04ms | 4.12ms | 10 | 9 | 1 | 4.04ms | 4.12ms | 4.12ms |
| 1.操作A | - | 100.0% | 1.32ms | 1.37ms | 10 | 10 | 0 | 1.33ms | 1.37ms | 1.37ms |
| 2.操作B | - | 90.0% | 1.34ms | 1.36ms | 10 | 9 | 1 | 1.33ms | 1.36ms | 1.36ms |
| 3.操作C | - | 100.0% | 1.32ms | 1.37ms | 9 | 9 | 0 | 1.32ms | 1.37ms | 1.37ms |
+--------------+------+--------+--------+--------+-------+---------+---------+--------+--------+--------+
Error Set:
[1] 錯誤: 出錯了偶
數量: 1
更多使用詳情請見github: https://github.com/FengGeSe/attacker
ps: 好用記得點star .~