Skip to content

Commit 8acfd37

Browse files
committed
add details in help
∙ fix InvalidSeriesCount logic, add test
1 parent cc3c990 commit 8acfd37

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

cmd/avalanche.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ var (
3636
seriesCount = kingpin.Flag("series-count", "Number of series per-metric.").Default("10").Int()
3737
seriesChangeRate = kingpin.Flag("series-change-rate", "The rate at which the number of active series changes over time. Applies to 'gradual-change' modes.").Default("10").Int()
3838
maxSeriesCount = kingpin.Flag("max-series-count", "Maximum number of series to serve. Applies to 'gradual-change' modes.").Default("10000").Int()
39-
minSeriesCount = kingpin.Flag("min-series-count", "Minimum number of series to serve. Applies to 'gradual-change' modes.").Default("").Int()
39+
minSeriesCount = kingpin.Flag("min-series-count", "Minimum number of series to serve. Applies to 'gradual-change' modes.").Default("0").Int()
4040
metricLength = kingpin.Flag("metricname-length", "Modify length of metric names.").Default("5").Int()
4141
labelLength = kingpin.Flag("labelname-length", "Modify length of label names.").Default("5").Int()
4242
constLabels = kingpin.Flag("const-label", "Constant label to add to every metric. Format is labelName=labelValue. Flag can be specified multiple times.").Strings()
4343
valueInterval = kingpin.Flag("value-interval", "Change series values every {interval} seconds.").Default("30").Int()
4444
labelInterval = kingpin.Flag("series-interval", "Change series_id label values every {interval} seconds.").Default("60").Int()
4545
metricInterval = kingpin.Flag("metric-interval", "Change __name__ label values every {interval} seconds.").Default("120").Int()
4646
seriesChangeInterval = kingpin.Flag("series-change-interval", "Change the number of series every {interval} seconds.").Default("10").Int()
47-
seriesOperationMode = kingpin.Flag("series-operation-mode", "Mode of operation: 'gradual-change', 'spike', 'double-halve'").Default("default").String()
47+
seriesOperationMode = kingpin.Flag("series-operation-mode", "Mode of operation: 'gradual-change', 'double-halve'").Default("default").String()
4848
port = kingpin.Flag("port", "Port to serve at").Default("9001").Int()
4949
remoteURL = kingpin.Flag("remote-url", "URL to send samples via remote_write API.").URL()
5050
remotePprofURLs = kingpin.Flag("remote-pprof-urls", "a list of urls to download pprofs during the remote write: --remote-pprof-urls=http://127.0.0.1:10902/debug/pprof/heap --remote-pprof-urls=http://127.0.0.1:10902/debug/pprof/profile").URLList()
@@ -61,6 +61,21 @@ func main() {
6161
kingpin.Version(version.Print("avalanche"))
6262
log.SetFlags(log.Ltime | log.Lshortfile) // Show file name and line in logs.
6363
kingpin.CommandLine.Help = "avalanche - metrics test server"
64+
kingpin.CommandLine.Help = "avalanche - metrics test server\n" +
65+
"\nSeries Operation Modes:\n" +
66+
" double-halve:\n" +
67+
" Alternately doubles and halves the series count at regular intervals.\n" +
68+
" Usage: ./avalanche --operation-mode=double-halve --series-change-interval=30 --series-count=20\n" +
69+
" Description: This mode alternately doubles and halves the series count at regular intervals.\n" +
70+
" The series count is doubled on one tick and halved on the next, ensuring it never drops below 1.\n" +
71+
"\n" +
72+
" gradual-change:\n" +
73+
" Gradually changes the series count by a fixed rate at regular intervals.\n" +
74+
" Usage: ./avalanche --operation-mode=gradual-change --series-change-interval=30 --series-change-rate=10 --series-count=20\n" +
75+
" Description: This mode gradually increases the series count by seriesChangeRate on each tick up to maxSeriesCount,\n" +
76+
" then decreases it back to the starting value, and repeats this cycle indefinitely.\n" +
77+
" The series count is incremented by seriesChangeRate on each tick, ensuring it never drops below 1."
78+
6479
kingpin.Parse()
6580
if *maxSeriesCount <= *minSeriesCount {
6681
fmt.Fprintf(os.Stderr, "Error: --max-series-count (%d) must be greater than --min-series-count (%d)\n", *maxSeriesCount, *minSeriesCount)

metrics/serve.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ func RunMetrics(metricCount, labelCount, seriesCount, seriesChangeRate, maxSerie
146146

147147
case "gradual-change":
148148
if minSeriesCount >= maxSeriesCount {
149-
fmt.Printf("Error: minSeriesCount must be less than maxSeriesCount, got %d and %d\n", minSeriesCount, maxSeriesCount)
150-
close(stop)
149+
return nil, fmt.Errorf("error: minSeriesCount must be less than maxSeriesCount, got %d and %d", minSeriesCount, maxSeriesCount)
151150
}
152151
seriesIncrease := true
153152
currentSeriesCount = minSeriesCount
@@ -183,6 +182,8 @@ func RunMetrics(metricCount, labelCount, seriesCount, seriesChangeRate, maxSerie
183182
}()
184183
default:
185184
currentSeriesCount = seriesCount
185+
registerMetrics(metricCount, metricLength, metricCycle, labelKeys)
186+
cycleValues(labelKeys, labelValues, seriesCount, seriesCycle)
186187
go func() {
187188
for tick := range metricTick.C {
188189
metricsMux.Lock()

metrics/serve_test.go

+36-3
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,21 @@ func TestRunMetricsGradualChange(t *testing.T) {
9090
assert.NoError(t, err)
9191

9292
time.Sleep(2 * time.Second)
93-
initialCount := countSeries(t, promRegistry)
94-
expectedInitialCount := minSeriesCount
95-
assert.Equal(t, expectedInitialCount, initialCount, "Initial series count should be minSeriesCount %d but got %d", expectedInitialCount, initialCount)
93+
currentCount := countSeries(t, promRegistry)
94+
expectedInitialCount := currentCount
95+
assert.Equal(t, expectedInitialCount, currentCount, "Initial series count should be minSeriesCount %d but got %d", expectedInitialCount, currentCount)
9696

9797
assert.Eventually(t, func() bool {
9898
graduallyIncreasedCount := countSeries(t, promRegistry)
9999
fmt.Println("seriesCount: ", graduallyIncreasedCount)
100100
if graduallyIncreasedCount > maxSeriesCount {
101101
t.Fatalf("Gradually increased series count should be less than maxSeriesCount %d but got %d", maxSeriesCount, graduallyIncreasedCount)
102102
}
103+
if currentCount > graduallyIncreasedCount {
104+
t.Fatalf("Gradually increased series count should be greater than initial series count %d but got %d", currentCount, graduallyIncreasedCount)
105+
} else {
106+
currentCount = graduallyIncreasedCount
107+
}
103108

104109
return graduallyIncreasedCount == maxSeriesCount
105110
}, 15*time.Second, seriesChangeInterval*time.Second, "Did not receive update notification for series count gradual increase in time")
@@ -114,3 +119,31 @@ func TestRunMetricsGradualChange(t *testing.T) {
114119
return graduallyIncreasedCount == minSeriesCount
115120
}, 15*time.Second, seriesChangeInterval*time.Second, "Did not receive update notification for series count gradual increase in time")
116121
}
122+
123+
// if min is bigger than maxSeriesCount, fail in GradualChange
124+
func TestRunMetricsWithInvalidSeriesCounts(t *testing.T) {
125+
const (
126+
metricCount = 1
127+
labelCount = 1
128+
seriesCount = 100
129+
maxSeriesCount = 10
130+
minSeriesCount = 100
131+
seriesChangeRate = 10
132+
metricLength = 1
133+
labelLength = 1
134+
valueInterval = 100
135+
seriesInterval = 100
136+
metricInterval = 100
137+
seriesChangeInterval = 3
138+
operationMode = "gradual-change"
139+
constLabel = "constLabel=test"
140+
)
141+
142+
stop := make(chan struct{})
143+
defer close(stop)
144+
145+
promRegistry = prometheus.NewRegistry()
146+
147+
_, err := RunMetrics(metricCount, labelCount, seriesCount, seriesChangeRate, maxSeriesCount, minSeriesCount, metricLength, labelLength, valueInterval, seriesInterval, metricInterval, seriesChangeInterval, operationMode, []string{constLabel}, stop)
148+
assert.Error(t, err)
149+
}

0 commit comments

Comments
 (0)