From b6312cf13cbf1c28b848992e4c0fa7f751847df5 Mon Sep 17 00:00:00 2001 From: Daniel Nelson Date: Tue, 9 May 2017 16:20:43 -0700 Subject: [PATCH] Fix prometheus input creation of transport on every gather --- plugins/inputs/prometheus/prometheus.go | 48 +++++++++++++++---------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/plugins/inputs/prometheus/prometheus.go b/plugins/inputs/prometheus/prometheus.go index 2e613e2c0..73e202d7a 100644 --- a/plugins/inputs/prometheus/prometheus.go +++ b/plugins/inputs/prometheus/prometheus.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io/ioutil" - "net" "net/http" "sync" "time" @@ -32,6 +31,8 @@ type Prometheus struct { SSLKey string `toml:"ssl_key"` // Use SSL but skip chain & host verification InsecureSkipVerify bool + + client *http.Client } var sampleConfig = ` @@ -65,6 +66,14 @@ var ErrProtocolError = errors.New("prometheus protocol error") // Reads stats from all configured servers accumulates stats. // Returns one of the errors encountered while gather stats (if any). func (p *Prometheus) Gather(acc telegraf.Accumulator) error { + if p.client == nil { + client, err := p.createHttpClient() + if err != nil { + return err + } + p.client = client + } + var wg sync.WaitGroup for _, serv := range p.Urls { @@ -89,29 +98,30 @@ var client = &http.Client{ Timeout: time.Duration(4 * time.Second), } +func (p *Prometheus) createHttpClient() (*http.Client, error) { + tlsCfg, err := internal.GetTLSConfig( + p.SSLCert, p.SSLKey, p.SSLCA, p.InsecureSkipVerify) + if err != nil { + return nil, err + } + + client := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: tlsCfg, + DisableKeepAlives: true, + }, + Timeout: p.ResponseTimeout.Duration, + } + + return client, nil +} + func (p *Prometheus) gatherURL(url string, acc telegraf.Accumulator) error { var req, err = http.NewRequest("GET", url, nil) req.Header.Add("Accept", acceptHeader) var token []byte var resp *http.Response - tlsCfg, err := internal.GetTLSConfig( - p.SSLCert, p.SSLKey, p.SSLCA, p.InsecureSkipVerify) - if err != nil { - return err - } - - var rt http.RoundTripper = &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 5 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - TLSHandshakeTimeout: 5 * time.Second, - TLSClientConfig: tlsCfg, - ResponseHeaderTimeout: p.ResponseTimeout.Duration, - DisableKeepAlives: true, - } - if p.BearerToken != "" { token, err = ioutil.ReadFile(p.BearerToken) if err != nil { @@ -120,7 +130,7 @@ func (p *Prometheus) gatherURL(url string, acc telegraf.Accumulator) error { req.Header.Set("Authorization", "Bearer "+string(token)) } - resp, err = rt.RoundTrip(req) + resp, err = p.client.Do(req) if err != nil { return fmt.Errorf("error making HTTP request to %s: %s", url, err) }