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  }