aboutsummaryrefslogtreecommitdiffstats
path: root/library
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-02-11 11:03:03 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-02-11 11:03:03 +0300
commit9e0f7aea7799e801eb90af47c09825358537a718 (patch)
tree1baef65b00ef396862a4bbadb1fb62237ac929dc /library
parenta9af1955eae1da5beab8f35afe22635c467084b7 (diff)
downloadydb-9e0f7aea7799e801eb90af47c09825358537a718.tar.gz
intermediate changes
ref:23d75af30a9649405a1b3643fbbd9810cf9f1987
Diffstat (limited to 'library')
-rw-r--r--library/cpp/monlib/metrics/metric_registry.cpp16
-rw-r--r--library/cpp/monlib/metrics/metric_registry.h7
-rw-r--r--library/cpp/monlib/metrics/metric_registry_ut.cpp25
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");
+ }
}