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 }