]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
perfcounters: don't output trailing commas in JSON
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 21 Jul 2011 18:05:47 +0000 (11:05 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 21 Jul 2011 18:05:47 +0000 (11:05 -0700)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/common/perf_counters.cc
src/test/perf_counters.cc

index d11ee89d9740d44cdfec3cb4dd3cc0014105b4b3..efe503bdc078e78109b285914d1139d7f51a7965 100644 (file)
@@ -95,10 +95,15 @@ write_json_to_buf(std::vector <char> &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 <char> &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 <char> &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 <char> &buffer)
       }
     }
     append_to_vector(buffer, buf);
+    if (++d == d_end)
+      break;
+    buffer.push_back(',');
   }
-
   buffer.push_back('}');
-  buffer.push_back(',');
 }
 
 const std::string &PerfCounters::
index 5ad90a441f829512296b56f4a68b2d720b11057d..05dd182ba97b09a5b43077bb1dd137082ff7b909 100644 (file)
@@ -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));