diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c00b66ea5217..e1b194645d691 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - [#1335](https://github.com/influxdata/telegraf/issues/1335): Fix overall ping timeout to be calculated based on per-ping timeout. - [#1374](https://github.com/influxdata/telegraf/pull/1374): Change "default" retention policy to "". - [#1377](https://github.com/influxdata/telegraf/issues/1377): Graphite output mangling '%' character. +- [#1396](https://github.com/influxdata/telegraf/pull/1396): Prometheus input plugin now supports x509 certs authentication ## v1.0 beta 1 [2016-06-07] diff --git a/plugins/inputs/prometheus/README.md b/plugins/inputs/prometheus/README.md index 3aa8c8afdc8ab..8298b9d2738b3 100644 --- a/plugins/inputs/prometheus/README.md +++ b/plugins/inputs/prometheus/README.md @@ -30,6 +30,26 @@ to filter and some tags kubeservice = "kube-apiserver" ``` +```toml +# Authorize with a bearer token skipping cert verification +[[inputs.prometheus]] + # An array of urls to scrape metrics from. + urls = ["http://my-kube-apiserver:8080/metrics"] + bearer_token = '/path/to/bearer/token' + insecure_skip_verify = true +``` + +```toml +# Authorize using x509 certs +[[inputs.prometheus]] + # An array of urls to scrape metrics from. + urls = ["https://my-kube-apiserver:8080/metrics"] + + ssl_ca = '/path/to/cafile' + ssl_cert = '/path/to/certfile' + ssl_key = '/path/to/keyfile' +``` + ### Measurements & Fields & Tags: Measurements and fields could be any thing. diff --git a/plugins/inputs/prometheus/prometheus.go b/plugins/inputs/prometheus/prometheus.go index 1c60a363e3f3d..121ea0daf35aa 100644 --- a/plugins/inputs/prometheus/prometheus.go +++ b/plugins/inputs/prometheus/prometheus.go @@ -1,10 +1,10 @@ package prometheus import ( - "crypto/tls" "errors" "fmt" "github.com/influxdata/telegraf" + "github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/plugins/inputs" "io/ioutil" "net" @@ -16,20 +16,32 @@ import ( type Prometheus struct { Urls []string - // Use SSL but skip chain & host verification - InsecureSkipVerify bool // Bearer Token authorization file path BearerToken string `toml:"bearer_token"` + + // Path to CA file + SSLCA string `toml:"ssl_ca"` + // Path to host cert file + SSLCert string `toml:"ssl_cert"` + // Path to cert key file + SSLKey string `toml:"ssl_key"` + // Use SSL but skip chain & host verification + InsecureSkipVerify bool } var sampleConfig = ` ## An array of urls to scrape metrics from. urls = ["http://localhost:9100/metrics"] - ## Use SSL but skip chain & host verification - # insecure_skip_verify = false ## Use bearer token for authorization # bearer_token = /path/to/bearer/token + + ## Optional SSL Config + # ssl_ca = /path/to/cafile + # ssl_cert = /path/to/certfile + # ssl_key = /path/to/keyfile + ## Use SSL but skip chain & host verification + # insecure_skip_verify = false ` func (p *Prometheus) SampleConfig() string { @@ -78,15 +90,19 @@ func (p *Prometheus) gatherURL(url string, acc telegraf.Accumulator) error { 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: &tls.Config{ - InsecureSkipVerify: p.InsecureSkipVerify, - }, + TLSHandshakeTimeout: 5 * time.Second, + TLSClientConfig: tlsCfg, ResponseHeaderTimeout: time.Duration(3 * time.Second), }