Skip to content

Commit cd544fd

Browse files
authored
feat: allow for loadgen to disable/enable queries/writes (#95)
* feat: allow for loadgen to disable/enable queries and writes if no url is set Signed-off-by: Jacob Lisi <[email protected]> * add handling if the urls have not been set Signed-off-by: Jacob Lisi <[email protected]> * update changelog Signed-off-by: Jacob Lisi <[email protected]>
1 parent cc79b2a commit cd544fd

File tree

2 files changed

+47
-29
lines changed

2 files changed

+47
-29
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## unreleased / master
44

5+
* [ENHANCEMENT] Loadgen: Allow users to selectively disable query or write loadgen by leaving their respective URL configs empty. #95
6+
57
## v0.3.2
68

79
* [BUGFIX] Supports `rules lint` with LogQL: [#92](https://github.com/grafana/cortex-tools/pull/92).

pkg/commands/loadgen.go

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/gogo/protobuf/proto"
1414
"github.com/golang/snappy"
15+
"github.com/pkg/errors"
1516
"github.com/prometheus/client_golang/api"
1617
v1 "github.com/prometheus/client_golang/api/prometheus/v1"
1718
"github.com/prometheus/client_golang/prometheus"
@@ -61,7 +62,7 @@ func (c *LoadgenCommand) Register(app *kingpin.Application) {
6162
loadgenCommand := &LoadgenCommand{}
6263
cmd := app.Command("loadgen", "Simple load generator for Cortex.").Action(loadgenCommand.run)
6364
cmd.Flag("write-url", "").
64-
Required().StringVar(&loadgenCommand.writeURL)
65+
Default("").StringVar(&loadgenCommand.writeURL)
6566
cmd.Flag("active-series", "number of active series to send").
6667
Default("1000").IntVar(&loadgenCommand.activeSeries)
6768
cmd.Flag("scrape-interval", "period to send metrics").
@@ -74,7 +75,7 @@ func (c *LoadgenCommand) Register(app *kingpin.Application) {
7475
Default("500ms").DurationVar(&loadgenCommand.writeTimeout)
7576

7677
cmd.Flag("query-url", "").
77-
Required().StringVar(&loadgenCommand.queryURL)
78+
Default("").StringVar(&loadgenCommand.queryURL)
7879
cmd.Flag("query", "query to run").
7980
Default("sum(node_cpu_seconds_total)").StringVar(&loadgenCommand.query)
8081
cmd.Flag("query-parallelism", "number of queries to run in parallel").
@@ -89,27 +90,9 @@ func (c *LoadgenCommand) Register(app *kingpin.Application) {
8990
}
9091

9192
func (c *LoadgenCommand) run(k *kingpin.ParseContext) error {
92-
writeURL, err := url.Parse(c.writeURL)
93-
if err != nil {
94-
return err
95-
}
96-
97-
writeClient, err := remote.NewWriteClient("loadgen", &remote.ClientConfig{
98-
URL: &config.URL{URL: writeURL},
99-
Timeout: model.Duration(c.writeTimeout),
100-
})
101-
if err != nil {
102-
return err
93+
if c.writeURL == "" && c.queryURL == "" {
94+
return errors.New("either a -write-url or -query-url flag must be provided to run the loadgen command")
10395
}
104-
c.writeClient = writeClient
105-
106-
queryClient, err := api.NewClient(api.Config{
107-
Address: c.queryURL,
108-
})
109-
if err != nil {
110-
return err
111-
}
112-
c.queryClient = v1.NewAPI(queryClient)
11396

11497
http.Handle("/metrics", promhttp.Handler())
11598
go func() {
@@ -119,16 +102,49 @@ func (c *LoadgenCommand) run(k *kingpin.ParseContext) error {
119102
}
120103
}()
121104

122-
c.wg.Add(c.parallelism)
123-
c.wg.Add(c.queryParallelism)
105+
if c.writeURL != "" {
106+
log.Printf("setting up write load gen:\n url=%s\n parallelism: %v\n active_series: %d\n interval: %v\n", c.writeURL, c.parallelism, c.activeSeries, c.scrapeInterval)
107+
writeURL, err := url.Parse(c.writeURL)
108+
if err != nil {
109+
return err
110+
}
111+
112+
writeClient, err := remote.NewWriteClient("loadgen", &remote.ClientConfig{
113+
URL: &config.URL{URL: writeURL},
114+
Timeout: model.Duration(c.writeTimeout),
115+
})
116+
if err != nil {
117+
return err
118+
}
119+
c.writeClient = writeClient
120+
121+
c.wg.Add(c.parallelism)
124122

125-
metricsPerShard := c.activeSeries / c.parallelism
126-
for i := 0; i < c.activeSeries; i += metricsPerShard {
127-
go c.runWriteShard(i, i+metricsPerShard)
123+
metricsPerShard := c.activeSeries / c.parallelism
124+
for i := 0; i < c.activeSeries; i += metricsPerShard {
125+
go c.runWriteShard(i, i+metricsPerShard)
126+
}
127+
} else {
128+
log.Println("write load generation is disabled, -write-url flag has not been set")
128129
}
129130

130-
for i := 0; i < c.queryParallelism; i++ {
131-
go c.runQueryShard()
131+
if c.queryURL != "" {
132+
log.Printf("setting up query load gen:\n url=%s\n parallelism: %v\n query: %s", c.queryURL, c.queryParallelism, c.query)
133+
queryClient, err := api.NewClient(api.Config{
134+
Address: c.queryURL,
135+
})
136+
if err != nil {
137+
return err
138+
}
139+
c.queryClient = v1.NewAPI(queryClient)
140+
141+
c.wg.Add(c.queryParallelism)
142+
143+
for i := 0; i < c.queryParallelism; i++ {
144+
go c.runQueryShard()
145+
}
146+
} else {
147+
log.Println("query load generation is disabled, -query-url flag has not been set")
132148
}
133149

134150
c.wg.Wait()

0 commit comments

Comments
 (0)