75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package stressClient
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
func (sc *stressClient) spinOffQueryPackage(p Package, serv int) {
|
|
sc.Add(1)
|
|
sc.rc.Increment()
|
|
go func() {
|
|
// Send the query
|
|
sc.prepareQuerySend(p, serv)
|
|
sc.Done()
|
|
sc.rc.Decrement()
|
|
}()
|
|
}
|
|
|
|
// Prepares to send the GET request
|
|
func (sc *stressClient) prepareQuerySend(p Package, serv int) {
|
|
|
|
var queryTemplate string
|
|
if sc.ssl {
|
|
queryTemplate = "https://%v/query?db=%v&q=%v&u=%v&p=%v"
|
|
} else {
|
|
queryTemplate = "http://%v/query?db=%v&q=%v&u=%v&p=%v"
|
|
}
|
|
queryURL := fmt.Sprintf(queryTemplate, sc.addresses[serv], sc.database, url.QueryEscape(string(p.Body)), sc.username, sc.password)
|
|
|
|
// Send the query
|
|
sc.makeGet(queryURL, p.StatementID, p.Tracer)
|
|
|
|
// Query Interval enforcement
|
|
qi, _ := time.ParseDuration(sc.qdelay)
|
|
time.Sleep(qi)
|
|
}
|
|
|
|
// Sends the GET request, reads it, and handles errors
|
|
func (sc *stressClient) makeGet(addr, statementID string, tr *Tracer) {
|
|
|
|
// Make GET request
|
|
t := time.Now()
|
|
resp, err := http.Get(addr)
|
|
elapsed := time.Since(t)
|
|
|
|
if err != nil {
|
|
log.Printf("Error making Query HTTP request\n error: %v\n", err)
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
// Read body and return it for Reporting
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
|
|
if err != nil {
|
|
log.Fatalf("Error reading Query response body\n error: %v\n", err)
|
|
}
|
|
|
|
if resp.StatusCode != 200 {
|
|
log.Printf("Query returned non 200 status\n status: %v\n error: %v\n", resp.StatusCode, string(body))
|
|
}
|
|
|
|
// Send the response
|
|
sc.responseChan <- NewResponse(sc.queryPoint(statementID, body, resp.StatusCode, elapsed, tr.Tags), tr)
|
|
}
|
|
|
|
func success(r *http.Response) bool {
|
|
// ADD success for tcp, udp, etc
|
|
return r != nil && (r.StatusCode == 204 || r.StatusCode == 200)
|
|
}
|