github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/ruler/storage.go (about)

     1  package ruler
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  
     8  	"github.com/go-kit/log"
     9  	"github.com/pkg/errors"
    10  	"github.com/prometheus/client_golang/prometheus"
    11  	promRules "github.com/prometheus/prometheus/rules"
    12  
    13  	"github.com/cortexproject/cortex/pkg/chunk"
    14  	"github.com/cortexproject/cortex/pkg/chunk/aws"
    15  	"github.com/cortexproject/cortex/pkg/chunk/azure"
    16  	"github.com/cortexproject/cortex/pkg/chunk/gcp"
    17  	"github.com/cortexproject/cortex/pkg/chunk/openstack"
    18  	"github.com/cortexproject/cortex/pkg/configs/client"
    19  	configClient "github.com/cortexproject/cortex/pkg/configs/client"
    20  	"github.com/cortexproject/cortex/pkg/ruler/rulestore"
    21  	"github.com/cortexproject/cortex/pkg/ruler/rulestore/bucketclient"
    22  	"github.com/cortexproject/cortex/pkg/ruler/rulestore/configdb"
    23  	"github.com/cortexproject/cortex/pkg/ruler/rulestore/local"
    24  	"github.com/cortexproject/cortex/pkg/ruler/rulestore/objectclient"
    25  	"github.com/cortexproject/cortex/pkg/storage/bucket"
    26  )
    27  
    28  // RuleStoreConfig configures a rule store.
    29  // TODO remove this legacy config in Cortex 1.11.
    30  type RuleStoreConfig struct {
    31  	Type     string        `yaml:"type"`
    32  	ConfigDB client.Config `yaml:"configdb"`
    33  
    34  	// Object Storage Configs
    35  	Azure azure.BlobStorageConfig `yaml:"azure"`
    36  	GCS   gcp.GCSConfig           `yaml:"gcs"`
    37  	S3    aws.S3Config            `yaml:"s3"`
    38  	Swift openstack.SwiftConfig   `yaml:"swift"`
    39  	Local local.Config            `yaml:"local"`
    40  
    41  	mock rulestore.RuleStore `yaml:"-"`
    42  }
    43  
    44  // RegisterFlags registers flags.
    45  func (cfg *RuleStoreConfig) RegisterFlags(f *flag.FlagSet) {
    46  	cfg.ConfigDB.RegisterFlagsWithPrefix("ruler.", f)
    47  	cfg.Azure.RegisterFlagsWithPrefix("ruler.storage.", f)
    48  	cfg.GCS.RegisterFlagsWithPrefix("ruler.storage.", f)
    49  	cfg.S3.RegisterFlagsWithPrefix("ruler.storage.", f)
    50  	cfg.Swift.RegisterFlagsWithPrefix("ruler.storage.", f)
    51  	cfg.Local.RegisterFlagsWithPrefix("ruler.storage.", f)
    52  
    53  	f.StringVar(&cfg.Type, "ruler.storage.type", "configdb", "Method to use for backend rule storage (configdb, azure, gcs, s3, swift, local)")
    54  }
    55  
    56  // Validate config and returns error on failure
    57  func (cfg *RuleStoreConfig) Validate() error {
    58  	if err := cfg.Swift.Validate(); err != nil {
    59  		return errors.Wrap(err, "invalid Swift Storage config")
    60  	}
    61  	if err := cfg.Azure.Validate(); err != nil {
    62  		return errors.Wrap(err, "invalid Azure Storage config")
    63  	}
    64  	if err := cfg.S3.Validate(); err != nil {
    65  		return errors.Wrap(err, "invalid S3 Storage config")
    66  	}
    67  	return nil
    68  }
    69  
    70  // IsDefaults returns true if the storage options have not been set
    71  func (cfg *RuleStoreConfig) IsDefaults() bool {
    72  	return cfg.Type == "configdb" && cfg.ConfigDB.ConfigsAPIURL.URL == nil
    73  }
    74  
    75  // NewLegacyRuleStore returns a rule store backend client based on the provided cfg.
    76  // The client used by the function is based a legacy object store clients that shouldn't
    77  // be used anymore.
    78  func NewLegacyRuleStore(cfg RuleStoreConfig, loader promRules.GroupLoader, logger log.Logger) (rulestore.RuleStore, error) {
    79  	if cfg.mock != nil {
    80  		return cfg.mock, nil
    81  	}
    82  
    83  	if loader == nil {
    84  		loader = promRules.FileLoader{}
    85  	}
    86  
    87  	var err error
    88  	var client chunk.ObjectClient
    89  
    90  	switch cfg.Type {
    91  	case "configdb":
    92  		c, err := configClient.New(cfg.ConfigDB)
    93  		if err != nil {
    94  			return nil, err
    95  		}
    96  		return configdb.NewConfigRuleStore(c), nil
    97  	case "azure":
    98  		client, err = azure.NewBlobStorage(&cfg.Azure)
    99  	case "gcs":
   100  		client, err = gcp.NewGCSObjectClient(context.Background(), cfg.GCS)
   101  	case "s3":
   102  		client, err = aws.NewS3ObjectClient(cfg.S3)
   103  	case "swift":
   104  		client, err = openstack.NewSwiftObjectClient(cfg.Swift)
   105  	case "local":
   106  		return local.NewLocalRulesClient(cfg.Local, loader)
   107  	default:
   108  		return nil, fmt.Errorf("unrecognized rule storage mode %v, choose one of: configdb, gcs, s3, swift, azure, local", cfg.Type)
   109  	}
   110  
   111  	if err != nil {
   112  		return nil, err
   113  	}
   114  
   115  	return objectclient.NewRuleStore(client, loadRulesConcurrency, logger), nil
   116  }
   117  
   118  // NewRuleStore returns a rule store backend client based on the provided cfg.
   119  func NewRuleStore(ctx context.Context, cfg rulestore.Config, cfgProvider bucket.TenantConfigProvider, loader promRules.GroupLoader, logger log.Logger, reg prometheus.Registerer) (rulestore.RuleStore, error) {
   120  	if cfg.Backend == configdb.Name {
   121  		c, err := client.New(cfg.ConfigDB)
   122  
   123  		if err != nil {
   124  			return nil, err
   125  		}
   126  
   127  		return configdb.NewConfigRuleStore(c), nil
   128  	}
   129  
   130  	if cfg.Backend == local.Name {
   131  		return local.NewLocalRulesClient(cfg.Local, loader)
   132  	}
   133  
   134  	bucketClient, err := bucket.NewClient(ctx, cfg.Config, "ruler-storage", logger, reg)
   135  	if err != nil {
   136  		return nil, err
   137  	}
   138  
   139  	store := bucketclient.NewBucketRuleStore(bucketClient, cfgProvider, logger)
   140  	if err != nil {
   141  		return nil, err
   142  	}
   143  
   144  	return store, nil
   145  }