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 }