Skip to content

Commit 05bdd9f

Browse files
authored
Merge pull request ceph#60426 from ronen-fr/wip-rf-svwperf
common/perf_counters: enabling 'find()' by logger name Reviewed-by: Radoslaw Zarzynski <[email protected]>
2 parents 30f64e1 + d2b910b commit 05bdd9f

17 files changed

+145
-121
lines changed

src/common/ceph_context.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,17 +538,18 @@ int CephContext::_do_command(
538538
std::string counter;
539539
cmd_getval(cmdmap, "logger", logger);
540540
cmd_getval(cmdmap, "counter", counter);
541-
_perf_counters_collection->dump_formatted(f, false, false, logger, counter);
541+
_perf_counters_collection->dump_formatted(f, false, select_labeled_t::unlabeled,
542+
logger, counter);
542543
}
543544
else if (command == "perfcounters_schema" || command == "2" ||
544545
command == "perf schema") {
545-
_perf_counters_collection->dump_formatted(f, true, false);
546+
_perf_counters_collection->dump_formatted(f, true, select_labeled_t::unlabeled);
546547
}
547548
else if (command == "counter dump") {
548-
_perf_counters_collection->dump_formatted(f, false, true);
549+
_perf_counters_collection->dump_formatted(f, false, select_labeled_t::labeled);
549550
}
550551
else if (command == "counter schema") {
551-
_perf_counters_collection->dump_formatted(f, true, true);
552+
_perf_counters_collection->dump_formatted(f, true, select_labeled_t::labeled);
552553
}
553554
else if (command == "perf histogram dump") {
554555
std::string logger;

src/common/perf_counters.cc

Lines changed: 53 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ using std::ostringstream;
2424
using std::make_pair;
2525
using std::pair;
2626

27+
using namespace std::literals;
28+
2729
namespace TOPNSPC::common {
2830
PerfCountersCollectionImpl::PerfCountersCollectionImpl()
2931
{
@@ -37,81 +39,56 @@ PerfCountersCollectionImpl::~PerfCountersCollectionImpl()
3739
void PerfCountersCollectionImpl::add(PerfCounters *l)
3840
{
3941
// make sure the name is unique
40-
perf_counters_set_t::iterator i;
41-
i = m_loggers.find(l);
42-
while (i != m_loggers.end()) {
43-
ostringstream ss;
44-
ss << l->get_name() << "-" << (void*)l;
45-
l->set_name(ss.str());
46-
i = m_loggers.find(l);
42+
while (m_loggers.contains(l)) {
43+
l->set_name(fmt::format("{}-{:p}", l->get_name(), (void *)l));
4744
}
4845

4946
m_loggers.insert(l);
5047

51-
for (unsigned int i = 0; i < l->m_data.size(); ++i) {
52-
PerfCounters::perf_counter_data_any_d &data = l->m_data[i];
53-
54-
std::string path = l->get_name();
55-
path += ".";
56-
path += data.name;
57-
58-
by_path[path] = {&data, l};
48+
const auto rc_name = l->get_name();
49+
for (auto& dt: l->m_data) {
50+
const auto path = rc_name + "." + dt.name;
51+
by_path[path] = {&dt, l};
5952
}
6053
}
6154

6255
void PerfCountersCollectionImpl::remove(PerfCounters *l)
6356
{
64-
for (unsigned int i = 0; i < l->m_data.size(); ++i) {
65-
PerfCounters::perf_counter_data_any_d &data = l->m_data[i];
66-
67-
std::string path = l->get_name();
68-
path += ".";
69-
path += data.name;
70-
57+
const auto rc_name = l->get_name();
58+
for (const auto& dt: l->m_data) {
59+
const auto path = rc_name + "." + dt.name;
7160
by_path.erase(path);
7261
}
7362

74-
perf_counters_set_t::iterator i = m_loggers.find(l);
75-
ceph_assert(i != m_loggers.end());
76-
m_loggers.erase(i);
63+
[[maybe_unused]] const auto rm_cnt = m_loggers.erase(l);
64+
ceph_assert(rm_cnt == 1);
7765
}
7866

7967
void PerfCountersCollectionImpl::clear()
8068
{
81-
perf_counters_set_t::iterator i = m_loggers.begin();
82-
perf_counters_set_t::iterator i_end = m_loggers.end();
83-
for (; i != i_end; ) {
84-
delete *i;
85-
m_loggers.erase(i++);
69+
for (auto& l : m_loggers) {
70+
delete l;
8671
}
87-
72+
m_loggers.clear();
8873
by_path.clear();
8974
}
9075

91-
bool PerfCountersCollectionImpl::reset(const std::string &name)
76+
bool PerfCountersCollectionImpl::reset(std::string_view name)
9277
{
93-
bool result = false;
94-
perf_counters_set_t::iterator i = m_loggers.begin();
95-
perf_counters_set_t::iterator i_end = m_loggers.end();
96-
97-
if (!strcmp(name.c_str(), "all")) {
98-
while (i != i_end) {
99-
(*i)->reset();
100-
++i;
101-
}
102-
result = true;
103-
} else {
104-
while (i != i_end) {
105-
if (!name.compare((*i)->get_name())) {
106-
(*i)->reset();
107-
result = true;
108-
break;
109-
}
110-
++i;
78+
if (name == "all"sv) {
79+
for (auto& dt: m_loggers) {
80+
dt->reset();
11181
}
82+
return true;
11283
}
11384

114-
return result;
85+
auto dt = m_loggers.find(name);
86+
if (dt == m_loggers.end()) {
87+
return false;
88+
}
89+
90+
(*dt)->reset();
91+
return true;
11592
}
11693

11794

@@ -131,13 +108,13 @@ void PerfCountersCollectionImpl::dump_formatted_generic(
131108
Formatter *f,
132109
bool schema,
133110
bool histograms,
134-
bool dump_labeled,
111+
select_labeled_t dump_labeled,
135112
const std::string &logger,
136113
const std::string &counter) const
137114
{
138115
f->open_object_section("perfcounter_collection");
139-
140-
if (dump_labeled) {
116+
117+
if (dump_labeled == select_labeled_t::labeled) {
141118
std::string prev_key_name;
142119
for (auto l = m_loggers.begin(); l != m_loggers.end(); ++l) {
143120
std::string_view key_name = ceph::perf_counters::key_name((*l)->get_name());
@@ -149,19 +126,28 @@ void PerfCountersCollectionImpl::dump_formatted_generic(
149126
prev_key_name = key_name;
150127

151128
f->open_array_section(key_name);
152-
(*l)->dump_formatted_generic(f, schema, histograms, true, "");
129+
(*l)->dump_formatted_generic(f, schema, histograms, select_labeled_t::labeled, "");
153130
} else {
154-
(*l)->dump_formatted_generic(f, schema, histograms, true, "");
131+
(*l)->dump_formatted_generic(f, schema, histograms, select_labeled_t::labeled, "");
155132
}
156133
}
157134
if (!m_loggers.empty()) {
158135
f->close_section(); // final array section
159136
}
160137
} else {
161-
for (auto l = m_loggers.begin(); l != m_loggers.end(); ++l) {
162-
// Optionally filter on logger name, pass through counter filter
163-
if (logger.empty() || (*l)->get_name() == logger) {
164-
(*l)->dump_formatted_generic(f, schema, histograms, false, counter);
138+
// unlabeled
139+
if (logger.empty()) {
140+
// dump all loggers
141+
for (auto& l : m_loggers) {
142+
l->dump_formatted_generic(f, schema, histograms,
143+
select_labeled_t::unlabeled, counter);
144+
}
145+
} else {
146+
// dump only specified logger
147+
auto l = m_loggers.find(logger);
148+
if (l != m_loggers.end()) {
149+
(*l)->dump_formatted_generic(f, schema, histograms,
150+
select_labeled_t::unlabeled, counter);
165151
}
166152
}
167153
}
@@ -377,10 +363,12 @@ void PerfCounters::reset()
377363
}
378364
}
379365

366+
380367
void PerfCounters::dump_formatted_generic(Formatter *f, bool schema,
381-
bool histograms, bool dump_labeled, const std::string &counter) const
368+
bool histograms, select_labeled_t dump_labeled,
369+
const std::string &counter) const
382370
{
383-
if (dump_labeled) {
371+
if (dump_labeled == select_labeled_t::labeled) {
384372
f->open_object_section(""); // should be enclosed by array
385373
f->open_object_section("labels");
386374
for (auto label : ceph::perf_counters::key_labels(m_name)) {
@@ -400,7 +388,7 @@ void PerfCounters::dump_formatted_generic(Formatter *f, bool schema,
400388

401389
f->open_object_section(m_name.c_str());
402390
}
403-
391+
404392
for (perf_counter_data_vec_t::const_iterator d = m_data.begin();
405393
d != m_data.end(); ++d) {
406394
if (!counter.empty() && counter != d->name) {
@@ -454,7 +442,7 @@ void PerfCounters::dump_formatted_generic(Formatter *f, bool schema,
454442
f->dump_string("nick", "");
455443
}
456444
f->dump_int("priority", get_adjusted_priority(d->prio));
457-
445+
458446
if (d->unit == UNIT_NONE) {
459447
f->dump_string("units", "none");
460448
} else if (d->unit == UNIT_BYTES) {
@@ -507,7 +495,7 @@ void PerfCounters::dump_formatted_generic(Formatter *f, bool schema,
507495
}
508496
}
509497
}
510-
if (dump_labeled) {
498+
if (dump_labeled == select_labeled_t::labeled) {
511499
f->close_section(); // counters
512500
}
513501
f->close_section();

0 commit comments

Comments
 (0)