save this stuff
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
load-testing.exe
|
132
load.sh
Normal file
132
load.sh
Normal file
@ -0,0 +1,132 @@
|
||||
for i in {0..35}
|
||||
do
|
||||
curl -s --location --request GET 'https://dev.bergx.io/api/v1/apps/users?[1-1000]' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6IiIsImNsaWVudElkIjoiNTBiMmFiNjEtODllNy00MmQ3LTgxOWYtMzRjYTkzYjRlYTliIiwidXNlcklkIjoiIiwidHlwZSI6ImFjY2Vzc1Rva2VuIiwiaWF0IjoxNTg4MDUzNDMxLCJleHAiOjE1ODgwNTUyMzF9.241Bs1XlRMJAGlUOxQ5ZC1gLeZ8a5QmfpzhjV4yTF3w' \
|
||||
--data-raw '' -o nul &
|
||||
pidlist="$pidlist $!"
|
||||
curl --location --request PUT 'https://dev.bergx.io/api/v1/apps/users/b9578a59-fa2d-40d8-ae35-4df92238c1f3?[1-100]' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6IiIsImNsaWVudElkIjoiNTBiMmFiNjEtODllNy00MmQ3LTgxOWYtMzRjYTkzYjRlYTliIiwidXNlcklkIjoiIiwidHlwZSI6ImFjY2Vzc1Rva2VuIiwiaWF0IjoxNTg4MDUzNDMxLCJleHAiOjE1ODgwNTUyMzF9.241Bs1XlRMJAGlUOxQ5ZC1gLeZ8a5QmfpzhjV4yTF3w' \
|
||||
--header 'Content-Type: text/plain' \
|
||||
--data-raw '{
|
||||
"claims": {
|
||||
"email": "gomas.bmw@gmail.com",
|
||||
"sub": "b9578a59-fa2d-40d8-ae35-4df92238c1f3",
|
||||
"email_verified": true,
|
||||
"gender": "male",
|
||||
"picture": "https://upload.wikimedia.org/wikipedia/commons/e/e8/CandymyloveYasu.png",
|
||||
"family_name": "Payne",
|
||||
"birthdate": "1987-12-22"
|
||||
},
|
||||
"organizations": [],
|
||||
"orgAutho": {},
|
||||
"app": "637d6e72-c773-4229-9cb5-4813b0c546e6"
|
||||
}' -s -o nul &
|
||||
done
|
||||
|
||||
# for i in {0..60}
|
||||
# do
|
||||
# curl -s --location --request GET 'http://192.168.1.69:8080/api/v1/apps/users?[1-1000]' \
|
||||
# --header 'Content-Type: application/json' \
|
||||
# --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6IiIsImNsaWVudElkIjoiNTBiMmFiNjEtODllNy00MmQ3LTgxOWYtMzRjYTkzYjRlYTliIiwidXNlcklkIjoiIiwidHlwZSI6ImFjY2Vzc1Rva2VuIiwiaWF0IjoxNTg4MDUyMzMwLCJleHAiOjE1ODgwNTQxMzB9.jmBvBr7G2wYMX9efdGZO24RJJQrYZts3y2iAa18MZ8Q' \
|
||||
# --data-raw '' -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# done
|
||||
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
#
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
#
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
#
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
# curl -s "https://dev.bergx.io/auth/login?[1-100]" -o nul &
|
||||
# pidlist="$pidlist $!"
|
||||
|
||||
|
||||
for job in $pidlist
|
||||
do
|
||||
echo $job
|
||||
wait $job || let "FAIL+=1"
|
||||
done
|
||||
|
||||
if [ "$FAIL" == "0" ]; then
|
||||
echo "YAY!"
|
||||
else
|
||||
echo "FAIL! ($FAIL)"
|
||||
fi
|
138
main.go
Normal file
138
main.go
Normal file
@ -0,0 +1,138 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var app *cli.App
|
||||
|
||||
func main() {
|
||||
app = &cli.App{
|
||||
Flags: []cli.Flag{
|
||||
&cli.StringFlag{
|
||||
Name: "method",
|
||||
Aliases: []string{"m"},
|
||||
Value: "GET",
|
||||
Usage: "The `METHOD` for making the request",
|
||||
},
|
||||
&cli.DurationFlag{
|
||||
Name: "duration",
|
||||
Aliases: []string{"d"},
|
||||
Value: time.Second * 60,
|
||||
Usage: "`DURATION` for how long to run the test",
|
||||
},
|
||||
&cli.Int64Flag{
|
||||
Name: "rpm",
|
||||
Usage: "`RATE-PER-MINUTE`",
|
||||
Value: 60,
|
||||
},
|
||||
&cli.StringSliceFlag{
|
||||
Name: "request",
|
||||
Aliases: []string{"r"},
|
||||
Value: cli.NewStringSlice("http://localhost:8080/"),
|
||||
Usage: "The `URL` for making the request",
|
||||
},
|
||||
&cli.StringSliceFlag{
|
||||
Name: "header",
|
||||
Aliases: []string{"H"},
|
||||
Value: cli.NewStringSlice("Content-Type: application/json"),
|
||||
Usage: "The `HEADER` for the request",
|
||||
},
|
||||
},
|
||||
Name: "Burst CLI",
|
||||
Usage: "Run Burst to throw large amounts of traffic at a give url or set of urls",
|
||||
UsageText: "burst -m GET -r http://localhost:8080/ -H 'Content-Type: application/json' -o data.json --rpm 1000",
|
||||
Action: func(c *cli.Context) error {
|
||||
fmt.Println("Bursting with happiness")
|
||||
process(c)
|
||||
return nil
|
||||
},
|
||||
EnableBashCompletion: true,
|
||||
Version: "1.0.0",
|
||||
}
|
||||
|
||||
err := app.Run(os.Args)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func request(ctx *cli.Context, i int) (*http.Response, error) {
|
||||
req := ctx.StringSlice("request")
|
||||
var resp *http.Response
|
||||
method := ctx.String("method")
|
||||
if method == "GET" {
|
||||
resp, err := http.Get(req[i])
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Println(resp.Body)
|
||||
}
|
||||
// if method == "POST" {
|
||||
// resp, err := http.POST(req[i])
|
||||
// if err != nil {
|
||||
// log.Fatal(err)
|
||||
// }
|
||||
// fmt.Println(resp.Body)
|
||||
// }
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func process(ctx *cli.Context) error {
|
||||
req := ctx.StringSlice("request")
|
||||
ticker := time.NewTicker(500 * time.Millisecond)
|
||||
done := make(chan bool, len(req))
|
||||
|
||||
go func() {
|
||||
for {
|
||||
for {
|
||||
select {
|
||||
case <-done:
|
||||
return
|
||||
case t := <-ticker.C:
|
||||
fmt.Println(req[0])
|
||||
resp, err := request(ctx, 0)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Println(resp.Body)
|
||||
fmt.Println("Tick at", t)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
time.Sleep(ctx.Duration("duration"))
|
||||
done <- true
|
||||
|
||||
// select {
|
||||
// case <-ch:
|
||||
// fmt.Println("Read from ch")
|
||||
// case <-time.After(1 * time.Second):
|
||||
// fmt.Println("Timed out")
|
||||
// }
|
||||
|
||||
// if method == "POST" {
|
||||
// resp, err := http.POST(req, data)
|
||||
// if err != nil {
|
||||
// log.Fatal(err)
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
|
||||
// if method == "PUT" {
|
||||
// resp, err := http.Get(req)
|
||||
// if err != nil {
|
||||
// log.Fatal(err)
|
||||
// return err
|
||||
// }
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
44
readme.md
Normal file
44
readme.md
Normal file
@ -0,0 +1,44 @@
|
||||
# Burst
|
||||
|
||||
A simple CLI tool for load testing specific endpoints.
|
||||
|
||||
Or just try this: http://servermonitoringhq.com/blog/how_to_quickly_stress_test_a_web_server
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
burst --request GET 'https://dev.bergx.io/api/v1/apps/users' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'Authorization: Bearer {{authtoken}}' \
|
||||
--out data.json \
|
||||
--rate max
|
||||
```
|
||||
|
||||
Which is similar to:
|
||||
```bash
|
||||
curl --location --request GET '192.168.1.69:8080/api/v1/apps/users' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--header 'Authorization: Bearer {{authtoken}}' \
|
||||
--data-raw ''
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
`-r | --request method url` specifies the method type for the request and the url to test.
|
||||
|
||||
`-H | --header` will allow you to attach any headers to your request.
|
||||
|
||||
`-o path | --out path` specifies the output file for data gathered.
|
||||
|
||||
`-c path | --config path` specifies the file for a configured test.
|
||||
|
||||
|
||||
### Config file
|
||||
|
||||
In the config file you can specify many requests and the rate at which to test them.
|
||||
|
||||
```json
|
||||
{
|
||||
"": ""
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user