Skip to content
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

feat: support histograms for command latency statistics #2721

Open
wants to merge 20 commits into
base: unstable
Choose a base branch
from

Conversation

rabunkosar-dd
Copy link

@rabunkosar-dd rabunkosar-dd commented Jan 14, 2025

This PR adds an option to build kvrocks with histogram support to breakdown the command latencies. Current statistics are based on the total latency and the command count, giving averages. For our use case, where tail latencies are very impactful, this was not sufficient to track the general performance of the instances.

It also adds a config parameter to define the bucket boundaries. I will also follow up with a PR to add similar support in kvrocks_exporter (and support additive histograms for prometheus).

The buckets are not additive and there is an implicit bucket that tracks values beyond the defined values (inf bucket).

I added a build paramater (ENABLE_HISTOGRAMS), when set to ON will compile the support into the binary.
The feature is enabled if the config parameter defines a non-empty list of buckets that are coma separated

@rabunkosar-dd rabunkosar-dd changed the title (feat) support histograms for command latency statistics feat (stats) support histograms for command latency statistics Jan 14, 2025
@rabunkosar-dd rabunkosar-dd changed the title feat (stats) support histograms for command latency statistics feat(stats) support histograms for command latency statistics Jan 14, 2025
@rabunkosar-dd rabunkosar-dd changed the title feat(stats) support histograms for command latency statistics feat: support histograms for command latency statistics Jan 14, 2025
@git-hulk
Copy link
Member

git-hulk commented Jan 15, 2025

@rabunkosar-dd Thanks for your contribution. You use ./x.py format to format your source codes after installing the clang-format-14

CMakeLists.txt Outdated Show resolved Hide resolved
Copy link
Member

@git-hulk git-hulk left a comment

Choose a reason for hiding this comment

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

Looks good to me, one comment inline.

src/stats/stats.cc Outdated Show resolved Hide resolved
src/config/config.cc Outdated Show resolved Hide resolved
src/stats/stats.cc Outdated Show resolved Hide resolved
src/stats/stats.h Outdated Show resolved Hide resolved
git-hulk
git-hulk previously approved these changes Jan 17, 2025
@git-hulk git-hulk requested a review from PragmaTwice January 17, 2025 09:57
@git-hulk
Copy link
Member

@rabunkosar-dd Could you please fix the lint issue?

@git-hulk git-hulk self-requested a review January 20, 2025 05:47
git-hulk
git-hulk previously approved these changes Jan 20, 2025
Copy link
Member

@git-hulk git-hulk left a comment

Choose a reason for hiding this comment

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

LGTM

@@ -43,6 +45,13 @@ enum StatsMetricFlags {

constexpr int STATS_METRIC_SAMPLES = 16; // Number of samples per metric

// Experimental part to support histograms for cmd statistics
struct CommandHistogram {
std::vector<std::shared_ptr<std::atomic<uint64_t>>> buckets;
Copy link
Member

Choose a reason for hiding this comment

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

It seems the atomic numbers inside the vector are not shared. Is it necessary to use shared_ptr here?

Copy link
Author

Choose a reason for hiding this comment

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

I used that as a workaround, since vector will not support atomic directly.

Copy link
Member

@PragmaTwice PragmaTwice Jan 21, 2025

Choose a reason for hiding this comment

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

There are basically two things:

since vector will not support atomic directly.

That's not totally correct. You can use std::vector<std::atomic>, but then some methods of vector will lead to compilation errors due to that atomic doesn't have copy ctor and copy assign op, e.g. push_back. Hence an obvious method is to avoid push_back, since we already know the size of the vector (i.e. make the vector a fixed-size one), then it can pass the compilation, with vector<atomic> being used.

I used that as a workaround

If you want to wrap it inside a smart pointer, I recommend std::unique_ptr.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants