github.com/grafana/pyroscope@v1.18.0/pkg/objstore/client/factory.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/thanos-io/objstore"
     7  	objtracing "github.com/thanos-io/objstore/tracing/opentracing"
     8  
     9  	phlareobj "github.com/grafana/pyroscope/pkg/objstore"
    10  	"github.com/grafana/pyroscope/pkg/objstore/providers/azure"
    11  	"github.com/grafana/pyroscope/pkg/objstore/providers/cos"
    12  	"github.com/grafana/pyroscope/pkg/objstore/providers/filesystem"
    13  	"github.com/grafana/pyroscope/pkg/objstore/providers/gcs"
    14  	"github.com/grafana/pyroscope/pkg/objstore/providers/s3"
    15  	"github.com/grafana/pyroscope/pkg/objstore/providers/swift"
    16  	phlarecontext "github.com/grafana/pyroscope/pkg/pyroscope/context"
    17  )
    18  
    19  // NewBucket creates a new bucket client based on the configured backend
    20  func NewBucket(ctx context.Context, cfg Config, name string) (phlareobj.Bucket, error) {
    21  	var (
    22  		backendClient objstore.Bucket
    23  		err           error
    24  	)
    25  	logger := phlarecontext.Logger(ctx)
    26  	reg := phlarecontext.Registry(ctx)
    27  	prefixPath := cfg.getPrefix()
    28  
    29  	switch cfg.Backend {
    30  	case S3:
    31  		backendClient, err = s3.NewBucketClient(cfg.S3, name, logger)
    32  	case GCS:
    33  		backendClient, err = gcs.NewBucketClient(ctx, cfg.GCS, name, logger)
    34  	case Azure:
    35  		backendClient, err = azure.NewBucketClient(cfg.Azure, name, logger)
    36  	case Swift:
    37  		backendClient, err = swift.NewBucketClient(cfg.Swift, name, logger)
    38  	case COS:
    39  		backendClient, err = cos.NewBucketClient(cfg.COS, name, logger)
    40  	case Filesystem:
    41  		// Filesystem is a special case, as it is not a remote storage backend
    42  		// We want to use a fileReaderAt to read and seek from the filesystem
    43  		// This means middlewares and instrumentation is not triggered for `ReaderAt` function
    44  		middlewares := []func(objstore.Bucket) (objstore.Bucket, error){
    45  			func(b objstore.Bucket) (objstore.Bucket, error) {
    46  				return objstore.WrapWithMetrics(b, reg, name), nil
    47  			},
    48  			func(b objstore.Bucket) (objstore.Bucket, error) {
    49  				return objtracing.WrapWithTraces(b), nil
    50  			},
    51  		}
    52  		fs, err := filesystem.NewBucket(cfg.Filesystem.Directory, append(middlewares, cfg.Middlewares...)...)
    53  		if err != nil {
    54  			return nil, err
    55  		}
    56  		if prefixPath == "" {
    57  			return fs, nil
    58  		}
    59  		return phlareobj.NewPrefixedBucket(fs, prefixPath), nil
    60  	default:
    61  		return nil, ErrUnsupportedStorageBackend
    62  	}
    63  
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  
    68  	// Wrap the client with any provided middleware
    69  	for _, wrap := range cfg.Middlewares {
    70  		backendClient, err = wrap(backendClient)
    71  		if err != nil {
    72  			return nil, err
    73  		}
    74  	}
    75  	bkt := phlareobj.NewBucket(objtracing.WrapWithTraces(objstore.WrapWithMetrics(backendClient, reg, name)))
    76  
    77  	if prefixPath != "" {
    78  		bkt = phlareobj.NewPrefixedBucket(bkt, prefixPath)
    79  	}
    80  	return bkt, nil
    81  }