@@ -27,12 +27,10 @@ import (
2727 "github.com/prometheus/client_golang/prometheus/promauto"
2828 "github.com/prometheus/common/model"
2929 "github.com/prometheus/prometheus/model/labels"
30- "github.com/prometheus/prometheus/model/relabel"
3130 "github.com/prometheus/prometheus/tsdb"
3231 "github.com/prometheus/prometheus/tsdb/wlog"
3332 "github.com/thanos-io/thanos/pkg/store/storepb"
3433 "google.golang.org/grpc"
35- "gopkg.in/yaml.v2"
3634
3735 "github.com/thanos-io/objstore"
3836 "github.com/thanos-io/objstore/client"
@@ -231,14 +229,11 @@ func runReceive(
231229 return errors .Wrapf (err , "migrate legacy storage in %v to default tenant %v" , conf .dataDir , conf .defaultTenantID )
232230 }
233231
234- relabelContentYaml , err := conf .relabelConfigPath .Content ()
232+ relabeller , err := receive .NewRelabeller (conf .relabelConfigPath , reg , logger , conf .relabelConfigReloadTimer )
233+
235234 if err != nil {
236235 return errors .Wrap (err , "get content of relabel configuration" )
237236 }
238- var relabelConfig []* relabel.Config
239- if err := yaml .Unmarshal (relabelContentYaml , & relabelConfig ); err != nil {
240- return errors .Wrap (err , "parse relabel configuration" )
241- }
242237
243238 dbs := receive .NewMultiTSDB (
244239 conf .dataDir ,
@@ -286,30 +281,47 @@ func runReceive(
286281 }
287282
288283 webHandler := receive .NewHandler (log .With (logger , "component" , "receive-handler" ), & receive.Options {
289- Writer : writer ,
290- ListenAddress : conf .rwAddress ,
291- Registry : reg ,
292- Endpoint : conf .endpoint ,
293- TenantHeader : conf .tenantHeader ,
294- TenantField : conf .tenantField ,
295- DefaultTenantID : conf .defaultTenantID ,
296- ReplicaHeader : conf .replicaHeader ,
297- ReplicationFactor : conf .replicationFactor ,
298- RelabelConfigs : relabelConfig ,
299- ReceiverMode : receiveMode ,
300- Tracer : tracer ,
301- TLSConfig : rwTLSConfig ,
302- SplitTenantLabelName : conf .splitTenantLabelName ,
303- DialOpts : dialOpts ,
304- ForwardTimeout : time .Duration (* conf .forwardTimeout ),
305- MaxBackoff : time .Duration (* conf .maxBackoff ),
306- TSDBStats : dbs ,
307- Limiter : limiter ,
308-
284+ Writer : writer ,
285+ ListenAddress : conf .rwAddress ,
286+ Registry : reg ,
287+ Endpoint : conf .endpoint ,
288+ TenantHeader : conf .tenantHeader ,
289+ TenantField : conf .tenantField ,
290+ DefaultTenantID : conf .defaultTenantID ,
291+ ReplicaHeader : conf .replicaHeader ,
292+ ReplicationFactor : conf .replicationFactor ,
293+ Relabeller : relabeller ,
294+ ReceiverMode : receiveMode ,
295+ Tracer : tracer ,
296+ TLSConfig : rwTLSConfig ,
297+ SplitTenantLabelName : conf .splitTenantLabelName ,
298+ DialOpts : dialOpts ,
299+ ForwardTimeout : time .Duration (* conf .forwardTimeout ),
300+ MaxBackoff : time .Duration (* conf .maxBackoff ),
301+ TSDBStats : dbs ,
302+ Limiter : limiter ,
309303 AsyncForwardWorkerCount : conf .asyncForwardWorkerCount ,
310304 ReplicationProtocol : receive .ReplicationProtocol (conf .replicationProtocol ),
311305 })
312306
307+ {
308+ if relabeller .CanReload () {
309+ ctx , cancel := context .WithCancel (context .Background ())
310+ g .Add (func () error {
311+ level .Debug (logger ).Log ("msg" , "relabel config initialized with file watcher." )
312+ if err := relabeller .StartConfigReloader (ctx ); err != nil {
313+ level .Error (logger ).Log ("msg" , "initializing relabel config reloading." , "err" , err )
314+ return err
315+ }
316+ level .Info (logger ).Log ("msg" , "relabel config reloading initialized." )
317+ <- ctx .Done ()
318+ return nil
319+ }, func (error ) {
320+ cancel ()
321+ })
322+ }
323+ }
324+
313325 grpcProbe := prober .NewGRPC ()
314326 httpProbe := prober .NewHTTP ()
315327 statusProber := prober .Combine (
@@ -974,8 +986,9 @@ type receiveConfig struct {
974986 ignoreBlockSize bool
975987 allowOutOfOrderUpload bool
976988
977- reqLogConfig * extflag.PathOrContent
978- relabelConfigPath * extflag.PathOrContent
989+ reqLogConfig * extflag.PathOrContent
990+ relabelConfigPath * extflag.PathOrContent
991+ relabelConfigReloadTimer time.Duration
979992
980993 writeLimitsConfig * extflag.PathOrContent
981994 storeRateLimits store.SeriesSelectLimits
@@ -1073,6 +1086,8 @@ func (rc *receiveConfig) registerFlag(cmd extkingpin.FlagClause) {
10731086 rc .maxBackoff = extkingpin .ModelDuration (cmd .Flag ("receive-forward-max-backoff" , "Maximum backoff for each forward fan-out request" ).Default ("5s" ).Hidden ())
10741087
10751088 rc .relabelConfigPath = extflag .RegisterPathOrContent (cmd , "receive.relabel-config" , "YAML file that contains relabeling configuration." , extflag .WithEnvSubstitution ())
1089+ cmd .Flag ("receive.relabel-config-reload-timer" , "Minimum amount of time to pass for the relabel configuration to be reloaded. Helps to avoid excessive reloads." ).
1090+ Default ("0s" ).Hidden ().DurationVar (& rc .relabelConfigReloadTimer )
10761091
10771092 rc .tsdbMinBlockDuration = extkingpin .ModelDuration (cmd .Flag ("tsdb.min-block-duration" , "Min duration for local TSDB blocks" ).Default ("2h" ).Hidden ())
10781093
0 commit comments