Skip to content

Commit c7aec57

Browse files
snaurysnaury
authored andcommitted
Allow FindSubgroup in dynamic counters to find unknown values
YDB использует динамическое дерево счётчиков с множеством опциональных лейблов после идентификатора сервиса, которые могут появляться и меняться. Сервисы при регистрации пытаются найти в каком узле дерева регистрировать счётчики пропуская эти опциональные лейблы, если они уже существуют. Исторически такой пропуск работает через `EnumerateSubgroups`, однако обнаружилось, что если сразу после опциональных лейблов дерево очень сильно ветвится (например по номерам групп в dsproxy), то при регистрации большого кол-ва счётчиков по группам эта регистрация становится квадратичной от количества групп. Хочется добавить новый метод `FindSubgroup(TString)` чтобы искать пропускаемые лейблы за `O(log N)` вместо `O(N)`. commit_hash:7ce074f58a3a90caf535d8fad24eef7ac6782d06
1 parent 4a82fb5 commit c7aec57

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

library/cpp/monlib/dynamic_counters/counters.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,18 @@ TIntrusivePtr<TDynamicCounters> TDynamicCounters::GetSubgroup(const TString& nam
141141
return res;
142142
}
143143

144+
TIntrusivePtr<TDynamicCounters> TDynamicCounters::FindSubgroup(const TString& name) const {
145+
TReadGuard g(Lock);
146+
const auto it = Counters.lower_bound({name, TString()});
147+
if (it != Counters.end() && it->first.LabelName == name) {
148+
const auto it2 = std::next(it);
149+
if (it2 == Counters.end() || it2->first.LabelName != name) {
150+
return AsDynamicCounters(it->second);
151+
}
152+
}
153+
return nullptr;
154+
}
155+
144156
TIntrusivePtr<TDynamicCounters> TDynamicCounters::FindSubgroup(const TString& name, const TString& value) const {
145157
TReadGuard g(Lock);
146158
const auto it = Counters.find({name, value});

library/cpp/monlib/dynamic_counters/counters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ namespace NMonitoring {
331331
void RemoveSubgroupChain(const std::vector<std::pair<TString, TString>>& chain);
332332

333333
TIntrusivePtr<TDynamicCounters> GetSubgroup(const TString& name, const TString& value);
334+
TIntrusivePtr<TDynamicCounters> FindSubgroup(const TString& name) const;
334335
TIntrusivePtr<TDynamicCounters> FindSubgroup(const TString& name, const TString& value) const;
335336
bool RemoveSubgroup(const TString& name, const TString& value);
336337
void ReplaceSubgroup(const TString& name, const TString& value, TIntrusivePtr<TDynamicCounters> subgroup);

library/cpp/monlib/dynamic_counters/counters_ut.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,4 +339,30 @@ Y_UNIT_TEST_SUITE(TDynamicCountersTest) {
339339
histogram = rootGroup->FindNamedHistogram("name", "histogram2");
340340
UNIT_ASSERT(histogram);
341341
}
342+
343+
Y_UNIT_TEST(FindSubgroup) {
344+
TDynamicCounterPtr rootGroup(new TDynamicCounters());
345+
346+
auto a = rootGroup->GetSubgroup("a", "1");
347+
auto b1 = rootGroup->GetSubgroup("b", "1");
348+
auto b2 = rootGroup->GetSubgroup("b", "2");
349+
auto c = rootGroup->GetSubgroup("c", "1");
350+
auto e = rootGroup->GetSubgroup("e", "1");
351+
352+
UNIT_ASSERT(a == rootGroup->FindSubgroup("a"));
353+
UNIT_ASSERT(a == rootGroup->FindSubgroup("a", "1"));
354+
UNIT_ASSERT(nullptr == rootGroup->FindSubgroup("a", "2"));
355+
356+
UNIT_ASSERT(nullptr == rootGroup->FindSubgroup("b"));
357+
UNIT_ASSERT(b1 == rootGroup->FindSubgroup("b", "1"));
358+
UNIT_ASSERT(b2 == rootGroup->FindSubgroup("b", "2"));
359+
UNIT_ASSERT(nullptr == rootGroup->FindSubgroup("b", "3"));
360+
361+
UNIT_ASSERT(c == rootGroup->FindSubgroup("c"));
362+
UNIT_ASSERT(c == rootGroup->FindSubgroup("c", "1"));
363+
UNIT_ASSERT(nullptr == rootGroup->FindSubgroup("c", "2"));
364+
365+
UNIT_ASSERT(nullptr == rootGroup->FindSubgroup("d"));
366+
UNIT_ASSERT(nullptr == rootGroup->FindSubgroup("f"));
367+
}
342368
}

0 commit comments

Comments
 (0)