diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-02-11 11:03:03 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-02-11 11:03:03 +0300 |
commit | 9e0f7aea7799e801eb90af47c09825358537a718 (patch) | |
tree | 1baef65b00ef396862a4bbadb1fb62237ac929dc /library | |
parent | a9af1955eae1da5beab8f35afe22635c467084b7 (diff) | |
download | ydb-9e0f7aea7799e801eb90af47c09825358537a718.tar.gz |
intermediate changes
ref:23d75af30a9649405a1b3643fbbd9810cf9f1987
Diffstat (limited to 'library')
-rw-r--r-- | library/cpp/monlib/metrics/metric_registry.cpp | 16 | ||||
-rw-r--r-- | library/cpp/monlib/metrics/metric_registry.h | 7 | ||||
-rw-r--r-- | library/cpp/monlib/metrics/metric_registry_ut.cpp | 25 |
3 files changed, 40 insertions, 8 deletions
diff --git a/library/cpp/monlib/metrics/metric_registry.cpp b/library/cpp/monlib/metrics/metric_registry.cpp index b083163a7b..213cab1aca 100644 --- a/library/cpp/monlib/metrics/metric_registry.cpp +++ b/library/cpp/monlib/metrics/metric_registry.cpp @@ -40,6 +40,8 @@ namespace NMonitoring { CommonLabels_ = commonLabels; } + TMetricRegistry& TMetricRegistry::operator=(TMetricRegistry&& other) = default; + TMetricRegistry* TMetricRegistry::Instance() { return Singleton<TMetricRegistry>(); } @@ -125,7 +127,7 @@ namespace NMonitoring { } void TMetricRegistry::Reset() { - TWriteGuard g{Lock_}; + TWriteGuard g{*Lock_}; for (auto& [label, metric] : Metrics_) { switch (metric->Type()) { case EMetricType::GAUGE: @@ -153,14 +155,14 @@ namespace NMonitoring { } void TMetricRegistry::Clear() { - TWriteGuard g{Lock_}; + TWriteGuard g{*Lock_}; Metrics_.clear(); } template <typename TMetric, EMetricType type, typename TLabelsType, typename... Args> TMetric* TMetricRegistry::Metric(TLabelsType&& labels, Args&&... args) { { - TReadGuard g{Lock_}; + TReadGuard g{*Lock_}; auto it = Metrics_.find(labels); if (it != Metrics_.end()) { @@ -174,7 +176,7 @@ namespace NMonitoring { { IMetricPtr metric = MakeHolder<TMetric>(std::forward<Args>(args)...); - TWriteGuard g{Lock_}; + TWriteGuard g{*Lock_}; // decltype(Metrics_)::iterator breaks build on windows THashMap<ILabelsPtr, IMetricPtr>::iterator it; if constexpr (!std::is_convertible_v<TLabelsType, ILabelsPtr>) { @@ -188,7 +190,7 @@ namespace NMonitoring { } void TMetricRegistry::RemoveMetric(const ILabels& labels) noexcept { - TWriteGuard g{Lock_}; + TWriteGuard g{*Lock_}; Metrics_.erase(labels); } @@ -202,7 +204,7 @@ namespace NMonitoring { } { - TReadGuard g{Lock_}; + TReadGuard g{*Lock_}; for (const auto& it: Metrics_) { ILabels* labels = it.first.Get(); IMetric* metric = it.second.Get(); @@ -216,7 +218,7 @@ namespace NMonitoring { } void TMetricRegistry::Append(TInstant time, IMetricConsumer* consumer) const { - TReadGuard g{Lock_}; + TReadGuard g{*Lock_}; for (const auto& it: Metrics_) { ILabels* labels = it.first.Get(); diff --git a/library/cpp/monlib/metrics/metric_registry.h b/library/cpp/monlib/metrics/metric_registry.h index 670cf8651e..6d5a59f04d 100644 --- a/library/cpp/monlib/metrics/metric_registry.h +++ b/library/cpp/monlib/metrics/metric_registry.h @@ -58,6 +58,11 @@ namespace NMonitoring { explicit TMetricRegistry(const TLabels& commonLabels); /** + * Not thread-safe. There should be no concurrent operations in the registry. + */ + TMetricRegistry& operator=(TMetricRegistry&& other); + + /** * Get a global metrics registry instance. */ static TMetricRegistry* Instance(); @@ -116,7 +121,7 @@ namespace NMonitoring { IHistogramCollectorPtr collector) override; private: - TRWMutex Lock_; + THolder<TRWMutex> Lock_ = MakeHolder<TRWMutex>(); THashMap<ILabelsPtr, IMetricPtr> Metrics_; template <typename TMetric, EMetricType type, typename TLabelsType, typename... Args> diff --git a/library/cpp/monlib/metrics/metric_registry_ut.cpp b/library/cpp/monlib/metrics/metric_registry_ut.cpp index 86d9a52ec0..4436fd4943 100644 --- a/library/cpp/monlib/metrics/metric_registry_ut.cpp +++ b/library/cpp/monlib/metrics/metric_registry_ut.cpp @@ -316,4 +316,29 @@ Y_UNIT_TEST_SUITE(TMetricRegistryTest) { UNIT_ASSERT(samples.SamplesSize() == 0); } + + Y_UNIT_TEST(AssignNewRegistry) { + TMetricRegistry registry; + registry.Gauge({{"some", "label"}})->Add(1); + + NProto::TSingleSamplesList samples; + auto encoder = EncoderProtobuf(&samples); + registry.Accept(TInstant::Now(), encoder.Get()); + + UNIT_ASSERT(samples.CommonLabelsSize() == 0); + UNIT_ASSERT(samples.SamplesSize() == 1); + + samples = {}; + auto newRegistry = TMetricRegistry{{{"common", "label"}}}; + registry = std::move(newRegistry); + + registry.Accept(TInstant::Now(), encoder.Get()); + + const auto& commonLabels = samples.GetCommonLabels(); + + UNIT_ASSERT(samples.GetSamples().size() == 0); + UNIT_ASSERT(commonLabels.size() == 1); + UNIT_ASSERT(commonLabels[0].GetName() == "common"); + UNIT_ASSERT(commonLabels[0].GetValue() == "label"); + } } |