@@ -3,21 +3,23 @@ package bucketclient
33import (
44 "bytes"
55 "context"
6+ "fmt"
67 "io"
78 "strings"
89 "sync"
910
1011 "github.com/go-kit/log"
1112 "github.com/gogo/protobuf/proto"
1213 "github.com/pkg/errors"
14+ "github.com/prometheus/client_golang/prometheus"
1315 "github.com/thanos-io/objstore"
14-
15- "github.com/cortexproject/cortex/pkg/storage/tsdb"
16+ "github.com/thanos-io/thanos/pkg/extprom"
1617
1718 "github.com/cortexproject/cortex/pkg/alertmanager/alertspb"
1819 "github.com/cortexproject/cortex/pkg/storage/bucket"
1920 "github.com/cortexproject/cortex/pkg/util/concurrency"
2021 "github.com/cortexproject/cortex/pkg/util/runutil"
22+ "github.com/cortexproject/cortex/pkg/util/users"
2123)
2224
2325const (
@@ -45,27 +47,54 @@ type BucketAlertStore struct {
4547 amBucket objstore.Bucket
4648 cfgProvider bucket.TenantConfigProvider
4749 logger log.Logger
50+
51+ usersScanner users.Scanner
52+ userIndexUpdater * users.UserIndexUpdater
4853}
4954
50- func NewBucketAlertStore (bkt objstore.Bucket , cfgProvider bucket.TenantConfigProvider , logger log.Logger ) * BucketAlertStore {
51- return & BucketAlertStore {
52- alertsBucket : bucket .NewPrefixedBucketClient (bkt , alertsPrefix ),
53- amBucket : bucket .NewPrefixedBucketClient (bkt , alertmanagerPrefix ),
54- cfgProvider : cfgProvider ,
55- logger : logger ,
55+ func NewBucketAlertStore (bkt objstore.InstrumentedBucket , userScannerCfg users.UsersScannerConfig , cfgProvider bucket.TenantConfigProvider , logger log.Logger , reg prometheus.Registerer ) (* BucketAlertStore , error ) {
56+ alertBucket := bucket .NewPrefixedBucketClient (bkt , alertsPrefix )
57+
58+ regWithComponent := extprom .WrapRegistererWith (prometheus.Labels {"component" : "alertmanager" }, reg )
59+ usersScanner , err := users .NewScanner (userScannerCfg , alertBucket , logger , regWithComponent )
60+ if err != nil {
61+ return nil , errors .Wrap (err , "unable to initialize alertmanager users scanner" )
5662 }
63+
64+ var userIndexUpdater * users.UserIndexUpdater
65+ if userScannerCfg .Strategy == users .UserScanStrategyUserIndex {
66+ // We hardcode strategy to be list so can ignore error.
67+ baseScanner , _ := users .NewScanner (users.UsersScannerConfig {
68+ Strategy : users .UserScanStrategyList ,
69+ }, alertBucket , logger , regWithComponent )
70+ userIndexUpdater = users .NewUserIndexUpdater (alertBucket , userScannerCfg .CleanUpInterval , baseScanner , regWithComponent )
71+ }
72+
73+ return & BucketAlertStore {
74+ alertsBucket : alertBucket ,
75+ amBucket : bucket .NewPrefixedBucketClient (bkt , alertmanagerPrefix ),
76+ cfgProvider : cfgProvider ,
77+ logger : logger ,
78+ usersScanner : usersScanner ,
79+ userIndexUpdater : userIndexUpdater ,
80+ }, nil
81+ }
82+
83+ // GetUserIndexUpdater implements alertstore.AlertStore.
84+ func (s * BucketAlertStore ) GetUserIndexUpdater () * users.UserIndexUpdater {
85+ return s .userIndexUpdater
5786}
5887
5988// ListAllUsers implements alertstore.AlertStore.
6089func (s * BucketAlertStore ) ListAllUsers (ctx context.Context ) ([]string , error ) {
61- var userIDs [] string
62-
63- err := s . alertsBucket . Iter ( ctx , "" , func ( key string ) error {
64- userIDs = append ( userIDs , key )
65- return nil
66- } )
67-
68- return userIDs , err
90+ active , deleting , _ , err := s . usersScanner . ScanUsers ( ctx )
91+ if err != nil {
92+ return nil , fmt . Errorf ( "unable to list users in alertmanager store bucket: %w" , err )
93+ }
94+ userIDs := make ([] string , 0 , len ( active ) + len ( deleting ))
95+ userIDs = append ( userIDs , active ... )
96+ userIDs = append ( userIDs , deleting ... )
97+ return userIDs , nil
6998}
7099
71100// GetAlertConfigs implements alertstore.AlertStore.
@@ -217,5 +246,5 @@ func (s *BucketAlertStore) getUserBucket(userID string) objstore.Bucket {
217246
218247func (s * BucketAlertStore ) getAlertmanagerUserBucket (userID string ) objstore.Bucket {
219248 uBucket := bucket .NewUserBucketClient (userID , s .amBucket , s .cfgProvider )
220- return uBucket .WithExpectedErrs (tsdb .IsOneOfTheExpectedErrors (uBucket .IsAccessDeniedErr , uBucket .IsObjNotFoundErr ))
249+ return uBucket .WithExpectedErrs (bucket .IsOneOfTheExpectedErrors (uBucket .IsAccessDeniedErr , uBucket .IsObjNotFoundErr ))
221250}
0 commit comments