mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Prometheus: Fix issue where TCP connections not being reused when querying from Grafana alerting (#40349)
Fixes #40366 Co-authored-by: Dave Henderson <dave.henderson@grafana.com> Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
This commit is contained in:
parent
d62ca1283c
commit
23bee50474
@ -36,17 +36,15 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
@ -62,7 +60,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{}{}
|
||||||
@ -99,13 +97,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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,10 +124,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{},
|
||||||
@ -190,24 +192,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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,15 +3,16 @@ package prometheus
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
apiv1 "github.com/prometheus/client_golang/api/prometheus/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
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 PrometheusQuery struct {
|
type PrometheusQuery struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user