diff --git a/plugins/common/proxy/proxy.go b/plugins/common/proxy/proxy.go new file mode 100644 index 000000000..4ef97f1eb --- /dev/null +++ b/plugins/common/proxy/proxy.go @@ -0,0 +1,24 @@ +package proxy + +import ( + "fmt" + "net/http" + "net/url" +) + +type HTTPProxy struct { + HTTPProxyURL string `toml:"http_proxy_url"` +} + +type proxyFunc func(req *http.Request) (*url.URL, error) + +func (p *HTTPProxy) Proxy() (proxyFunc, error) { + if len(p.HTTPProxyURL) > 0 { + url, err := url.Parse(p.HTTPProxyURL) + if err != nil { + return nil, fmt.Errorf("error parsing proxy url %q: %w", p.HTTPProxyURL, err) + } + return http.ProxyURL(url), nil + } + return http.ProxyFromEnvironment, nil +} diff --git a/plugins/inputs/http/README.md b/plugins/inputs/http/README.md index 59abd8256..a9c554cad 100644 --- a/plugins/inputs/http/README.md +++ b/plugins/inputs/http/README.md @@ -34,6 +34,9 @@ The HTTP input plugin collects metrics from one or more HTTP(S) endpoints. The # username = "username" # password = "pa$$word" + ## HTTP Proxy support + # http_proxy_url = "" + ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" diff --git a/plugins/inputs/http/http.go b/plugins/inputs/http/http.go index c247d4007..58a5bd510 100644 --- a/plugins/inputs/http/http.go +++ b/plugins/inputs/http/http.go @@ -11,6 +11,7 @@ import ( "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/internal" + "github.com/influxdata/telegraf/plugins/common/proxy" "github.com/influxdata/telegraf/plugins/common/tls" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/parsers" @@ -29,6 +30,8 @@ type HTTP struct { Password string `toml:"password"` tls.ClientConfig + proxy.HTTPProxy + // Absolute path to file with Bearer token BearerToken string `toml:"bearer_token"` @@ -70,6 +73,9 @@ var sampleConfig = ` ## compress body or "identity" to apply no encoding. # content_encoding = "identity" + ## HTTP Proxy support + # http_proxy_url = "" + ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" @@ -106,12 +112,19 @@ func (h *HTTP) Init() error { return err } + proxy, err := h.HTTPProxy.Proxy() + if err != nil { + return err + } + + transport := &http.Transport{ + TLSClientConfig: tlsCfg, + Proxy: proxy, + } + h.client = &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: tlsCfg, - Proxy: http.ProxyFromEnvironment, - }, - Timeout: h.Timeout.Duration, + Transport: transport, + Timeout: h.Timeout.Duration, } // Set default as [200]