From f09c08d1f3805270a4a22d7f9c9c96ea3caf6f90 Mon Sep 17 00:00:00 2001
From: Pierre Tessier <puckpuck.com@gmail.com>
Date: Mon, 7 Nov 2016 11:34:02 -0500
Subject: [PATCH] Added response_timeout property

closes #2006
---
 CHANGELOG.md                            |  1 +
 plugins/inputs/prometheus/README.md     | 11 +++++++++++
 plugins/inputs/prometheus/prometheus.go |  9 +++++++--
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6bd0ee0e..d53e4609 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,6 +28,7 @@ in their config file.
 - [#2001](https://github.com/influxdata/telegraf/pull/2001): MongoDB input plugin: Improve state data.
 - [#2078](https://github.com/influxdata/telegraf/pull/2078): Ping input: add standard deviation field.
 - [#2121](https://github.com/influxdata/telegraf/pull/2121): Add GC pause metric to InfluxDB input plugin.
+- [#2006](https://github.com/influxdata/telegraf/pull/2006): Added response_timeout property to prometheus input plugin.
 
 ### Bugfixes
 
diff --git a/plugins/inputs/prometheus/README.md b/plugins/inputs/prometheus/README.md
index 8298b9d2..e2b1b45a 100644
--- a/plugins/inputs/prometheus/README.md
+++ b/plugins/inputs/prometheus/README.md
@@ -13,6 +13,17 @@ Example for Kubernetes apiserver
   urls = ["http://my-kube-apiserver:8080/metrics"]
 ```
 
+Specify a 10 second timeout for slower/over-loaded clients
+```toml
+# Get all metrics from Kube-apiserver
+[[inputs.prometheus]]
+  # An array of urls to scrape metrics from.
+  urls = ["http://my-kube-apiserver:8080/metrics"]
+
+  # Specify timeout duration for slower prometheus clients (default is 3s)
+  response_timeout = "10s"
+```
+
 You can use more complex configuration
 to filter and some tags
 
diff --git a/plugins/inputs/prometheus/prometheus.go b/plugins/inputs/prometheus/prometheus.go
index 12f7fd38..821f71f2 100644
--- a/plugins/inputs/prometheus/prometheus.go
+++ b/plugins/inputs/prometheus/prometheus.go
@@ -21,6 +21,8 @@ type Prometheus struct {
 	// Bearer Token authorization file path
 	BearerToken string `toml:"bearer_token"`
 
+	ResponseTimeout internal.Duration `toml:"response_timeout"`
+
 	// Path to CA file
 	SSLCA string `toml:"ssl_ca"`
 	// Path to host cert file
@@ -38,6 +40,9 @@ var sampleConfig = `
   ## Use bearer token for authorization
   # bearer_token = /path/to/bearer/token
 
+  ## Specify timeout duration for slower prometheus clients (default is 3s)
+  # response_timeout = "3s"
+
   ## Optional SSL Config
   # ssl_ca = /path/to/cafile
   # ssl_cert = /path/to/certfile
@@ -105,7 +110,7 @@ func (p *Prometheus) gatherURL(url string, acc telegraf.Accumulator) error {
 		}).Dial,
 		TLSHandshakeTimeout:   5 * time.Second,
 		TLSClientConfig:       tlsCfg,
-		ResponseHeaderTimeout: time.Duration(3 * time.Second),
+		ResponseHeaderTimeout: p.ResponseTimeout.Duration,
 		DisableKeepAlives:     true,
 	}
 
@@ -148,6 +153,6 @@ func (p *Prometheus) gatherURL(url string, acc telegraf.Accumulator) error {
 
 func init() {
 	inputs.Add("prometheus", func() telegraf.Input {
-		return &Prometheus{}
+		return &Prometheus{ResponseTimeout: "3s"}
 	})
 }
-- 
GitLab