// Config returns the default configuration without credentials. // To retrieve a config with credentials also included use // `defaults.Get().Config` instead. // // Generally you shouldn't need to use this method directly, but // is available if you need to reset the configuration of an // existing service client or session. func Config() *aws.Config { return aws.NewConfig(). WithCredentials(credentials.AnonymousCredentials). WithRegion(os.Getenv("AWS_REGION")). WithHTTPClient(http.DefaultClient). WithMaxRetries(aws.UseServiceDefaultRetries). WithLogger(aws.NewDefaultLogger()). WithLogLevel(aws.LogOff). WithSleepDelay(time.Sleep) }
// Start a test func (t *Test) Start() <-chan queue.RegionsAggData { awsConfig := aws.NewConfig().WithRegion(t.config.Region) infra, err := infrastructure.New(awsConfig) if err != nil { log.Fatal(err) } t.invokeLambdas(awsConfig, infra.QueueURL()) results := make(chan queue.RegionsAggData) go func() { for result := range queue.Aggregate(awsConfig, infra.QueueURL(), t.config.TotalRequests) { results <- result } infra.Clean() close(results) }() return results }
func runLoadTest(client *http.Client, sqsurl string, url string, totalRequests int, concurrencycount int, awsregion string, reportingFrequency time.Duration) { awsConfig := aws.NewConfig().WithRegion(awsregion) sqsAdaptor := queue.NewSQSAdaptor(awsConfig, sqsurl) //sqsAdaptor := queue.NewDummyAdaptor(sqsurl) jobs := make(chan struct{}, totalRequests) ch := make(chan RequestResult, totalRequests) var wg sync.WaitGroup loadTestStartTime := time.Now() var requestsSoFar int for i := 0; i < totalRequests; i++ { jobs <- struct{}{} } close(jobs) fmt.Print("Spawning workers…") for i := 0; i < concurrencycount; i++ { wg.Add(1) go fetch(loadTestStartTime, client, url, totalRequests, jobs, ch, &wg, awsregion) fmt.Print(".") } fmt.Println(" done.\nWaiting for results…") ticker := time.NewTicker(reportingFrequency) quit := make(chan struct{}) quitting := false for requestsSoFar < totalRequests && !quitting { i := 0 var timeToFirstTotal int64 var requestTimeTotal int64 totBytesRead := 0 statuses := make(map[string]int) var firstRequestTime int64 var lastRequestTime int64 var slowest int64 var fastest int64 var totalTimedOut int var totalConnectionError int resetStats := false for requestsSoFar < totalRequests && !quitting && !resetStats { aggregate := false select { case r := <-ch: i++ requestsSoFar++ if requestsSoFar%10 == 0 || requestsSoFar == totalRequests { fmt.Printf("\r%.2f%% done (%d requests out of %d)", (float64(requestsSoFar)/float64(totalRequests))*100.0, requestsSoFar, totalRequests) } if firstRequestTime == 0 { firstRequestTime = r.Time } lastRequestTime = r.Time if r.Timeout { totalTimedOut++ continue } if r.ConnectionError { totalConnectionError++ continue } if r.ElapsedLastByte > slowest { slowest = r.ElapsedLastByte } if fastest == 0 { fastest = r.ElapsedLastByte } else { if r.ElapsedLastByte < fastest { fastest = r.ElapsedLastByte } } timeToFirstTotal += r.ElapsedFirstByte totBytesRead += r.Bytes statusStr := strconv.Itoa(r.Status) _, ok := statuses[statusStr] if !ok { statuses[statusStr] = 1 } else { statuses[statusStr]++ } requestTimeTotal += r.Elapsed if requestsSoFar == totalRequests { quitting = true } case <-ticker.C: if i == 0 { continue } aggregate = true case <-quit: ticker.Stop() quitting = true } if aggregate || quitting { durationNanoSeconds := lastRequestTime - firstRequestTime durationSeconds := float32(durationNanoSeconds) / float32(1000000000) var reqPerSec float32 var kbPerSec float32 if durationSeconds > 0 { reqPerSec = float32(i) / durationSeconds kbPerSec = (float32(totBytesRead) / durationSeconds) / 1024.0 } else { reqPerSec = 0 kbPerSec = 0 } fatalError := "" if (totalTimedOut + totalConnectionError) > i/2 { fatalError = "Over 50% of requests failed, aborting" quitting = true } aggData := queue.AggData{ i, totalTimedOut, totalConnectionError, timeToFirstTotal / int64(i), totBytesRead, statuses, requestTimeTotal / int64(i), reqPerSec, kbPerSec, slowest, fastest, awsregion, fatalError, } sqsAdaptor.SendResult(aggData) resetStats = true } } } fmt.Printf("\nYay🎈 - %d requests completed\n", requestsSoFar) }