Skip to content

Commit b759bbc

Browse files
chaudumgrafana-delivery-bot[bot]
authored andcommitted
fix(blooms): Initialize bloom gateway client only once (#15994)
The bloom gateway client is used both in the bloom builder and in the index gateways. When running Loki in SSD mode, both services are part of the backend target, and therefore the client is initialised twice, leading to duplicate metrics registration and a subsequent panic. This commit extracts the initialisation of the bloom gateway client into a separate service that is started once and becomes a dependency of both bloom builder and index gateway. Signed-off-by: Christian Haudum <christian.haudum@gmail.com> (cherry picked from commit e271e22)
1 parent fb4ea87 commit b759bbc

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

‎pkg/loki/loki.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ type Loki struct {
370370
ingesterQuerier *querier.IngesterQuerier
371371
Store storage.Store
372372
BloomStore bloomshipper.Store
373+
bloomGatewayClient bloomgateway.Client
373374
tableManager *index.TableManager
374375
frontend Frontend
375376
ruler *base_ruler.Ruler
@@ -694,6 +695,7 @@ func (t *Loki) setupModuleManager() error {
694695
mm.RegisterModule(IndexGatewayRing, t.initIndexGatewayRing, modules.UserInvisibleModule)
695696
mm.RegisterModule(IndexGatewayInterceptors, t.initIndexGatewayInterceptors, modules.UserInvisibleModule)
696697
mm.RegisterModule(BloomGateway, t.initBloomGateway)
698+
mm.RegisterModule(BloomGatewayClient, t.initBloomGatewayClient)
697699
mm.RegisterModule(QueryScheduler, t.initQueryScheduler)
698700
mm.RegisterModule(QuerySchedulerRing, t.initQuerySchedulerRing, modules.UserInvisibleModule)
699701
mm.RegisterModule(Analytics, t.initAnalytics, modules.UserInvisibleModule)
@@ -732,7 +734,7 @@ func (t *Loki) setupModuleManager() error {
732734
BloomGateway: {Server, BloomStore, Analytics},
733735
BloomPlanner: {Server, BloomStore, Analytics, Store},
734736
BloomBuilder: {Server, BloomStore, Analytics, Store},
735-
BloomStore: {IndexGatewayRing},
737+
BloomStore: {IndexGatewayRing, BloomGatewayClient},
736738
PatternRingClient: {Server, MemberlistKV, Analytics},
737739
PatternIngesterTee: {Server, MemberlistKV, Analytics, PatternRingClient},
738740
PatternIngester: {Server, MemberlistKV, Analytics, PatternRingClient, PatternIngesterTee, Overrides},

‎pkg/loki/modules.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ const (
128128
IndexGatewayInterceptors = "index-gateway-interceptors"
129129
BloomStore = "bloom-store"
130130
BloomGateway = "bloom-gateway"
131+
BloomGatewayClient = "bloom-gateway-client"
131132
BloomPlanner = "bloom-planner"
132133
BloomBuilder = "bloom-builder"
133134
QueryScheduler = "query-scheduler"
@@ -1549,16 +1550,12 @@ func (t *Loki) initIndexGateway() (services.Service, error) {
15491550

15501551
var bloomQuerier indexgateway.BloomQuerier
15511552
if t.Cfg.BloomGateway.Enabled {
1552-
bloomGatewayClient, err := bloomgateway.NewClient(t.Cfg.BloomGateway.Client, prometheus.DefaultRegisterer, logger)
1553-
if err != nil {
1554-
return nil, err
1555-
}
15561553
resolver := bloomgateway.NewBlockResolver(t.BloomStore, logger)
15571554
querierCfg := bloomgateway.QuerierConfig{
15581555
BuildTableOffset: t.Cfg.BloomBuild.Planner.MinTableOffset,
15591556
BuildInterval: t.Cfg.BloomBuild.Planner.PlanningInterval,
15601557
}
1561-
bloomQuerier = bloomgateway.NewQuerier(bloomGatewayClient, querierCfg, t.Overrides, resolver, prometheus.DefaultRegisterer, logger)
1558+
bloomQuerier = bloomgateway.NewQuerier(t.bloomGatewayClient, querierCfg, t.Overrides, resolver, prometheus.DefaultRegisterer, logger)
15621559
}
15631560

15641561
gateway, err := indexgateway.NewIndexGateway(t.Cfg.IndexGateway, t.Overrides, logger, prometheus.DefaultRegisterer, t.Store, indexClients, bloomQuerier)
@@ -1653,6 +1650,18 @@ func (t *Loki) initBloomPlanner() (services.Service, error) {
16531650
return p, nil
16541651
}
16551652

1653+
func (t *Loki) initBloomGatewayClient() (services.Service, error) {
1654+
var err error
1655+
if t.Cfg.BloomGateway.Enabled {
1656+
logger := log.With(util_log.Logger, "component", "bloom-gateway-client")
1657+
t.bloomGatewayClient, err = bloomgateway.NewClient(t.Cfg.BloomGateway.Client, prometheus.DefaultRegisterer, logger)
1658+
if err != nil {
1659+
return nil, err
1660+
}
1661+
}
1662+
return nil, nil
1663+
}
1664+
16561665
func (t *Loki) initBloomBuilder() (services.Service, error) {
16571666
if !t.Cfg.BloomBuild.Enabled {
16581667
return nil, nil
@@ -1670,15 +1679,6 @@ func (t *Loki) initBloomBuilder() (services.Service, error) {
16701679
ringManager = t.indexGatewayRingManager
16711680
}
16721681

1673-
var bloomGatewayClient bloomgateway.Client
1674-
if t.Cfg.BloomGateway.Enabled {
1675-
var err error
1676-
bloomGatewayClient, err = bloomgateway.NewClient(t.Cfg.BloomGateway.Client, prometheus.DefaultRegisterer, logger)
1677-
if err != nil {
1678-
return nil, err
1679-
}
1680-
}
1681-
16821682
return builder.New(
16831683
t.Cfg.BloomBuild.Builder,
16841684
t.Overrides,
@@ -1687,7 +1687,7 @@ func (t *Loki) initBloomBuilder() (services.Service, error) {
16871687
t.ClientMetrics,
16881688
t.Store,
16891689
t.BloomStore,
1690-
bloomGatewayClient,
1690+
t.bloomGatewayClient,
16911691
logger,
16921692
prometheus.DefaultRegisterer,
16931693
ringManager,

0 commit comments

Comments
 (0)