ret = handle_version_request(connection_fd);
break;
case 1:
- case 2:
/* data request */
- ret = handle_data_request(connection_fd);
+ ret = handle_json_request(connection_fd, false);
+ break;
+ case 2:
+ /* schema request */
+ ret = handle_json_request(connection_fd, true);
break;
-// /* schema request */
-// ret = handle_schema_request(connection_fd);
-// break;
default:
lderr(m_parent->m_cct) << "AdminSocket: unknown request "
<< "code " << request << dendl;
return true;
}
- bool handle_data_request(int connection_fd)
+ bool handle_json_request(int connection_fd, bool schema)
{
std::vector<char> buffer;
buffer.reserve(512);
PerfCountersCollection *coll = m_parent->m_cct->GetPerfCountersCollection();
if (coll) {
- coll->write_json_to_buf(buffer);
+ coll->write_json_to_buf(buffer, schema);
}
uint32_t len = htonl(buffer.size());
<< cpp_strerror(ret) << dendl;
return false;
}
- ldout(m_parent->m_cct, 30) << "AdminSocket: handle_data_request succeeded."
+ ldout(m_parent->m_cct, 30) << "AdminSocket: handle_json_request succeeded."
<< dendl;
return true;
}
- bool handle_schema_request(int connection_fd)
- {
- // TODO: implement!
- return false;
- }
-
AdminSocket(AdminSocket &rhs);
const AdminSocket &operator=(const AdminSocket &rhs);
return err;
}
+std::string AdminSocketClient::
+get_schema(std::string *message)
+{
+ return get_json(message, 0x2);
+}
+
std::string AdminSocketClient::
get_message(std::string *message)
+{
+ return get_json(message, 0x1);
+}
+
+std::string AdminSocketClient::
+get_json(std::string *message, uint32_t request_code)
{
int socket_fd, res;
std::vector<uint8_t> vec(65536, 0);
if (!err.empty()) {
goto done;
}
- err = asok_request(socket_fd, 0x1);
+ err = asok_request(socket_fd, request_code);
if (!err.empty()) {
goto done;
}
public:
AdminSocketClient(const std::string &path);
std::string get_version(uint32_t *version);
+ std::string get_schema(std::string *message);
std::string get_message(std::string *message);
+ std::string get_json(std::string *message, uint32_t request_code);
private:
std::string m_path;
};
}
void PerfCountersCollection::
-write_json_to_buf(std::vector <char> &buffer)
+write_json_to_buf(std::vector <char> &buffer, bool schema)
{
Mutex::Locker lck(m_lock);
buffer.push_back('{');
perf_counters_set_t::iterator l_end = m_loggers.end();
if (l != l_end) {
while (true) {
- (*l)->write_json_to_buf(buffer);
+ (*l)->write_json_to_buf(buffer, schema);
if (++l == l_end)
break;
buffer.push_back(',');
}
void PerfCounters::
-write_json_to_buf(std::vector <char> &buffer)
+write_json_to_buf(std::vector <char> &buffer, bool schema)
{
char buf[512];
Mutex::Locker lck(m_lock);
while (true) {
const perf_counter_data_any_d &data(*d);
buf[0] = '\0';
- data.write_json(buf, sizeof(buf));
+ if (schema)
+ data.write_schema_json(buf, sizeof(buf));
+ else
+ data.write_json(buf, sizeof(buf));
append_to_vector(buffer, buf);
if (++d == d_end)
memset(&u, 0, sizeof(u));
}
+void PerfCounters::perf_counter_data_any_d::
+write_schema_json(char *buf, size_t buf_sz) const
+{
+ snprintf(buf, buf_sz, "\"%s\":{\"type\":%d}", name, type);
+}
+
void PerfCounters::perf_counter_data_any_d::
write_json(char *buf, size_t buf_sz) const
{
void finc(int idx, double v);
double fget(int idx) const;
- void write_json_to_buf(std::vector <char> &buffer);
+ void write_json_to_buf(std::vector <char> &buffer, bool schema);
const std::string& get_name() const;
/** Represents a PerfCounters data element. */
struct perf_counter_data_any_d {
perf_counter_data_any_d();
+ void write_schema_json(char *buf, size_t buf_sz) const;
void write_json(char *buf, size_t buf_sz) const;
const char *name;
void logger_add(class PerfCounters *l);
void logger_remove(class PerfCounters *l);
void logger_clear();
- void write_json_to_buf(std::vector <char> &buffer);
+ void write_json_to_buf(std::vector <char> &buffer, bool schema);
private:
bool init(const std::string &uri);
void shutdown();
ASSERT_EQ("", client.get_message(&msg));
ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':6,'element2':0,"
"'element3':{'avgcount':0,'sum':0}}}"), msg);
-
+ ASSERT_EQ("", client.get_schema(&msg));
+ ASSERT_EQ(sd("{'test_perfcounter_1':{'element1':{'type':2},"
+ "'element2':{'type':1},'element3':{'type':5}}}"), msg);
coll->logger_clear();
ASSERT_EQ("", client.get_message(&msg));
ASSERT_EQ("{}", msg);