@@ -24,6 +24,8 @@ using std::ostringstream;
2424using std::make_pair;
2525using std::pair;
2626
27+ using namespace std ::literals;
28+
2729namespace TOPNSPC ::common {
2830PerfCountersCollectionImpl::PerfCountersCollectionImpl ()
2931{
@@ -37,81 +39,56 @@ PerfCountersCollectionImpl::~PerfCountersCollectionImpl()
3739void 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
6255void 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
7967void 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+
380367void 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