fiddle - Fix leaky requests.

Bug: skia:
Change-Id: Ie6e700ef90e73be345641a3e13ce91c74dab26f9
Reviewed-on: https://skia-review.googlesource.com/c/181380
Auto-Submit: Joe Gregorio <jcgregorio@google.com>
Reviewed-by: Ravi Mistry <rmistry@google.com>
Commit-Queue: Ravi Mistry <rmistry@google.com>
diff --git a/fiddlek/go/fiddle/main.go b/fiddlek/go/fiddle/main.go
index ba58552..81ff513 100644
--- a/fiddlek/go/fiddle/main.go
+++ b/fiddlek/go/fiddle/main.go
@@ -10,7 +10,6 @@
 	"html/template"
 	ttemplate "html/template"
 	"net/http"
-	_ "net/http/pprof"
 	"path/filepath"
 	"regexp"
 	"strconv"
diff --git a/fiddlek/go/runner/runner.go b/fiddlek/go/runner/runner.go
index 9af35c0..54ee8da 100644
--- a/fiddlek/go/runner/runner.go
+++ b/fiddlek/go/runner/runner.go
@@ -8,7 +8,6 @@
 	"errors"
 	"fmt"
 	"io"
-	"io/ioutil"
 	"math/rand"
 	"net/http"
 	"path/filepath"
@@ -69,7 +68,6 @@
 
 type Runner struct {
 	sourceDir string
-	client    *http.Client
 	local     bool
 	clientset *kubernetes.Clientset
 	rand      *rand.Rand
@@ -82,7 +80,6 @@
 func New(local bool, sourceDir string) (*Runner, error) {
 	ret := &Runner{
 		sourceDir:  sourceDir,
-		client:     httputils.NewTimeoutClient(),
 		local:      local,
 		rand:       rand.New(rand.NewSource(time.Now().UnixNano())),
 		fiddlerIPs: []string{},
@@ -207,8 +204,17 @@
 }
 
 func (r *Runner) singleRun(url string, body io.Reader) (*types.Result, error) {
+	client := httputils.NewTimeoutClient()
 	var output bytes.Buffer
-	resp, err := r.client.Post(url, "application/json", body)
+
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		sklog.Errorf("Failed to create POST request: %s", err)
+		return nil, failedToSendErr
+	}
+	// Pods come and go, so don't keep the connection alive.
+	req.Close = true
+	resp, err := client.Do(req)
 	if err != nil {
 		sklog.Errorf("Failed to POST to %q: %s", url, err)
 		return nil, failedToSendErr
@@ -307,6 +313,32 @@
 	return ret
 }
 
+func singlePodVersion(client *http.Client, address string) (string, bool) {
+	rootURL := fmt.Sprintf("http://%s:8000", address)
+	req, err := http.NewRequest("GET", rootURL, nil)
+	if err != nil {
+		sklog.Infof("Failed to create request for fiddler status: %s", err)
+		return "", false
+	}
+	// Pods come and go, so don't keep the connection alive.
+	req.Close = true
+	resp, err := client.Do(req)
+	if err != nil {
+		sklog.Infof("Failed to request fiddler status: %s", err)
+		return "", false
+	}
+	defer util.Close(resp.Body)
+	var fiddlerResp types.FiddlerMainResponse
+	if err := json.NewDecoder(resp.Body).Decode(&fiddlerResp); err != nil {
+		sklog.Warningf("Failed to read status body: %s", err)
+		return "", false
+	}
+	if fiddlerResp.State == types.IDLE {
+		return fiddlerResp.Version, true
+	}
+	return "", false
+}
+
 func (r *Runner) metricsSingleStep() {
 	idleCount := 0
 	// What versions of skia are all the fiddlers running.
@@ -314,28 +346,8 @@
 	ips := r.podIPs()
 	fastClient := httputils.NewFastTimeoutClient()
 	for _, address := range ips {
-		rootURL := fmt.Sprintf("http://%s:8000", address)
-		resp, err := fastClient.Get(rootURL)
-		if err != nil {
-			sklog.Infof("Failed to request fiddler status: %s", err)
-			continue
-		}
-		b, err := ioutil.ReadAll(resp.Body)
-		if err != nil {
-			sklog.Warningf("Failed to read status body: %s", err)
-			continue
-		}
-		util.Close(resp.Body)
-		if resp.Header.Get("Content-Type") == "application/json" {
-			var fiddlerResp types.FiddlerMainResponse
-			if err := json.Unmarshal(b, &fiddlerResp); err != nil {
-				sklog.Warningf("Failed to read status: %s", err)
-				continue
-			}
-			if fiddlerResp.State == types.IDLE {
-				idleCount += 1
-			}
-			versions[fiddlerResp.Version] += 1
+		if ver, ok := singlePodVersion(fastClient, address); ok {
+			versions[ver] += 1
 		}
 	}
 	// Report the version that appears the most. Usually there will only be one
@@ -357,7 +369,7 @@
 func (r *Runner) Metrics() {
 	metricsLiveness := metrics2.NewLiveness("metrics")
 	r.metricsSingleStep()
-	for _ = range time.Tick(10 * time.Second) {
+	for _ = range time.Tick(30 * time.Second) {
 		r.metricsSingleStep()
 		metricsLiveness.Reset()
 	}