Skip to content

Commit

Permalink
http custom transport parameter
Browse files Browse the repository at this point in the history
Signed-off-by: Vanshikav123 <vanshikav928@gmail.com>
  • Loading branch information
Vanshikav123 committed May 20, 2024
1 parent 3ca3d25 commit e606f9d
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 49 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ Generally, you have two ways of using `objstore` module:
First is to import the provider you want e.g. [`github.com/thanos-io/objstore/providers/s3`](providers/s3) and instantiate it with available constructor (e.g. `NewBucket`).
The second option is to use the factory `NewBucket(logger log.Logger, confContentYaml []byte, reg prometheus.Registerer, component string)` that will instantiate the object storage client based on YAML file provided. The YAML file has generally the format like this:
The second option is to use the factory `NewBucket(logger log.Logger, confContentYaml []byte, reg prometheus.Registerer, component string,rt http.RoundTripper)` that will instantiate the object storage client based on YAML file provided. The YAML file has generally the format like this:
```yaml
type: <PROVIDER_TYPE>
Expand All @@ -114,6 +114,8 @@ config:
The exact option depends on provider and are in sections below.
`NewBucket` function now accepts an `http.RoundTripper` parameter allows clients to provide a custom transport for HTTP requests, making the function more flexible , this change facilitates the use of various HTTP client configurations, including hedged HTTP transports.
> NOTE: All code snippets are auto-generated from code and up-to-date.
Check out the [Thanos documentation](https://thanos.io/tip/thanos/storage.md/) to see how Thanos uses this module.
Expand Down
36 changes: 9 additions & 27 deletions client/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ import (
"fmt"
"net/http"
"strings"
"time"

"github.com/cristalhq/hedgedhttp"
"github.com/thanos-io/objstore"
"github.com/thanos-io/objstore/providers/azure"
"github.com/thanos-io/objstore/providers/bos"
Expand Down Expand Up @@ -45,15 +43,14 @@ const (
)

type BucketConfig struct {
Type ObjProvider `yaml:"type"`
Config interface{} `yaml:"config"`
Prefix string `yaml:"prefix" default:""`
UseHedgedHTTP bool `yaml:"use_hedged_http" default:"false"`
Type ObjProvider `yaml:"type"`
Config interface{} `yaml:"config"`
Prefix string `yaml:"prefix" default:""`
}

// NewBucket initializes and returns new object storage clients.
// NOTE: confContentYaml can contain secrets.
func NewBucket(logger log.Logger, confContentYaml []byte, component string) (objstore.Bucket, error) {
func NewBucket(logger log.Logger, confContentYaml []byte, component string, rt http.RoundTripper) (objstore.Bucket, error) {
level.Info(logger).Log("msg", "loading bucket configuration")
bucketConf := &BucketConfig{}
if err := yaml.UnmarshalStrict(confContentYaml, bucketConf); err != nil {
Expand All @@ -64,42 +61,27 @@ func NewBucket(logger log.Logger, confContentYaml []byte, component string) (obj
if err != nil {
return nil, errors.Wrap(err, "marshal content of bucket configuration")
}
var httpClient *http.Client = http.DefaultClient

// If UseHedgedHTTP is true, create a hedged HTTP client
if bucketConf.UseHedgedHTTP {
hedgedClient, err := hedgedhttp.New(hedgedhttp.Config{
Transport: http.DefaultTransport,
Upto: 3,
Delay: 100 * time.Millisecond,
})
if err != nil {
return nil, errors.Wrap(err, "creating hedged HTTP client")
}
httpClient = &http.Client{
Transport: hedgedClient,
}
}
var bucket objstore.Bucket
switch strings.ToUpper(string(bucketConf.Type)) {
case string(GCS):
bucket, err = gcs.NewBucket(context.Background(), logger, config, component, httpClient)
bucket, err = gcs.NewBucket(context.Background(), logger, config, component)
case string(S3):
bucket, err = s3.NewBucket(logger, config, component, httpClient)
bucket, err = s3.NewBucket(logger, config, component)
case string(AZURE):
bucket, err = azure.NewBucket(logger, config, component, httpClient)
bucket, err = azure.NewBucket(logger, config, component)
case string(SWIFT):
bucket, err = swift.NewContainer(logger, config)
case string(COS):
bucket, err = cos.NewBucket(logger, config, component, httpClient)
bucket, err = cos.NewBucket(logger, config, component)
case string(ALIYUNOSS):
bucket, err = oss.NewBucket(logger, config, component)
case string(FILESYSTEM):
bucket, err = filesystem.NewBucketFromConfig(config)
case string(BOS):
bucket, err = bos.NewBucket(logger, config, component)
case string(OCI):
bucket, err = oci.NewBucket(logger, config, httpClient)
bucket, err = oci.NewBucket(logger, config)
case string(OBS):
bucket, err = obs.NewBucket(logger, config)
default:
Expand Down
7 changes: 4 additions & 3 deletions client/factory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package client
import (
"context"
"fmt"
"net/http"
"os"

"github.com/go-kit/log"
Expand All @@ -23,7 +24,7 @@ func ExampleBucket() {
}

// Create a new bucket.
bucket, err := NewBucket(log.NewNopLogger(), confContentYaml, "example")
bucket, err := NewBucket(log.NewNopLogger(), confContentYaml, "example", http.DefaultTransport)
if err != nil {
panic(err)
}
Expand All @@ -46,7 +47,7 @@ func ExampleTracingBucketUsingOpenTracing() { //nolint:govet
}

// Create a new bucket.
bucket, err := NewBucket(log.NewNopLogger(), confContentYaml, "example")
bucket, err := NewBucket(log.NewNopLogger(), confContentYaml, "example", http.DefaultTransport)
if err != nil {
panic(err)
}
Expand All @@ -72,7 +73,7 @@ func ExampleTracingBucketUsingOpenTelemetry() { //nolint:govet
}

// Create a new bucket.
bucket, err := NewBucket(log.NewNopLogger(), confContentYaml, "example")
bucket, err := NewBucket(log.NewNopLogger(), confContentYaml, "example", http.DefaultTransport)
if err != nil {
panic(err)
}
Expand Down
5 changes: 2 additions & 3 deletions providers/azure/azure.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package azure
import (
"context"
"io"
"net/http"
"os"
"strings"
"testing"
Expand Down Expand Up @@ -144,7 +143,7 @@ type Bucket struct {
}

// NewBucket returns a new Bucket using the provided Azure config.
func NewBucket(logger log.Logger, azureConfig []byte, component string, httpClient *http.Client) (*Bucket, error) {
func NewBucket(logger log.Logger, azureConfig []byte, component string) (*Bucket, error) {
level.Debug(logger).Log("msg", "creating new Azure bucket connection", "component", component)
conf, err := parseConfig(azureConfig)
if err != nil {
Expand Down Expand Up @@ -353,7 +352,7 @@ func NewTestBucket(t testing.TB, component string) (objstore.Bucket, func(), err
if err != nil {
return nil, nil, err
}
bkt, err := NewBucket(log.NewNopLogger(), bc, component, http.DefaultClient)
bkt, err := NewBucket(log.NewNopLogger(), bc, component)
if err != nil {
t.Errorf("Cannot create Azure storage container:")
return nil, nil, err
Expand Down
6 changes: 3 additions & 3 deletions providers/cos/cos.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func parseConfig(conf []byte) (Config, error) {
}

// NewBucket returns a new Bucket using the provided cos configuration.
func NewBucket(logger log.Logger, conf []byte, component string, httpClient *http.Client) (*Bucket, error) {
func NewBucket(logger log.Logger, conf []byte, component string) (*Bucket, error) {
if logger == nil {
logger = log.NewNopLogger()
}
Expand Down Expand Up @@ -485,7 +485,7 @@ func NewTestBucket(t testing.TB) (objstore.Bucket, func(), error) {
return nil, nil, err
}

b, err := NewBucket(log.NewNopLogger(), bc, "thanos-e2e-test", http.DefaultClient)
b, err := NewBucket(log.NewNopLogger(), bc, "thanos-e2e-test")
if err != nil {
return nil, nil, err
}
Expand All @@ -506,7 +506,7 @@ func NewTestBucket(t testing.TB) (objstore.Bucket, func(), error) {
return nil, nil, err
}

b, err := NewBucket(log.NewNopLogger(), bc, "thanos-e2e-test", http.DefaultClient)
b, err := NewBucket(log.NewNopLogger(), bc, "thanos-e2e-test")
if err != nil {
return nil, nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions providers/gcs/gcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func parseConfig(conf []byte) (Config, error) {
}

// NewBucket returns a new Bucket against the given bucket handle.
func NewBucket(ctx context.Context, logger log.Logger, conf []byte, component string, httpClient *http.Client) (*Bucket, error) {
func NewBucket(ctx context.Context, logger log.Logger, conf []byte, component string) (*Bucket, error) {
config, err := parseConfig(conf)
if err != nil {
return nil, err
Expand Down Expand Up @@ -302,7 +302,7 @@ func NewTestBucket(t testing.TB, project string) (objstore.Bucket, func(), error
return nil, nil, err
}

b, err := NewBucket(ctx, log.NewNopLogger(), bc, "thanos-e2e-test", http.DefaultClient)
b, err := NewBucket(ctx, log.NewNopLogger(), bc, "thanos-e2e-test")
if err != nil {
return nil, nil, err
}
Expand Down
15 changes: 7 additions & 8 deletions providers/oci/oci.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ func (b *Bucket) deleteBucket(ctx context.Context) (err error) {
}

// NewBucket returns a new Bucket using the provided oci config values.
func NewBucket(logger log.Logger, ociConfig []byte, httpClient *http.Client) (*Bucket, error) {
func NewBucket(logger log.Logger, ociConfig []byte) (*Bucket, error) {
level.Debug(logger).Log("msg", "creating new oci bucket connection")
var config = DefaultConfig
var configurationProvider common.ConfigurationProvider
Expand Down Expand Up @@ -335,13 +335,12 @@ func NewBucket(logger log.Logger, ociConfig []byte, httpClient *http.Client) (*B
return nil, errors.Wrapf(err, "unable to create ObjectStorage client with the given oci configurations")
}

if httpClient == nil {
httpClient = &http.Client{
Transport: CustomTransport(config),
Timeout: config.HTTPConfig.ClientTimeout,
}
httpClient := http.Client{
Transport: CustomTransport(config),
Timeout: config.HTTPConfig.ClientTimeout,
}
client.HTTPClient = httpClient

client.HTTPClient = &httpClient

requestMetadata := getRequestMetadata(config.MaxRequestRetries, config.RequestRetryInterval)

Expand Down Expand Up @@ -377,7 +376,7 @@ func NewTestBucket(t testing.TB) (objstore.Bucket, func(), error) {
return nil, nil, err
}

bkt, err := NewBucket(log.NewNopLogger(), ociConfig, http.DefaultClient)
bkt, err := NewBucket(log.NewNopLogger(), ociConfig)
if err != nil {
return nil, nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions providers/s3/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ func parseConfig(conf []byte) (Config, error) {
}

// NewBucket returns a new Bucket using the provided s3 config values.
func NewBucket(logger log.Logger, conf []byte, component string, httpClient *http.Client) (*Bucket, error) {
func NewBucket(logger log.Logger, conf []byte, component string) (*Bucket, error) {
config, err := parseConfig(conf)
if err != nil {
return nil, err
Expand Down Expand Up @@ -605,7 +605,7 @@ func NewTestBucketFromConfig(t testing.TB, location string, c Config, reuseBucke
if err != nil {
return nil, nil, err
}
b, err := NewBucket(log.NewNopLogger(), bc, "thanos-e2e-test", http.DefaultClient)
b, err := NewBucket(log.NewNopLogger(), bc, "thanos-e2e-test")
if err != nil {
return nil, nil, err
}
Expand Down

0 comments on commit e606f9d

Please sign in to comment.