Files
grafana/pkg/infra/httpclient/httpclientprovider/http_client_provider.go
T
Grot (@grafanabot) 1bdd2c54d9 HTTP Client: Introduce go-conntrack into http client provider (#35314) (#35477)
* Introduce go-conntrack into http client provider

* Fixes according to reviewer's comments

* Fixes according to reviewer's comments

(cherry picked from commit 7cdf8b3705)

Co-authored-by: Dimitris Sotirakis <dimitrios.sotirakis@grafana.com>
2021-06-10 10:21:30 +02:00

59 lines
1.7 KiB
Go

package httpclientprovider
import (
"fmt"
"net/http"
sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
"github.com/grafana/grafana/pkg/infra/httpclient"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/metrics/metricutil"
"github.com/grafana/grafana/pkg/setting"
"github.com/mwitkow/go-conntrack"
)
var newProviderFunc = sdkhttpclient.NewProvider
// New creates a new HTTP client provider with pre-configured middlewares.
func New(cfg *setting.Cfg) httpclient.Provider {
logger := log.New("httpclient")
userAgent := fmt.Sprintf("Grafana/%s", cfg.BuildVersion)
middlewares := []sdkhttpclient.Middleware{
TracingMiddleware(logger),
DataSourceMetricsMiddleware(),
SetUserAgentMiddleware(userAgent),
sdkhttpclient.BasicAuthenticationMiddleware(),
sdkhttpclient.CustomHeadersMiddleware(),
}
if cfg.SigV4AuthEnabled {
middlewares = append(middlewares, SigV4Middleware())
}
return newProviderFunc(sdkhttpclient.ProviderOptions{
Middlewares: middlewares,
ConfigureTransport: func(opts sdkhttpclient.Options, transport *http.Transport) {
datasourceName, exists := opts.Labels["datasource_name"]
if !exists {
return
}
datasourceLabelName, err := metricutil.SanitizeLabelName(datasourceName)
if err != nil {
return
}
newConntrackRoundTripper(datasourceLabelName, transport)
},
})
}
// newConntrackRoundTripper takes a http.DefaultTransport and adds the Conntrack Dialer
// so we can instrument outbound connections
func newConntrackRoundTripper(name string, transport *http.Transport) *http.Transport {
transport.DialContext = conntrack.NewDialContextFunc(
conntrack.DialWithName(name),
conntrack.DialWithDialContextFunc(transport.DialContext),
)
return transport
}