Skip to content

Add a new benchtool client #164

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 56 commits into from
Apr 12, 2021
Merged

Add a new benchtool client #164

merged 56 commits into from
Apr 12, 2021

Conversation

jtlisi
Copy link
Contributor

@jtlisi jtlisi commented Apr 8, 2021

  • Adds a new benchtool tool that can be used to generate load against Prometheus remote-write and PromQL API backends.
  • Add documentation for the workload configuration file of the benchtool

I have been iterating on this tool for a while now on this branch. However, I feel it is now stable enough to publish in a alpha form.

note: CI is blocked by #165 since I used some functions that are v1.16+

@jtlisi jtlisi requested a review from a team as a code owner April 8, 2021 03:36
@jtlisi jtlisi added command/benchtool enhancement New feature or request labels Apr 8, 2021
Copy link

@56quarters 56quarters left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, few nits


// Do DNS client side load balancing if configured
dnsProvider *dns.Provider
remoteMtx sync.Mutex

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did this mutex used to guard a particular member variable? It's unclear to below when picking a random client what it's guarding? Everything?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A better name would be addressMtx. It guards the array of addresses. There is a background process updating that slice and we want to be sure all access is mutex protected.

for _, queryReq := range q.workload.queries {
// every query has a ticker and a Go loop...
// not sure if this is a good idea but it should be fine
go func(q query) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shadowing the receiver here makes it kinda hard to follow this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I'll change it to req

}
}

fmt.Println("ring check:")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use a logger as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason I printed directly to stdout instead of using logs is because this is the purpose of the ring check module. So we should be able to set the log level to fatal but still get this output.


const maxErrMsgLen = 512

var UserAgent = fmt.Sprintf("Prometheus/%s", version.Version)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we use our own user agent here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can, I'll update this to use benchtool

jtlisi added 25 commits April 9, 2021 13:44
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
… to interval

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
jtlisi added 21 commits April 9, 2021 13:44
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
jtlisi added 2 commits April 9, 2021 15:52
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
@jtlisi jtlisi merged commit 7c8b651 into main Apr 12, 2021
@jtlisi jtlisi deleted the benchtool branch April 12, 2021 16:25
simonswine pushed a commit to grafana/mimir that referenced this pull request Jan 12, 2022
* feat: initial working version of benchtool

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix(benchtool): register batch-size as default

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix(benchtool): ensure write loop actually loops

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* feat(benchtool): add logging and instrumentation

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix(benchtool): handle case where batchsize is bigger than timeseries

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix(benchtool): instantiate client map

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* chore(benchtool): make noisy log line debug level

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* chore(benchtool): remove ioutil

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* chore(benchtool): use Go 1.16

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* feat(benchtool): instrument remote-write client

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix(benchtool): fix how metrics are instrumented

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* feat(benchtool): use resp.StatusCode in prom label

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* feat(benchtool): ensure labelset is used correctly

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* feat(benchtool): add logging config options

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* add series type map to workload

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* add ring-checking module

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix issue with null workload

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* remove early check

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* actual unique metric names

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* start ring

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* actual unique metric names

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* single worker at a time for remote write requests

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* reduce the number of concurrent writers and set default timeout equal to interval

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* increase the number of workers

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* remove work pool and use errgroup

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* use a closure

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* readd a worker channel

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* refactor bench runner into separate files

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* rename write_bench.go --> bench.go

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* start queries

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* stop point for query workload

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* add random seed for query workload using adler32 checksum and id

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* improve further

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix no address panic

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix address resolution

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix address resolution

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix address resolution

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* add jitter to queries

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* better buckets

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* increase parallel queries

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* move write configs into workload config file

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* add support for tenant ID

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix query tenant flag

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* use instance-name flag for tenant name

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix duplicate flag registration bug

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* cleanup a bit

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* increase number of write workers

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* docs(benchtool): add documentation explaining the workload configuration

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* remove unused workload config option

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* remove extra docker tag push steps for local development

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* update README

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* remove from make all step to avoid Go 1.16 compat issue

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* fix linting issues

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* vary the number of writer workers by the number of configured replicas

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* add pprof

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>

* refactor per PR comments

Signed-off-by: Jacob Lisi <jacob.t.lisi@gmail.com>
friedrichg pushed a commit to cortexproject/cortex-tools that referenced this pull request Aug 1, 2023
…ex (grafana#164)

* Fix label and annotation overrides for services (thanks @kwangil-ha)

Signed-off-by: ShuzZzle <niclas.schad@gmail.com>

* Removed dnssrvnoa resolution from block memcached (probably oversight) and moved back to simple dns resolution

Signed-off-by: ShuzZzle <niclas.schad@gmail.com>

* add pr number to changelog

Signed-off-by: ShuzZzle <niclas.schad@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
command/benchtool enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants