99 lines
2.1 KiB
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")
|
|
}
|