github.com/grafana/pyroscope@v1.18.0/pkg/segmentwriter/client/distributor/placement/adaptiveplacement/config.go (about)

     1  package adaptiveplacement
     2  
     3  import (
     4  	"flag"
     5  	"time"
     6  )
     7  
     8  const flagPrefix = "adaptive-placement."
     9  
    10  type Limits interface {
    11  	PlacementLimits(tenant string) PlacementLimits
    12  }
    13  
    14  // PlacementLimits defines the limits for adaptive sharding.
    15  // These parameters are tenant-specific.
    16  type PlacementLimits struct {
    17  	TenantShards         uint64        `yaml:"adaptive_placement_tenant_shards" json:"adaptive_placement_tenant_shards" doc:"hidden"`
    18  	DefaultDatasetShards uint64        `yaml:"adaptive_placement_default_dataset_shards" json:"adaptive_placement_default_dataset_shards" doc:"hidden"`
    19  	LoadBalancing        LoadBalancing `yaml:"adaptive_placement_load_balancing" json:"adaptive_placement_load_balancing" doc:"hidden"`
    20  	MinDatasetShards     uint64        `yaml:"adaptive_placement_min_dataset_shards" json:"adaptive_placement_min_dataset_shards" doc:"hidden"`
    21  	MaxDatasetShards     uint64        `yaml:"adaptive_placement_max_dataset_shards" json:"adaptive_placement_max_dataset_shards" doc:"hidden"`
    22  	UnitSizeBytes        uint64        `yaml:"adaptive_placement_unit_size_bytes" json:"adaptive_placement_unit_size_bytes" doc:"hidden"`
    23  	BurstWindow          time.Duration `yaml:"adaptive_placement_burst_window" json:"adaptive_placement_burst_window" doc:"hidden"`
    24  	DecayWindow          time.Duration `yaml:"adaptive_placement_decay_window" json:"adaptive_placement_decay_window" doc:"hidden"`
    25  }
    26  
    27  func (o *PlacementLimits) RegisterFlags(f *flag.FlagSet) {
    28  	o.RegisterFlagsWithPrefix(flagPrefix, f)
    29  }
    30  
    31  func (o *PlacementLimits) RegisterFlagsWithPrefix(prefix string, f *flag.FlagSet) {
    32  	o.LoadBalancing = DynamicLoadBalancing
    33  	f.Var(&o.LoadBalancing, prefix+"load-balancing", "Load balancing strategy; "+validOptionsString+".")
    34  	f.Uint64Var(&o.TenantShards, prefix+"tenant-shards", 0, "Number of shards per tenant. If 0, the limit is not applied.")
    35  	f.Uint64Var(&o.DefaultDatasetShards, prefix+"default-dataset-shards", 1, "Default number of shards per dataset.")
    36  	f.Uint64Var(&o.MinDatasetShards, prefix+"min-dataset-shards", 1, "Minimum number of shards per dataset.")
    37  	f.Uint64Var(&o.MaxDatasetShards, prefix+"max-dataset-shards", 1<<10, "Maximum number of shards per dataset.")
    38  	f.Uint64Var(&o.UnitSizeBytes, prefix+"unit-size-bytes", 128<<10, "Shards are allocated based on the utilisation of units per second. The option specifies the unit size in bytes.")
    39  	f.DurationVar(&o.BurstWindow, prefix+"burst-window", 17*time.Minute, "Duration of the burst window. During this time, scale-outs are more aggressive.")
    40  	f.DurationVar(&o.DecayWindow, prefix+"decay-window", 19*time.Minute, "Duration of the decay window. During this time, scale-ins are delayed.")
    41  }
    42  
    43  type Config struct {
    44  	PlacementUpdateInterval          time.Duration `yaml:"placement_rules_update_interval" json:"placement_rules_update_interval"`
    45  	PlacementRetentionPeriod         time.Duration `yaml:"placement_rules_retention_period" json:"placement_rules_retention_period"`
    46  	StatsConfidencePeriod            time.Duration `yaml:"stats_confidence_period" json:"stats_confidence_period"`
    47  	StatsAggregationWindow           time.Duration `yaml:"stats_aggregation_window" json:"stats_aggregation_window"`
    48  	StatsRetentionPeriod             time.Duration `yaml:"stats_retention_period" json:"stats_retention_period"`
    49  	ExportShardLimitMetrics          bool          `yaml:"export_shard_limit_metrics" json:"export_shard_limit_metrics"`
    50  	ExportShardUsageMetrics          bool          `yaml:"export_shard_usage_metrics" json:"export_shard_usage_metrics"`
    51  	ExportShardUsageBreakdownMetrics bool          `yaml:"export_shard_usage_breakdown_metrics" json:"export_shard_usage_breakdown_metrics"`
    52  }
    53  
    54  func DefaultConfig() Config {
    55  	var c Config
    56  	var f flag.FlagSet
    57  	c.RegisterFlags(&f)
    58  	return c
    59  }
    60  
    61  func (c *Config) RegisterFlags(f *flag.FlagSet) {
    62  	c.RegisterFlagsWithPrefix(flagPrefix, f)
    63  }
    64  
    65  func (c *Config) RegisterFlagsWithPrefix(prefix string, f *flag.FlagSet) {
    66  	f.DurationVar(&c.PlacementUpdateInterval, prefix+"placement-rules-update-interval", 15*time.Second, "Interval between updates to placement rules.")
    67  	f.DurationVar(&c.PlacementRetentionPeriod, prefix+"placement-rules-retention-period", 15*time.Minute, "Retention period for inactive placement rules.")
    68  	f.DurationVar(&c.StatsConfidencePeriod, prefix+"stats-confidence-period", 0, "Confidence period for stats. During this period, placement rules are not updated. If 0, placement rules may be applied using incomplete stats.")
    69  	f.DurationVar(&c.StatsAggregationWindow, prefix+"stats-aggregation-window", 3*time.Minute, "Time window for aggregating shard stats.")
    70  	f.DurationVar(&c.StatsRetentionPeriod, prefix+"stats-retention-period", 15*time.Minute, "Retention period for stats that are no longer updated.")
    71  	f.BoolVar(&c.ExportShardLimitMetrics, prefix+"export-shard-limit-metrics", true, "If enabled, shard limit metrics are exported as Prometheus metrics.")
    72  	f.BoolVar(&c.ExportShardUsageMetrics, prefix+"export-shard-usage-metrics", false, "If enabled, shard utilization metrics are exported as Prometheus metrics.")
    73  	f.BoolVar(&c.ExportShardUsageBreakdownMetrics, prefix+"export-shard-usage-breakdown-metrics", false, "If enabled, shard utilization breakdown metrics, including shard ownership, are exported as Prometheus metrics.")
    74  }