colors-e2e/colors-be/main.go (91 lines of code) (raw):

package main import ( "context" "encoding/json" "io" "log" "math/rand" "net/http" "os" "strconv" "time" ) func main() { color := "red" // default color overrideColor := os.Getenv("OverrideColor") hostname := os.Getenv("HOSTNAME") faultPercentString := os.Getenv("FaultPercent") faultPercent := 0 if faultPercentString != "" { parsedPercent, err := strconv.ParseInt(faultPercentString, 10, 32) if err != nil { log.Fatalf("cannot parse fault perecent %v: %v", faultPercent, err) } faultPercent = int(parsedPercent) } if overrideColor != "" { color = overrideColor } scvData, err := GetSerivceMetadata() if err != nil { log.Fatalf("cannot get service metadata: %v", err) } requestLogger, err := NewRequestLogger(context.Background(), scvData) if err != nil { log.Fatalf("cannot setup request logger") } createConstantLoad(context.Background(), "http://colors-be-scv:8080/color", 1) http.HandleFunc("/color", func(w http.ResponseWriter, r *http.Request) { var responseStatusGood bool = true result := struct { Color string `json:"color"` Name string `json:"name"` }{ Color: color, Name: hostname, } if rand.Intn(101) < faultPercent { responseStatusGood = false w.WriteHeader(500) } else { err := json.NewEncoder(w).Encode(result) if err != nil { log.Printf("error encoding response: %v\n", err) w.WriteHeader(500) responseStatusGood = false } } requestLogger.LogRequest(r.Context(), responseStatusGood) }) // Listen on port 8080. http.ListenAndServe(":8080", nil) } // createConstantLoad creates constant load against the endpoint forever func createConstantLoad(ctx context.Context, url string, qps int) { log.Printf("creating constant load against %v with QPS %v", url, qps) delay := 1000 / qps go func() { for { select { case <-ctx.Done(): return default: sendRequest(url) time.Sleep(time.Duration(delay) * time.Millisecond) } } }() } // sendRequest sends a get request to the endpoint and ignores the response func sendRequest(endpoint string) { client := &http.Client{} req, err := http.NewRequest("GET", endpoint, nil) if err != nil { log.Printf("error creating request: %v", err) return } req.Close = true response, err := client.Do(req) if err != nil { return } defer response.Body.Close() io.Copy(io.Discard, response.Body) }