github.com/grafana/pyroscope@v1.18.0/pkg/compactor/compactor_ring.go (about) 1 // SPDX-License-Identifier: AGPL-3.0-only 2 // Provenance-includes-location: https://github.com/grafana/mimir/blob/main/pkg/compactor/compactor_ring.go 3 // Provenance-includes-license: Apache-2.0 4 // Provenance-includes-copyright: The Cortex Authors. 5 6 package compactor 7 8 import ( 9 "flag" 10 "net" 11 "strconv" 12 "time" 13 14 "github.com/go-kit/log" 15 "github.com/grafana/dskit/ring" 16 17 "github.com/grafana/pyroscope/pkg/util" 18 ) 19 20 const ( 21 // ringNumTokens is how many tokens each compactor should have in the ring. We use a 22 // safe default instead of exposing to config option to the user in order to simplify 23 // the config. 24 ringNumTokens = 512 25 ) 26 27 // RingConfig masks the ring lifecycler config which contains 28 // many options not really required by the compactors ring. This config 29 // is used to strip down the config to the minimum, and avoid confusion 30 // to the user. 31 type RingConfig struct { 32 Common util.CommonRingConfig `yaml:",inline"` 33 34 // Wait ring stability. 35 WaitStabilityMinDuration time.Duration `yaml:"wait_stability_min_duration" category:"advanced"` 36 WaitStabilityMaxDuration time.Duration `yaml:"wait_stability_max_duration" category:"advanced"` 37 38 WaitActiveInstanceTimeout time.Duration `yaml:"wait_active_instance_timeout" category:"advanced"` 39 40 ObservePeriod time.Duration `yaml:"-"` 41 } 42 43 // RegisterFlags adds the flags required to config this to the given FlagSet 44 func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet, logger log.Logger) { 45 const flagNamePrefix = "compactor.ring." 46 const kvStorePrefix = "collectors/" 47 const componentPlural = "compactors" 48 cfg.Common.RegisterFlags(flagNamePrefix, kvStorePrefix, componentPlural, f, logger) 49 50 // Wait stability flags. 51 f.DurationVar(&cfg.WaitStabilityMinDuration, flagNamePrefix+"wait-stability-min-duration", 0, "Minimum time to wait for ring stability at startup. 0 to disable.") 52 f.DurationVar(&cfg.WaitStabilityMaxDuration, flagNamePrefix+"wait-stability-max-duration", 5*time.Minute, "Maximum time to wait for ring stability at startup. If the compactor ring keeps changing after this period of time, the compactor will start anyway.") 53 54 // Timeout durations 55 f.DurationVar(&cfg.WaitActiveInstanceTimeout, flagNamePrefix+"wait-active-instance-timeout", 10*time.Minute, "Timeout for waiting on compactor to become ACTIVE in the ring.") 56 } 57 58 func (cfg *RingConfig) ToBasicLifecyclerConfig(logger log.Logger) (ring.BasicLifecyclerConfig, error) { 59 instanceAddr, err := ring.GetInstanceAddr(cfg.Common.InstanceAddr, cfg.Common.InstanceInterfaceNames, logger, cfg.Common.EnableIPv6) 60 if err != nil { 61 return ring.BasicLifecyclerConfig{}, err 62 } 63 64 instancePort := ring.GetInstancePort(cfg.Common.InstancePort, cfg.Common.ListenPort) 65 66 return ring.BasicLifecyclerConfig{ 67 ID: cfg.Common.InstanceID, 68 Addr: net.JoinHostPort(instanceAddr, strconv.Itoa(instancePort)), 69 HeartbeatPeriod: cfg.Common.HeartbeatPeriod, 70 HeartbeatTimeout: cfg.Common.HeartbeatTimeout, 71 TokensObservePeriod: cfg.ObservePeriod, 72 NumTokens: ringNumTokens, 73 KeepInstanceInTheRingOnShutdown: false, 74 }, nil 75 } 76 77 func (cfg *RingConfig) toRingConfig() ring.Config { 78 rc := cfg.Common.ToRingConfig() 79 rc.ReplicationFactor = 1 80 81 return rc 82 }