Prometheus: Fix issue where TCP connections not being reused when querying from Grafana alerting (#40349) (#40368)

Fixes #40366

Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
(cherry picked from commit 23bee50474)

Co-authored-by: Kevin Minehart <kmineh0151@gmail.com>
This commit is contained in:
Marcus Efraimsson
2021-10-13 11:19:04 +02:00
committed by GitHub
co-authored by Kevin Minehart
parent c57041f13b
commit 92d768fe66
+26 -30
View File
@@ -35,11 +35,12 @@ var (
) )
type DatasourceInfo struct { type DatasourceInfo struct {
ID int64 ID int64
HTTPClientOpts sdkhttpclient.Options URL string
URL string HTTPMethod string
HTTPMethod string TimeInterval string
TimeInterval string
promClient apiv1.API
} }
type QueryModel struct { type QueryModel struct {
@@ -54,17 +55,15 @@ type QueryModel struct {
} }
type Service struct { type Service struct {
httpClientProvider httpclient.Provider
intervalCalculator intervalv2.Calculator intervalCalculator intervalv2.Calculator
im instancemgmt.InstanceManager im instancemgmt.InstanceManager
} }
func ProvideService(httpClientProvider httpclient.Provider, backendPluginManager backendplugin.Manager) (*Service, error) { func ProvideService(httpClientProvider httpclient.Provider, backendPluginManager backendplugin.Manager) (*Service, error) {
plog.Debug("initializing") plog.Debug("initializing")
im := datasource.NewInstanceManager(newInstanceSettings()) im := datasource.NewInstanceManager(newInstanceSettings(httpClientProvider))
s := &Service{ s := &Service{
httpClientProvider: httpClientProvider,
intervalCalculator: intervalv2.NewCalculator(), intervalCalculator: intervalv2.NewCalculator(),
im: im, im: im,
} }
@@ -80,7 +79,7 @@ func ProvideService(httpClientProvider httpclient.Provider, backendPluginManager
return s, nil return s, nil
} }
func newInstanceSettings() datasource.InstanceFactoryFunc { func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc {
return func(settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { return func(settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) {
defaultHttpMethod := http.MethodPost defaultHttpMethod := http.MethodPost
jsonData := map[string]interface{}{} jsonData := map[string]interface{}{}
@@ -117,13 +116,19 @@ func newInstanceSettings() datasource.InstanceFactoryFunc {
} }
} }
mdl := DatasourceInfo{ client, err := createClient(settings.URL, httpCliOpts, httpClientProvider)
ID: settings.ID, if err != nil {
URL: settings.URL, return nil, err
HTTPClientOpts: httpCliOpts,
HTTPMethod: httpMethod,
TimeInterval: timeInterval,
} }
mdl := DatasourceInfo{
ID: settings.ID,
URL: settings.URL,
HTTPMethod: httpMethod,
TimeInterval: timeInterval,
promClient: client,
}
return mdl, nil return mdl, nil
} }
} }
@@ -138,10 +143,8 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
if err != nil { if err != nil {
return nil, err return nil, err
} }
client, err := getClient(dsInfo, s)
if err != nil { client := dsInfo.promClient
return nil, err
}
result := backend.QueryDataResponse{ result := backend.QueryDataResponse{
Responses: backend.Responses{}, Responses: backend.Responses{},
@@ -185,24 +188,17 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
return &result, nil return &result, nil
} }
func getClient(dsInfo *DatasourceInfo, s *Service) (apiv1.API, error) { func createClient(url string, httpOpts sdkhttpclient.Options, clientProvider httpclient.Provider) (apiv1.API, error) {
opts := &sdkhttpclient.Options{
Timeouts: dsInfo.HTTPClientOpts.Timeouts,
TLS: dsInfo.HTTPClientOpts.TLS,
BasicAuth: dsInfo.HTTPClientOpts.BasicAuth,
Headers: dsInfo.HTTPClientOpts.Headers,
}
customMiddlewares := customQueryParametersMiddleware(plog) customMiddlewares := customQueryParametersMiddleware(plog)
opts.Middlewares = []sdkhttpclient.Middleware{customMiddlewares} httpOpts.Middlewares = []sdkhttpclient.Middleware{customMiddlewares}
roundTripper, err := s.httpClientProvider.GetTransport(*opts) roundTripper, err := clientProvider.GetTransport(httpOpts)
if err != nil { if err != nil {
return nil, err return nil, err
} }
cfg := api.Config{ cfg := api.Config{
Address: dsInfo.URL, Address: url,
RoundTripper: roundTripper, RoundTripper: roundTripper,
} }