Files
simple-load-tester/main.go

99 lines
2.1 KiB
Go

package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"sync"
"time"
)
type RequestData struct {
RequestNumber int
StartTime int64
Duration int64
IsError bool
}
func makeRequest(url string, requestNumber int, wg *sync.WaitGroup, results chan<- RequestData) {
defer wg.Done()
startTime := time.Now().UnixNano()
httpClient := http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
TLSHandshakeTimeout: 30 * time.Second,
},
}
resp, err := httpClient.Get(url)
//resp, err := http.Get(url)
if err != nil {
fmt.Printf("Error making request %d: %v\n", requestNumber, err)
results <- RequestData{
RequestNumber: requestNumber,
StartTime: startTime,
Duration: time.Now().UnixNano() - startTime,
IsError: true,
}
return
}
defer resp.Body.Close()
duration := time.Now().UnixNano() - startTime
results <- RequestData{
RequestNumber: requestNumber,
StartTime: startTime,
Duration: duration,
IsError: false,
}
}
func main() {
// Define your API URL and number of requests to make
apiURL := "https://git.sa.vin"
numRequests := 1000
//numRequests := 596
// Create a channel to collect the request results
results := make(chan RequestData, numRequests)
// Create a WaitGroup to synchronize goroutines
var wg sync.WaitGroup
wg.Add(numRequests)
// Start load testing by spawning goroutines
for i := 0; i < numRequests; i++ {
go makeRequest(apiURL, i, &wg, results)
}
// Wait for all goroutines to finish
wg.Wait()
// Close the results channel
close(results)
// Collect the results from the channel
var requestData []RequestData
for result := range results {
requestData = append(requestData, result)
}
// Marshal the data to JSON
jsonData, err := json.Marshal(requestData)
if err != nil {
fmt.Printf("Error marshaling JSON: %v\n", err)
return
}
// Write the JSON data to disk
err = os.WriteFile("load_test_results.json", jsonData, 0644)
if err != nil {
fmt.Printf("Error writing JSON file: %v\n", err)
return
}
fmt.Println("Load testing completed. Results stored in load_test_results.json")
}