diff options
| author | arcadia-devtools <[email protected]> | 2022-02-11 11:03:03 +0300 | 
|---|---|---|
| committer | arcadia-devtools <[email protected]> | 2022-02-11 11:03:03 +0300 | 
| commit | 9e0f7aea7799e801eb90af47c09825358537a718 (patch) | |
| tree | 1baef65b00ef396862a4bbadb1fb62237ac929dc /library/cpp | |
| parent | a9af1955eae1da5beab8f35afe22635c467084b7 (diff) | |
intermediate changes
ref:23d75af30a9649405a1b3643fbbd9810cf9f1987
Diffstat (limited to 'library/cpp')
| -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 b083163a7b2..213cab1aca1 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 670cf8651e1..6d5a59f04d3 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 86d9a52ec0c..4436fd4943d 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"); +    }  }  | 
