1bdd2c54d9
* 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>
59 lines
1.7 KiB
Go
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
|
|
}
|