From d304cff78b80bc4143704376728c2644f5b9d087 Mon Sep 17 00:00:00 2001 From: Vladimir Pustovalov Date: Wed, 17 Dec 2025 18:12:29 +0300 Subject: [PATCH 1/5] renamed BareBones::XXHash to BareBones::XXHash3 --- pp/bare_bones/snug_composite.h | 4 ++-- pp/bare_bones/tests/snug_composite_tests.cpp | 4 ++-- pp/bare_bones/xxhash.h | 8 ++++---- pp/primitives/hash.h | 4 ++-- pp/wal/hashdex/scraper/scraper.h | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pp/bare_bones/snug_composite.h b/pp/bare_bones/snug_composite.h index e8526fe41b..f16e16a877 100644 --- a/pp/bare_bones/snug_composite.h +++ b/pp/bare_bones/snug_composite.h @@ -79,8 +79,8 @@ class GenericDecodingTable { const GenericDecodingTable* decoding_table; PROMPP_ALWAYS_INLINE explicit Hasher(const GenericDecodingTable* _decoding_table = nullptr) noexcept : decoding_table(_decoding_table) {} - PROMPP_ALWAYS_INLINE size_t operator()(const std::string_view& str) const noexcept { return XXHash::hash(str); } - PROMPP_ALWAYS_INLINE size_t operator()(const std::string& str) const noexcept { return XXHash::hash(str); } + PROMPP_ALWAYS_INLINE size_t operator()(const std::string_view& str) const noexcept { return XXHash3::hash(str); } + PROMPP_ALWAYS_INLINE size_t operator()(const std::string& str) const noexcept { return XXHash3::hash(str); } template PROMPP_ALWAYS_INLINE size_t operator()(const Class& c) const noexcept { diff --git a/pp/bare_bones/tests/snug_composite_tests.cpp b/pp/bare_bones/tests/snug_composite_tests.cpp index 49f8b51ffa..017cd7deca 100644 --- a/pp/bare_bones/tests/snug_composite_tests.cpp +++ b/pp/bare_bones/tests/snug_composite_tests.cpp @@ -141,7 +141,7 @@ TYPED_TEST(SnugComposite, should_return_same_id_for_same_data_with_hash) { this->fill_table_with_random_values(outcomes); std::string v = "12"; - auto hash_val = BareBones::XXHash::hash(v); + auto hash_val = BareBones::XXHash3::hash(v); auto id = outcomes.find_or_emplace(v, hash_val); EXPECT_EQ(id, outcomes.find_or_emplace(v, hash_val)); @@ -151,7 +151,7 @@ TYPED_TEST(SnugComposite, should_return_same_id_for_same_data_with_hash) { EXPECT_EQ(outcomes.find_or_emplace(v, hash_val), outcomes.find(v)); v = "21"; - hash_val = BareBones::XXHash::hash(v); + hash_val = BareBones::XXHash3::hash(v); id = outcomes.find_or_emplace(v); EXPECT_EQ(id, outcomes.find_or_emplace(v, hash_val)); diff --git a/pp/bare_bones/xxhash.h b/pp/bare_bones/xxhash.h index da670fe888..a3f4a55e27 100644 --- a/pp/bare_bones/xxhash.h +++ b/pp/bare_bones/xxhash.h @@ -12,7 +12,7 @@ PRAGMA_DIAGNOSTIC(pop) namespace BareBones { -class XXHash { +class XXHash3 { public: template requires std::is_arithmetic_v @@ -30,15 +30,15 @@ class XXHash { [[nodiscard]] PROMPP_ALWAYS_INLINE uint64_t hash() const noexcept { return hash_; } [[nodiscard]] explicit PROMPP_ALWAYS_INLINE operator uint64_t() const noexcept { return hash_; } - auto operator<=>(const XXHash& other) const noexcept = default; + auto operator<=>(const XXHash3& other) const noexcept = default; - XXHash& operator=(uint64_t hash) noexcept { + XXHash3& operator=(uint64_t hash) noexcept { hash_ = hash; return *this; } PROMPP_ALWAYS_INLINE static uint64_t hash(const char* data, size_t size) noexcept { - XXHash hasher; + XXHash3 hasher; hasher.extend(data, size); return hasher.hash(); } diff --git a/pp/primitives/hash.h b/pp/primitives/hash.h index 881e59e3fa..8efe155b91 100644 --- a/pp/primitives/hash.h +++ b/pp/primitives/hash.h @@ -6,7 +6,7 @@ namespace PromPP::Primitives::hash { template size_t hash_of_label_set(const LabelSet& label_set) noexcept { - BareBones::XXHash hash; + BareBones::XXHash3 hash; for (const auto& [label_name, label_value] : label_set) { hash.extend(static_cast(label_name), static_cast(label_value)); } @@ -15,7 +15,7 @@ size_t hash_of_label_set(const LabelSet& label_set) noexcept { template size_t hash_of_string_list(const StringList& strings) noexcept { - BareBones::XXHash hash; + BareBones::XXHash3 hash; for (const auto& string : strings) { hash.extend(static_cast(string)); } diff --git a/pp/wal/hashdex/scraper/scraper.h b/pp/wal/hashdex/scraper/scraper.h index 6f9b2db5f1..b3538c59ca 100644 --- a/pp/wal/hashdex/scraper/scraper.h +++ b/pp/wal/hashdex/scraper/scraper.h @@ -343,7 +343,7 @@ class Scraper { void append_labels_hash() noexcept { const auto& tokenizer = parser_.tokenizer(); - BareBones::XXHash hash; + BareBones::XXHash3 hash; for (const auto& label : labels_) { hash.extend(label.name.view(tokenizer.buffer()), label.value.view(tokenizer.buffer())); } From df11747fc121b40cf0b13fa56a000b28a7b59eba Mon Sep 17 00:00:00 2001 From: Vladimir Pustovalov Date: Wed, 17 Dec 2025 18:43:24 +0300 Subject: [PATCH 2/5] rewrited cpp metrics mechanism --- pp/bare_bones/concepts.h | 3 + pp/bare_bones/xxhash.h | 11 +++ pp/entrypoint/metrics.cpp | 22 ++--- pp/entrypoint/metrics.h | 4 +- pp/go/cppbridge/entrypoint.go | 8 +- pp/go/cppbridge/entrypoint.h | 4 +- pp/go/cppbridge/metrics.go | 56 ++++++++--- pp/go/cppbridge/metrics_test.go | 51 +++------- pp/go/storage/manager.go | 2 + pp/metrics/counter.h | 26 ++--- pp/metrics/metric.h | 37 +++++-- pp/metrics/metrics_page.h | 11 +-- pp/metrics/metrics_page_list_tests.cpp | 17 ++-- pp/metrics/metrics_page_tests.cpp | 9 +- pp/metrics/serializer.h | 42 -------- pp/metrics/serializer_tests.cpp | 35 ------- pp/metrics/storage.h | 12 +-- pp/metrics/storage_tests.cpp | 10 +- pp/primitives/go_metric.h | 122 ++++++++++++++++++++++++ pp/primitives/go_model.h | 3 + pp/primitives/go_slice.h | 95 +++++++++--------- pp/primitives/label_set.h | 14 ++- pp/primitives/tests/go_metric_tests.cpp | 43 +++++++++ 23 files changed, 381 insertions(+), 256 deletions(-) delete mode 100644 pp/metrics/serializer.h delete mode 100644 pp/metrics/serializer_tests.cpp create mode 100644 pp/primitives/go_metric.h create mode 100644 pp/primitives/tests/go_metric_tests.cpp diff --git a/pp/bare_bones/concepts.h b/pp/bare_bones/concepts.h index 605e0aac5d..d211df04d6 100644 --- a/pp/bare_bones/concepts.h +++ b/pp/bare_bones/concepts.h @@ -71,4 +71,7 @@ concept SteadyClockInterface = requires(Clock& clock) { { clock.now() }; }; +template +concept arithmetic = std::integral || std::floating_point; + } // namespace BareBones::concepts diff --git a/pp/bare_bones/xxhash.h b/pp/bare_bones/xxhash.h index a3f4a55e27..3d0c2968db 100644 --- a/pp/bare_bones/xxhash.h +++ b/pp/bare_bones/xxhash.h @@ -50,4 +50,15 @@ class XXHash3 { uint64_t hash_{}; }; +class XXHash { + public: + PROMPP_ALWAYS_INLINE XXHash() { XXH64_reset(&state_, 0); } + + PROMPP_ALWAYS_INLINE void extend(std::string_view data) noexcept { XXH64_update(&state_, data.data(), data.length()); } + [[nodiscard]] PROMPP_ALWAYS_INLINE uint64_t digest() const noexcept { return XXH64_digest(&state_); } + + private: + XXH64_state_t state_; +}; + } // namespace BareBones diff --git a/pp/entrypoint/metrics.cpp b/pp/entrypoint/metrics.cpp index 32e11daf0b..4eef4c6676 100644 --- a/pp/entrypoint/metrics.cpp +++ b/pp/entrypoint/metrics.cpp @@ -3,14 +3,12 @@ #include #include "metrics/counter.h" -#include "metrics/serializer.h" #include "metrics/storage.h" #include "primitives/go_model.h" #include "primitives/go_slice.h" struct MetricsIterator { metrics::Storage::Iterator iterator{metrics::storage().begin()}; - metrics::Serializer serializer; }; using MetricsIteratorPtr = std::unique_ptr; @@ -37,22 +35,21 @@ extern "C" void prompp_metrics_iterator_dtor(void* args) { static_cast(args)->~Arguments(); } -extern "C" void prompp_metrics_iterator_serialize(void* args, void* res) { +extern "C" void prompp_metrics_iterator_next(void* args, void* res) { struct Arguments { MetricsIteratorPtr iterator; }; struct Result { - SliceView buffer; + const PromPP::Primitives::Go::Metric* metric; }; const auto it = static_cast(args)->iterator.get(); const auto out = static_cast(res); if (it->iterator == metrics::Storage::end()) [[unlikely]] { - out->buffer.reset_to(nullptr, 0, 0); + out->metric = nullptr; } else { - const auto& buffer = it->serializer.serialize(it->iterator->page->labels(), it->iterator->metric); - out->buffer.reset_to(buffer.c_str(), buffer.size(), buffer.capacity()); + out->metric = it->iterator->metric->go_metric(); ++it->iterator; } } @@ -60,10 +57,10 @@ extern "C" void prompp_metrics_iterator_serialize(void* args, void* res) { struct MetricsPageForTest final : metrics::MetricsPage { using MetricsPage::MetricsPage; - MetricsPageForTest(PromPP::Primitives::LabelViewSet&& label_set, const String& counter_name, uint64_t counter_value) - : MetricsPage(std::move(label_set)), emplace_count(static_cast(counter_name), counter_value) {} + MetricsPageForTest(const SliceView