2022-11-03 21:44:37 +03:00
|
|
|
package client
|
2022-06-23 14:48:16 +02:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
|
|
|
sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
2023-01-30 09:38:51 +01:00
|
|
|
|
2022-06-23 14:48:16 +02:00
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
2022-08-11 16:12:57 +02:00
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
2022-11-03 21:44:37 +03:00
|
|
|
"github.com/grafana/grafana/pkg/tsdb/prometheus/azureauth"
|
2022-06-23 14:48:16 +02:00
|
|
|
"github.com/grafana/grafana/pkg/tsdb/prometheus/middleware"
|
|
|
|
|
"github.com/grafana/grafana/pkg/tsdb/prometheus/utils"
|
|
|
|
|
"github.com/grafana/grafana/pkg/util/maputil"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// CreateTransportOptions creates options for the http client. Probably should be shared and should not live in the
|
|
|
|
|
// buffered package.
|
2022-08-11 16:12:57 +02:00
|
|
|
func CreateTransportOptions(settings backend.DataSourceInstanceSettings, cfg *setting.Cfg, logger log.Logger) (*sdkhttpclient.Options, error) {
|
2022-06-23 14:48:16 +02:00
|
|
|
opts, err := settings.HTTPClientOptions()
|
|
|
|
|
if err != nil {
|
2023-02-02 08:58:10 -08:00
|
|
|
return nil, fmt.Errorf("error getting HTTP options: %w", err)
|
2022-06-23 14:48:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jsonData, err := utils.GetJsonData(settings)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error reading settings: %w", err)
|
|
|
|
|
}
|
|
|
|
|
httpMethod, _ := maputil.GetStringOptional(jsonData, "httpMethod")
|
|
|
|
|
|
|
|
|
|
opts.Middlewares = middlewares(logger, httpMethod)
|
|
|
|
|
|
|
|
|
|
// Set SigV4 service namespace
|
|
|
|
|
if opts.SigV4 != nil {
|
|
|
|
|
opts.SigV4.Service = "aps"
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-11 16:12:57 +02:00
|
|
|
// Set Azure authentication
|
|
|
|
|
if cfg.AzureAuthEnabled {
|
|
|
|
|
err = azureauth.ConfigureAzureAuthentication(settings, cfg.Azure, &opts)
|
2022-06-23 14:48:16 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error configuring Azure auth: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &opts, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func middlewares(logger log.Logger, httpMethod string) []sdkhttpclient.Middleware {
|
|
|
|
|
middlewares := []sdkhttpclient.Middleware{
|
|
|
|
|
// TODO: probably isn't needed anymore and should by done by http infra code
|
|
|
|
|
middleware.CustomQueryParameters(logger),
|
|
|
|
|
sdkhttpclient.CustomHeadersMiddleware(),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Needed to control GET vs POST method of the requests
|
|
|
|
|
if strings.ToLower(httpMethod) == "get" {
|
|
|
|
|
middlewares = append(middlewares, middleware.ForceHttpGet(logger))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return middlewares
|
|
|
|
|
}
|