diff --git a/go.mod b/go.mod index ecea43452ab..369412c81e9 100644 --- a/go.mod +++ b/go.mod @@ -70,6 +70,7 @@ require ( github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-sqlite3 v1.14.7 github.com/matttproud/golang_protobuf_extensions v1.0.1 + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f github.com/opentracing/opentracing-go v1.2.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect diff --git a/go.sum b/go.sum index 169db3dde77..8ddeb4b37e0 100644 --- a/go.sum +++ b/go.sum @@ -920,8 +920,6 @@ github.com/grafana/grafana-live-sdk v0.0.6 h1:P1QFn0ZradOJp3zVpfG0STZMP+pgZrW0e0 github.com/grafana/grafana-live-sdk v0.0.6/go.mod h1:f15hHmWyLdFjmuWLsjeKeZnq/HnNQ3QkoPcaEww45AY= github.com/grafana/grafana-plugin-sdk-go v0.79.0/go.mod h1:NvxLzGkVhnoBKwzkst6CFfpMFKwAdIUZ1q8ssuLeF60= github.com/grafana/grafana-plugin-sdk-go v0.91.0/go.mod h1:Ot3k7nY7P6DXmUsDgKvNB7oG1v7PRyTdmnYVoS554bU= -github.com/grafana/grafana-plugin-sdk-go v0.102.0 h1:Pknh7mlOaJvdhPgKHxcimDOSd9h29eSpA34W0/sOF6c= -github.com/grafana/grafana-plugin-sdk-go v0.102.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= github.com/grafana/grafana-plugin-sdk-go v0.104.0 h1:Ij2tPdEasSjCb2MxHaaiylyW4RLVZYyWpApzN/mlTxo= github.com/grafana/grafana-plugin-sdk-go v0.104.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= github.com/grafana/loki v1.6.2-0.20210520072447-15d417efe103 h1:qCmofFVwQR9QnsinstVqI1NPLMVl33jNCnOCXEAVn6E= diff --git a/pkg/infra/httpclient/httpclientprovider/http_client_provider.go b/pkg/infra/httpclient/httpclientprovider/http_client_provider.go index 3f349cee60c..46d9f7e585a 100644 --- a/pkg/infra/httpclient/httpclientprovider/http_client_provider.go +++ b/pkg/infra/httpclient/httpclientprovider/http_client_provider.go @@ -2,11 +2,14 @@ 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 @@ -29,5 +32,27 @@ func New(cfg *setting.Cfg) httpclient.Provider { 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 +}