From 72fff26e3d1b20fea1b99a0fc4fdd8a1587b94a8 Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Thu, 21 Jul 2011 11:05:47 -0700 Subject: [PATCH] perfcounters: don't output trailing commas in JSON Signed-off-by: Colin McCabe --- src/common/perf_counters.cc | 32 +++++++++++++++++++++----------- src/test/perf_counters.cc | 12 ++++++------ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index d11ee89d9740d..efe503bdc078e 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -95,10 +95,15 @@ write_json_to_buf(std::vector &buffer) { Mutex::Locker lck(m_lock); buffer.push_back('{'); - for (perf_counters_set_t::iterator l = m_loggers.begin(); - l != m_loggers.end(); ++l) - { - (*l)->write_json_to_buf(buffer); + perf_counters_set_t::iterator l = m_loggers.begin(); + perf_counters_set_t::iterator l_end = m_loggers.end(); + if (l != l_end) { + while (true) { + (*l)->write_json_to_buf(buffer); + if (++l == l_end) + break; + buffer.push_back(','); + } } buffer.push_back('}'); buffer.push_back('\0'); @@ -208,19 +213,23 @@ write_json_to_buf(std::vector &buffer) perf_counter_data_vec_t::const_iterator d = m_data.begin(); perf_counter_data_vec_t::const_iterator d_end = m_data.end(); - for (; d != d_end; ++d) { + if (d == d_end) { + buffer.push_back('}'); + return; + } + while (true) { const perf_counter_data_any_d &data(*d); buf[0] = '\0'; if (d->count != COUNT_DISABLED) { switch (d->type) { case PERF_COUNTERS_DATA_ANY_U64: snprintf(buf, sizeof(buf), "\"%s\":{\"count\":%" PRId64 "," - "\"sum\":%" PRId64 "},", + "\"sum\":%" PRId64 "}", data.name, data.count, data.u.u64); break; case PERF_COUNTERS_DATA_ANY_DOUBLE: snprintf(buf, sizeof(buf), "\"%s\":{\"count\":%" PRId64 "," - "\"sum\":%g},", + "\"sum\":%g}", data.name, data.count, data.u.dbl); break; default: @@ -231,11 +240,11 @@ write_json_to_buf(std::vector &buffer) else { switch (d->type) { case PERF_COUNTERS_DATA_ANY_U64: - snprintf(buf, sizeof(buf), "\"%s\":%" PRId64 ",", + snprintf(buf, sizeof(buf), "\"%s\":%" PRId64, data.name, data.u.u64); break; case PERF_COUNTERS_DATA_ANY_DOUBLE: - snprintf(buf, sizeof(buf), "\"%s\":%g,", data.name, data.u.dbl); + snprintf(buf, sizeof(buf), "\"%s\":%g", data.name, data.u.dbl); break; default: assert(0); @@ -243,10 +252,11 @@ write_json_to_buf(std::vector &buffer) } } append_to_vector(buffer, buf); + if (++d == d_end) + break; + buffer.push_back(','); } - buffer.push_back('}'); - buffer.push_back(','); } const std::string &PerfCounters:: diff --git a/src/test/perf_counters.cc b/src/test/perf_counters.cc index 5ad90a441f829..05dd182ba97b0 100644 --- a/src/test/perf_counters.cc +++ b/src/test/perf_counters.cc @@ -84,18 +84,18 @@ TEST(PerfCounters, SinglePerfCounters) { std::string msg; ASSERT_EQ("", client.get_message(&msg)); ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':0," - "'element2':0,'element3':{'count':0,'sum':0},},}"), msg); + "'element2':0,'element3':{'count':0,'sum':0}}}"), msg); fake_pf->inc(TEST_PERFCOUNTERS1_ELEMENT_1); fake_pf->fset(TEST_PERFCOUNTERS1_ELEMENT_2, 0.5); fake_pf->finc(TEST_PERFCOUNTERS1_ELEMENT_3, 100.0); ASSERT_EQ("", client.get_message(&msg)); ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':1," - "'element2':0.5,'element3':{'count':1,'sum':100},},}"), msg); + "'element2':0.5,'element3':{'count':1,'sum':100}}}"), msg); fake_pf->finc(TEST_PERFCOUNTERS1_ELEMENT_3, 0.0); fake_pf->finc(TEST_PERFCOUNTERS1_ELEMENT_3, 25.0); ASSERT_EQ("", client.get_message(&msg)); ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':1,'element2':0.5," - "'element3':{'count':3,'sum':125},},}"), msg); + "'element3':{'count':3,'sum':125}}}"), msg); } enum { @@ -128,18 +128,18 @@ TEST(PerfCounters, MultiplePerfCounters) { ASSERT_EQ("", client.get_message(&msg)); ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':0,'element2':0,'element3':" - "{'count':0,'sum':0},},'test_perfcounter_2':{'foo':0,'bar':0,},}"), msg); + "{'count':0,'sum':0}},'test_perfcounter_2':{'foo':0,'bar':0}}"), msg); fake_pf1->inc(TEST_PERFCOUNTERS1_ELEMENT_1); fake_pf1->inc(TEST_PERFCOUNTERS1_ELEMENT_1, 5); ASSERT_EQ("", client.get_message(&msg)); ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':6,'element2':0,'element3':" - "{'count':0,'sum':0},},'test_perfcounter_2':{'foo':0,'bar':0,},}"), msg); + "{'count':0,'sum':0}},'test_perfcounter_2':{'foo':0,'bar':0}}"), msg); coll->logger_remove(fake_pf2); ASSERT_EQ("", client.get_message(&msg)); ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':6,'element2':0," - "'element3':{'count':0,'sum':0},},}"), msg); + "'element3':{'count':0,'sum':0}}}"), msg); coll->logger_clear(); ASSERT_EQ("", client.get_message(&msg)); -- 2.39.5