From: Rubab-Syed Date: Fri, 26 Jan 2018 22:45:56 +0000 (+0500) Subject: mgr: add units to performance counters X-Git-Tag: v12.2.8~16^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cb342aafb88bc1a44949bba633e46ca475e84266;p=ceph.git mgr: add units to performance counters Signed-off-by: Rubab Syed (cherry picked from commit 8fb421070473ea212302f790f7da8e8939011d35) Signed-off-by: Ernesto Puerta Conflicts: src/messages/MMgrReport.h src/mon/Monitor.cc src/pybind/mgr/dashboard/module.py src/pybind/mgr/mgr_module.py - src/messages/MMgrReport.h: keep current namespace operator (::) - src/mon/Monitor.cc: keep metrics later removed in Mimic - src/pybind/mgr/dashboard/module.py: add perf_counters* methods - src/pybind/mgr/mgr_module.py: add _unit_to_str() method while keeping _perfvalue_to_value() --- diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index 048c93a64334..ce2ad58d9312 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -397,6 +397,12 @@ void PerfCounters::dump_formatted_generic(Formatter *f, bool schema, f->dump_string("nick", ""); } f->dump_int("priority", get_adjusted_priority(d->prio)); + + if (d->unit == NONE) { + f->dump_string("units", "none"); + } else if (d->unit == BYTES) { + f->dump_string("units", "bytes"); + } f->close_section(); } else { if (d->type & PERFCOUNTER_LONGRUNAVG) { @@ -479,25 +485,25 @@ PerfCountersBuilder::~PerfCountersBuilder() void PerfCountersBuilder::add_u64_counter( int idx, const char *name, - const char *description, const char *nick, int prio) + const char *description, const char *nick, int prio, int unit) { add_impl(idx, name, description, nick, prio, - PERFCOUNTER_U64 | PERFCOUNTER_COUNTER); + PERFCOUNTER_U64 | PERFCOUNTER_COUNTER, unit); } void PerfCountersBuilder::add_u64( int idx, const char *name, - const char *description, const char *nick, int prio) + const char *description, const char *nick, int prio, int unit) { - add_impl(idx, name, description, nick, prio, PERFCOUNTER_U64); + add_impl(idx, name, description, nick, prio, PERFCOUNTER_U64, unit); } void PerfCountersBuilder::add_u64_avg( int idx, const char *name, - const char *description, const char *nick, int prio) + const char *description, const char *nick, int prio, int unit) { add_impl(idx, name, description, nick, prio, - PERFCOUNTER_U64 | PERFCOUNTER_LONGRUNAVG); + PERFCOUNTER_U64 | PERFCOUNTER_LONGRUNAVG, unit); } void PerfCountersBuilder::add_time( @@ -519,16 +525,16 @@ void PerfCountersBuilder::add_u64_counter_histogram( int idx, const char *name, PerfHistogramCommon::axis_config_d x_axis_config, PerfHistogramCommon::axis_config_d y_axis_config, - const char *description, const char *nick, int prio) + const char *description, const char *nick, int prio, int unit) { add_impl(idx, name, description, nick, prio, - PERFCOUNTER_U64 | PERFCOUNTER_HISTOGRAM | PERFCOUNTER_COUNTER, + PERFCOUNTER_U64 | PERFCOUNTER_HISTOGRAM | PERFCOUNTER_COUNTER, unit, unique_ptr>{new PerfHistogram<>{x_axis_config, y_axis_config}}); } void PerfCountersBuilder::add_impl( int idx, const char *name, - const char *description, const char *nick, int prio, int ty, + const char *description, const char *nick, int prio, int ty, int unit, unique_ptr> histogram) { assert(idx > m_perf_counters->m_lower_bound); @@ -546,6 +552,7 @@ void PerfCountersBuilder::add_impl( data.nick = nick; data.prio = prio ? prio : prio_default; data.type = (enum perfcounter_type_d)ty; + data.unit = (enum unit_t) unit; data.histogram = std::move(histogram); } diff --git a/src/common/perf_counters.h b/src/common/perf_counters.h index 846e407ad2f0..35cb55f2b890 100644 --- a/src/common/perf_counters.h +++ b/src/common/perf_counters.h @@ -41,6 +41,11 @@ enum perfcounter_type_d : uint8_t PERFCOUNTER_HISTOGRAM = 0x10, // histogram (vector) of values }; +enum unit_t : uint8_t +{ + BYTES, + NONE +}; /* Class for constructing a PerfCounters object. * @@ -73,15 +78,15 @@ public: }; void add_u64(int key, const char *name, const char *description=NULL, const char *nick = NULL, - int prio=0); + int prio=0, int unit=NONE); void add_u64_counter(int key, const char *name, const char *description=NULL, const char *nick = NULL, - int prio=0); + int prio=0, int unit=NONE); void add_u64_avg(int key, const char *name, const char *description=NULL, const char *nick = NULL, - int prio=0); + int prio=0, int unit=NONE); void add_time(int key, const char *name, const char *description=NULL, const char *nick = NULL, @@ -96,7 +101,7 @@ public: PerfHistogramCommon::axis_config_d y_axis_config, const char *description=NULL, const char* nick = NULL, - int prio=0); + int prio=0, int unit=NONE); void set_prio_default(int prio_) { @@ -108,7 +113,7 @@ private: PerfCountersBuilder(const PerfCountersBuilder &rhs); PerfCountersBuilder& operator=(const PerfCountersBuilder &rhs); void add_impl(int idx, const char *name, - const char *description, const char *nick, int prio, int ty, + const char *description, const char *nick, int prio, int ty, int unit=NONE, unique_ptr> histogram = nullptr); PerfCounters *m_perf_counters; @@ -150,14 +155,16 @@ public: : name(NULL), description(NULL), nick(NULL), - type(PERFCOUNTER_NONE) + type(PERFCOUNTER_NONE), + unit(NONE) {} perf_counter_data_any_d(const perf_counter_data_any_d& other) : name(other.name), description(other.description), nick(other.nick), - type(other.type), - u64(other.u64.load()) { + type(other.type), + unit(other.unit), + u64(other.u64.load()) { pair a = other.read_avg(); u64 = a.first; avgcount = a.second; @@ -172,6 +179,7 @@ public: const char *nick; uint8_t prio = 0; enum perfcounter_type_d type; + enum unit_t unit; std::atomic u64 = { 0 }; std::atomic avgcount = { 0 }; std::atomic avgcount2 = { 0 }; diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 3f64a8003b05..e92a17702012 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -373,25 +373,25 @@ struct C_InvalidateCache : public Context { plb.add_u64_counter(l_librbd_rd, "rd", "Reads", "r", perf_prio); plb.add_u64_counter(l_librbd_rd_bytes, "rd_bytes", "Data size in reads", - "rb", perf_prio); + "rb", perf_prio, unit_t(BYTES)); plb.add_time_avg(l_librbd_rd_latency, "rd_latency", "Latency of reads", "rl", perf_prio); plb.add_u64_counter(l_librbd_wr, "wr", "Writes", "w", perf_prio); plb.add_u64_counter(l_librbd_wr_bytes, "wr_bytes", "Written data", - "wb", perf_prio); + "wb", perf_prio, unit_t(BYTES)); plb.add_time_avg(l_librbd_wr_latency, "wr_latency", "Write latency", "wl", perf_prio); plb.add_u64_counter(l_librbd_discard, "discard", "Discards"); - plb.add_u64_counter(l_librbd_discard_bytes, "discard_bytes", "Discarded data"); + plb.add_u64_counter(l_librbd_discard_bytes, "discard_bytes", "Discarded data", NULL, 0, unit_t(BYTES)); plb.add_time_avg(l_librbd_discard_latency, "discard_latency", "Discard latency"); plb.add_u64_counter(l_librbd_flush, "flush", "Flushes"); plb.add_u64_counter(l_librbd_aio_flush, "aio_flush", "Async flushes"); plb.add_time_avg(l_librbd_aio_flush_latency, "aio_flush_latency", "Latency of async flushes"); plb.add_u64_counter(l_librbd_ws, "ws", "WriteSames"); - plb.add_u64_counter(l_librbd_ws_bytes, "ws_bytes", "WriteSame data"); + plb.add_u64_counter(l_librbd_ws_bytes, "ws_bytes", "WriteSame data", NULL, 0, unit_t(BYTES)); plb.add_time_avg(l_librbd_ws_latency, "ws_latency", "WriteSame latency"); plb.add_u64_counter(l_librbd_cmp, "cmp", "CompareAndWrites"); - plb.add_u64_counter(l_librbd_cmp_bytes, "cmp_bytes", "Data size in cmps"); + plb.add_u64_counter(l_librbd_cmp_bytes, "cmp_bytes", "Data size in cmps", NULL, 0, unit_t(BYTES)); plb.add_time_avg(l_librbd_cmp_latency, "cmp_latency", "Latency of cmps"); plb.add_u64_counter(l_librbd_snap_create, "snap_create", "Snap creations"); plb.add_u64_counter(l_librbd_snap_remove, "snap_remove", "Snap removals"); @@ -400,7 +400,7 @@ struct C_InvalidateCache : public Context { plb.add_u64_counter(l_librbd_notify, "notify", "Updated header notifications"); plb.add_u64_counter(l_librbd_resize, "resize", "Resizes"); plb.add_u64_counter(l_librbd_readahead, "readahead", "Read ahead"); - plb.add_u64_counter(l_librbd_readahead_bytes, "readahead_bytes", "Data size in read ahead"); + plb.add_u64_counter(l_librbd_readahead_bytes, "readahead_bytes", "Data size in read ahead", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_librbd_invalidate_cache, "invalidate_cache", "Cache invalidates"); plb.add_time(l_librbd_opened_time, "opened_time", "Opened time", diff --git a/src/messages/MMgrReport.h b/src/messages/MMgrReport.h index f6af6dfb86aa..e759f9b48780 100644 --- a/src/messages/MMgrReport.h +++ b/src/messages/MMgrReport.h @@ -34,25 +34,27 @@ public: // is "useful" so that mgr plugins filtering on prio will get some // data (albeit probably more than they wanted) uint8_t priority = PerfCountersBuilder::PRIO_USEFUL; + enum unit_t unit; void encode(bufferlist &bl) const { // TODO: decide whether to drop the per-type // encoding here, we could rely on the MgrReport // verisoning instead. - ENCODE_START(2, 1, bl); + ENCODE_START(3, 1, bl); ::encode(path, bl); ::encode(description, bl); ::encode(nick, bl); static_assert(sizeof(type) == 1, "perfcounter_type_d must be one byte"); ::encode((uint8_t)type, bl); ::encode(priority, bl); + ::encode((uint8_t)unit, bl); ENCODE_FINISH(bl); } void decode(bufferlist::iterator &p) { - DECODE_START(2, p); + DECODE_START(3, p); ::decode(path, p); ::decode(description, p); ::decode(nick, p); @@ -60,6 +62,9 @@ public: if (struct_v >= 2) { ::decode(priority, p); } + if (struct_v >= 3) { + ::decode((uint8_t&)unit, p); + } DECODE_FINISH(p); } }; diff --git a/src/mgr/ActivePyModules.cc b/src/mgr/ActivePyModules.cc index 0694d23082e4..0bd174c5d6a7 100644 --- a/src/mgr/ActivePyModules.cc +++ b/src/mgr/ActivePyModules.cc @@ -637,6 +637,7 @@ PyObject* ActivePyModules::get_perf_schema_python( } f.dump_unsigned("type", type.type); f.dump_unsigned("priority", type.priority); + f.dump_unsigned("units", type.unit); f.close_section(); } f.close_section(); diff --git a/src/mgr/MgrClient.cc b/src/mgr/MgrClient.cc index 5614e00d3a06..6c0a56663de8 100644 --- a/src/mgr/MgrClient.cc +++ b/src/mgr/MgrClient.cc @@ -279,7 +279,8 @@ void MgrClient::send_report() type.nick = data.nick; } type.type = data.type; - type.priority = perf_counters.get_adjusted_priority(data.prio); + type.priority = perf_counters.get_adjusted_priority(data.prio); + type.unit = data.unit; report->declare_types.push_back(std::move(type)); session->declared.insert(path); } diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 6348f44c97b8..da1fac90edd2 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -601,9 +601,9 @@ int Monitor::preinit() pcb.add_u64(l_cluster_num_osd_up, "num_osd_up", "OSDs that are up"); pcb.add_u64(l_cluster_num_osd_in, "num_osd_in", "OSD in state \"in\" (they are in cluster)"); pcb.add_u64(l_cluster_osd_epoch, "osd_epoch", "Current epoch of OSD map"); - pcb.add_u64(l_cluster_osd_bytes, "osd_bytes", "Total capacity of cluster"); - pcb.add_u64(l_cluster_osd_bytes_used, "osd_bytes_used", "Used space"); - pcb.add_u64(l_cluster_osd_bytes_avail, "osd_bytes_avail", "Available space"); + pcb.add_u64(l_cluster_osd_bytes, "osd_bytes", "Total capacity of cluster", NULL, 0, unit_t(BYTES)); + pcb.add_u64(l_cluster_osd_bytes_used, "osd_bytes_used", "Used space", NULL, 0, unit_t(BYTES)); + pcb.add_u64(l_cluster_osd_bytes_avail, "osd_bytes_avail", "Available space", NULL, 0, unit_t(BYTES)); pcb.add_u64(l_cluster_num_pool, "num_pool", "Pools"); pcb.add_u64(l_cluster_num_pg, "num_pg", "Placement groups"); pcb.add_u64(l_cluster_num_pg_active_clean, "num_pg_active_clean", "Placement groups in active+clean state"); diff --git a/src/mon/Paxos.cc b/src/mon/Paxos.cc index e92438769f08..3ad444c76fb5 100644 --- a/src/mon/Paxos.cc +++ b/src/mon/Paxos.cc @@ -98,17 +98,17 @@ void Paxos::init_logger() pcb.add_time_avg(l_paxos_refresh_latency, "refresh_latency", "Refresh latency"); pcb.add_u64_counter(l_paxos_begin, "begin", "Started and handled begins"); pcb.add_u64_avg(l_paxos_begin_keys, "begin_keys", "Keys in transaction on begin"); - pcb.add_u64_avg(l_paxos_begin_bytes, "begin_bytes", "Data in transaction on begin"); + pcb.add_u64_avg(l_paxos_begin_bytes, "begin_bytes", "Data in transaction on begin", NULL, 0, unit_t(BYTES)); pcb.add_time_avg(l_paxos_begin_latency, "begin_latency", "Latency of begin operation"); pcb.add_u64_counter(l_paxos_commit, "commit", "Commits", "cmt"); pcb.add_u64_avg(l_paxos_commit_keys, "commit_keys", "Keys in transaction on commit"); - pcb.add_u64_avg(l_paxos_commit_bytes, "commit_bytes", "Data in transaction on commit"); + pcb.add_u64_avg(l_paxos_commit_bytes, "commit_bytes", "Data in transaction on commit", NULL, 0, unit_t(BYTES)); pcb.add_time_avg(l_paxos_commit_latency, "commit_latency", "Commit latency", "clat"); pcb.add_u64_counter(l_paxos_collect, "collect", "Peon collects"); pcb.add_u64_avg(l_paxos_collect_keys, "collect_keys", "Keys in transaction on peon collect"); - pcb.add_u64_avg(l_paxos_collect_bytes, "collect_bytes", "Data in transaction on peon collect"); + pcb.add_u64_avg(l_paxos_collect_bytes, "collect_bytes", "Data in transaction on peon collect", NULL, 0, unit_t(BYTES)); pcb.add_time_avg(l_paxos_collect_latency, "collect_latency", "Peon collect latency"); pcb.add_u64_counter(l_paxos_collect_uncommitted, "collect_uncommitted", "Uncommitted values in started and handled collects"); pcb.add_u64_counter(l_paxos_collect_timeout, "collect_timeout", "Collect timeouts"); @@ -117,11 +117,11 @@ void Paxos::init_logger() pcb.add_u64_counter(l_paxos_lease_timeout, "lease_timeout", "Lease timeouts"); pcb.add_u64_counter(l_paxos_store_state, "store_state", "Store a shared state on disk"); pcb.add_u64_avg(l_paxos_store_state_keys, "store_state_keys", "Keys in transaction in stored state"); - pcb.add_u64_avg(l_paxos_store_state_bytes, "store_state_bytes", "Data in transaction in stored state"); + pcb.add_u64_avg(l_paxos_store_state_bytes, "store_state_bytes", "Data in transaction in stored state", NULL, 0, unit_t(BYTES)); pcb.add_time_avg(l_paxos_store_state_latency, "store_state_latency", "Storing state latency"); pcb.add_u64_counter(l_paxos_share_state, "share_state", "Sharings of state"); pcb.add_u64_avg(l_paxos_share_state_keys, "share_state_keys", "Keys in shared state"); - pcb.add_u64_avg(l_paxos_share_state_bytes, "share_state_bytes", "Data in shared state"); + pcb.add_u64_avg(l_paxos_share_state_bytes, "share_state_bytes", "Data in shared state", NULL, 0, unit_t(BYTES)); pcb.add_u64_counter(l_paxos_new_pn, "new_pn", "New proposal number queries"); pcb.add_time_avg(l_paxos_new_pn_latency, "new_pn_latency", "New proposal number getting latency"); logger = pcb.create_perf_counters(); diff --git a/src/msg/async/Stack.h b/src/msg/async/Stack.h index a201406016ef..104cd3cf3b96 100644 --- a/src/msg/async/Stack.h +++ b/src/msg/async/Stack.h @@ -229,8 +229,8 @@ class Worker { plb.add_u64_counter(l_msgr_recv_messages, "msgr_recv_messages", "Network received messages"); plb.add_u64_counter(l_msgr_send_messages, "msgr_send_messages", "Network sent messages"); - plb.add_u64_counter(l_msgr_recv_bytes, "msgr_recv_bytes", "Network received bytes"); - plb.add_u64_counter(l_msgr_send_bytes, "msgr_send_bytes", "Network sent bytes"); + plb.add_u64_counter(l_msgr_recv_bytes, "msgr_recv_bytes", "Network received bytes", NULL, 0, unit_t(BYTES)); + plb.add_u64_counter(l_msgr_send_bytes, "msgr_send_bytes", "Network sent bytes", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_msgr_active_connections, "msgr_active_connections", "Active connection number"); plb.add_u64_counter(l_msgr_created_connections, "msgr_created_connections", "Created connection number"); diff --git a/src/msg/async/dpdk/DPDK.cc b/src/msg/async/dpdk/DPDK.cc index 8da12c3fd35e..ad053c30ab15 100644 --- a/src/msg/async/dpdk/DPDK.cc +++ b/src/msg/async/dpdk/DPDK.cc @@ -633,16 +633,16 @@ DPDKQueuePair::DPDKQueuePair(CephContext *c, EventCenter *cen, DPDKDevice* dev, plb.add_u64_counter(l_dpdk_qp_tx_packets, "dpdk_send_packets", "DPDK sendd packets"); plb.add_u64_counter(l_dpdk_qp_rx_bad_checksum_errors, "dpdk_receive_bad_checksum_errors", "DPDK received bad checksum packets"); plb.add_u64_counter(l_dpdk_qp_rx_no_memory_errors, "dpdk_receive_no_memory_errors", "DPDK received no memory packets"); - plb.add_u64_counter(l_dpdk_qp_rx_bytes, "dpdk_receive_bytes", "DPDK received bytes"); - plb.add_u64_counter(l_dpdk_qp_tx_bytes, "dpdk_send_bytes", "DPDK sendd bytes"); + plb.add_u64_counter(l_dpdk_qp_rx_bytes, "dpdk_receive_bytes", "DPDK received bytes", NULL, 0, unit_t(BYTES)); + plb.add_u64_counter(l_dpdk_qp_tx_bytes, "dpdk_send_bytes", "DPDK sendd bytes", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_dpdk_qp_rx_last_bunch, "dpdk_receive_last_bunch", "DPDK last received bunch"); plb.add_u64_counter(l_dpdk_qp_tx_last_bunch, "dpdk_send_last_bunch", "DPDK last send bunch"); plb.add_u64_counter(l_dpdk_qp_rx_fragments, "dpdk_receive_fragments", "DPDK received total fragments"); plb.add_u64_counter(l_dpdk_qp_tx_fragments, "dpdk_send_fragments", "DPDK sendd total fragments"); plb.add_u64_counter(l_dpdk_qp_rx_copy_ops, "dpdk_receive_copy_ops", "DPDK received copy operations"); plb.add_u64_counter(l_dpdk_qp_tx_copy_ops, "dpdk_send_copy_ops", "DPDK sendd copy operations"); - plb.add_u64_counter(l_dpdk_qp_rx_copy_bytes, "dpdk_receive_copy_bytes", "DPDK received copy bytes"); - plb.add_u64_counter(l_dpdk_qp_tx_copy_bytes, "dpdk_send_copy_bytes", "DPDK send copy bytes"); + plb.add_u64_counter(l_dpdk_qp_rx_copy_bytes, "dpdk_receive_copy_bytes", "DPDK received copy bytes", NULL, 0, unit_t(BYTES)); + plb.add_u64_counter(l_dpdk_qp_tx_copy_bytes, "dpdk_send_copy_bytes", "DPDK send copy bytes", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_dpdk_qp_rx_linearize_ops, "dpdk_receive_linearize_ops", "DPDK received linearize operations"); plb.add_u64_counter(l_dpdk_qp_tx_linearize_ops, "dpdk_send_linearize_ops", "DPDK send linearize operations"); plb.add_u64_counter(l_dpdk_qp_tx_queue_length, "dpdk_send_queue_length", "DPDK send queue length"); diff --git a/src/msg/async/rdma/RDMAStack.cc b/src/msg/async/rdma/RDMAStack.cc index e16052f1dec2..d94185057797 100644 --- a/src/msg/async/rdma/RDMAStack.cc +++ b/src/msg/async/rdma/RDMAStack.cc @@ -414,9 +414,9 @@ RDMAWorker::RDMAWorker(CephContext *c, unsigned i) plb.add_u64_counter(l_msgr_rdma_rx_no_registered_mem, "rx_no_registered_mem", "The count of no registered buffer when receiving"); plb.add_u64_counter(l_msgr_rdma_tx_chunks, "tx_chunks", "The number of tx chunks transmitted"); - plb.add_u64_counter(l_msgr_rdma_tx_bytes, "tx_bytes", "The bytes of tx chunks transmitted"); + plb.add_u64_counter(l_msgr_rdma_tx_bytes, "tx_bytes", "The bytes of tx chunks transmitted", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_msgr_rdma_rx_chunks, "rx_chunks", "The number of rx chunks transmitted"); - plb.add_u64_counter(l_msgr_rdma_rx_bytes, "rx_bytes", "The bytes of rx chunks transmitted"); + plb.add_u64_counter(l_msgr_rdma_rx_bytes, "rx_bytes", "The bytes of rx chunks transmitted", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_msgr_rdma_pending_sent_conns, "pending_sent_conns", "The count of pending sent conns"); perf_logger = plb.create_perf_counters(); diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 8992761689bc..f090a83695b4 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -56,36 +56,36 @@ void BlueFS::_init_logger() PerfCountersBuilder b(cct, "bluefs", l_bluefs_first, l_bluefs_last); b.add_u64_counter(l_bluefs_gift_bytes, "gift_bytes", - "Bytes gifted from BlueStore"); + "Bytes gifted from BlueStore", NULL, 0, unit_t(BYTES)); b.add_u64_counter(l_bluefs_reclaim_bytes, "reclaim_bytes", - "Bytes reclaimed by BlueStore"); + "Bytes reclaimed by BlueStore", NULL, 0, unit_t(BYTES)); b.add_u64(l_bluefs_db_total_bytes, "db_total_bytes", "Total bytes (main db device)", - "b", PerfCountersBuilder::PRIO_USEFUL); + "b", PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); b.add_u64(l_bluefs_db_used_bytes, "db_used_bytes", "Used bytes (main db device)", - "u", PerfCountersBuilder::PRIO_USEFUL); + "u", PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); b.add_u64(l_bluefs_wal_total_bytes, "wal_total_bytes", "Total bytes (wal device)", - "walb", PerfCountersBuilder::PRIO_USEFUL); + "walb", PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); b.add_u64(l_bluefs_wal_used_bytes, "wal_used_bytes", "Used bytes (wal device)", - "walu", PerfCountersBuilder::PRIO_USEFUL); + "walu", PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); b.add_u64(l_bluefs_slow_total_bytes, "slow_total_bytes", "Total bytes (slow device)", - "slob", PerfCountersBuilder::PRIO_USEFUL); + "slob", PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); b.add_u64(l_bluefs_slow_used_bytes, "slow_used_bytes", "Used bytes (slow device)", - "slou", PerfCountersBuilder::PRIO_USEFUL); + "slou", PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); b.add_u64(l_bluefs_num_files, "num_files", "File count", "f", PerfCountersBuilder::PRIO_USEFUL); b.add_u64(l_bluefs_log_bytes, "log_bytes", "Size of the metadata log", - "jlen", PerfCountersBuilder::PRIO_INTERESTING); + "jlen", PerfCountersBuilder::PRIO_INTERESTING, unit_t(BYTES)); b.add_u64_counter(l_bluefs_log_compactions, "log_compactions", "Compactions of the metadata log"); b.add_u64_counter(l_bluefs_logged_bytes, "logged_bytes", "Bytes written to the metadata log", "j", - PerfCountersBuilder::PRIO_CRITICAL); + PerfCountersBuilder::PRIO_CRITICAL, unit_t(BYTES)); b.add_u64_counter(l_bluefs_files_written_wal, "files_written_wal", "Files written to WAL"); b.add_u64_counter(l_bluefs_files_written_sst, "files_written_sst", @@ -95,7 +95,7 @@ void BlueFS::_init_logger() PerfCountersBuilder::PRIO_CRITICAL); b.add_u64_counter(l_bluefs_bytes_written_sst, "bytes_written_sst", "Bytes written to SSTs", "sst", - PerfCountersBuilder::PRIO_CRITICAL); + PerfCountersBuilder::PRIO_CRITICAL, unit_t(BYTES)); logger = b.create_perf_counters(); cct->get_perfcounters_collection()->add(logger); } diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 6fdd11b170b2..20f13bfcb98a 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3884,11 +3884,11 @@ void BlueStore::_init_logger() b.add_u64_counter(l_bluestore_compress_rejected_count, "compress_rejected_count", "Sum for compress ops rejected due to low net gain of space"); b.add_u64_counter(l_bluestore_write_pad_bytes, "write_pad_bytes", - "Sum for write-op padded bytes"); + "Sum for write-op padded bytes", NULL, 0, unit_t(BYTES)); b.add_u64_counter(l_bluestore_deferred_write_ops, "deferred_write_ops", "Sum for deferred write op"); b.add_u64_counter(l_bluestore_deferred_write_bytes, "deferred_write_bytes", - "Sum for deferred write bytes", "def"); + "Sum for deferred write bytes", "def", 0, unit_t(BYTES)); b.add_u64_counter(l_bluestore_write_penalty_read_ops, "write_penalty_read_ops", "Sum for write penalty read ops"); b.add_u64(l_bluestore_allocated, "bluestore_allocated", @@ -3920,22 +3920,22 @@ void BlueStore::_init_logger() b.add_u64(l_bluestore_buffers, "bluestore_buffers", "Number of buffers in cache"); b.add_u64(l_bluestore_buffer_bytes, "bluestore_buffer_bytes", - "Number of buffer bytes in cache"); + "Number of buffer bytes in cache", NULL, 0, unit_t(BYTES)); b.add_u64(l_bluestore_buffer_hit_bytes, "bluestore_buffer_hit_bytes", - "Sum for bytes of read hit in the cache"); + "Sum for bytes of read hit in the cache", NULL, 0, unit_t(BYTES)); b.add_u64(l_bluestore_buffer_miss_bytes, "bluestore_buffer_miss_bytes", - "Sum for bytes of read missed in the cache"); + "Sum for bytes of read missed in the cache", NULL, 0, unit_t(BYTES)); b.add_u64_counter(l_bluestore_write_big, "bluestore_write_big", "Large aligned writes into fresh blobs"); b.add_u64_counter(l_bluestore_write_big_bytes, "bluestore_write_big_bytes", - "Large aligned writes into fresh blobs (bytes)"); + "Large aligned writes into fresh blobs (bytes)", NULL, 0, unit_t(BYTES)); b.add_u64_counter(l_bluestore_write_big_blobs, "bluestore_write_big_blobs", "Large aligned writes into fresh blobs (blobs)"); b.add_u64_counter(l_bluestore_write_small, "bluestore_write_small", "Small writes into existing or sparse small blobs"); b.add_u64_counter(l_bluestore_write_small_bytes, "bluestore_write_small_bytes", - "Small writes into existing or sparse small blobs (bytes)"); + "Small writes into existing or sparse small blobs (bytes)", NULL, 0, unit_t(BYTES)); b.add_u64_counter(l_bluestore_write_small_unused, "bluestore_write_small_unused", "Small writes into unused portion of existing blob"); diff --git a/src/os/filestore/WBThrottle.cc b/src/os/filestore/WBThrottle.cc index 71884445c76a..8930cd95a180 100644 --- a/src/os/filestore/WBThrottle.cc +++ b/src/os/filestore/WBThrottle.cc @@ -22,8 +22,8 @@ WBThrottle::WBThrottle(CephContext *cct) : PerfCountersBuilder b( cct, string("WBThrottle"), l_wbthrottle_first, l_wbthrottle_last); - b.add_u64(l_wbthrottle_bytes_dirtied, "bytes_dirtied", "Dirty data"); - b.add_u64(l_wbthrottle_bytes_wb, "bytes_wb", "Written data"); + b.add_u64(l_wbthrottle_bytes_dirtied, "bytes_dirtied", "Dirty data", NULL, 0, unit_t(BYTES)); + b.add_u64(l_wbthrottle_bytes_wb, "bytes_wb", "Written data", NULL, 0, unit_t(BYTES)); b.add_u64(l_wbthrottle_ios_dirtied, "ios_dirtied", "Dirty operations"); b.add_u64(l_wbthrottle_ios_wb, "ios_wb", "Written operations"); b.add_u64(l_wbthrottle_inodes_dirtied, "inodes_dirtied", "Entries waiting for write"); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 54fedcddcabf..8a631121b4ab 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3027,11 +3027,11 @@ void OSD::create_logger() osd_plb.add_u64_counter( l_osd_op_inb, "op_in_bytes", "Client operations total write size", - "wr", PerfCountersBuilder::PRIO_INTERESTING); + "wr", PerfCountersBuilder::PRIO_INTERESTING, unit_t(BYTES)); osd_plb.add_u64_counter( l_osd_op_outb, "op_out_bytes", "Client operations total read size", - "rd", PerfCountersBuilder::PRIO_INTERESTING); + "rd", PerfCountersBuilder::PRIO_INTERESTING, unit_t(BYTES)); osd_plb.add_time_avg( l_osd_op_lat, "op_latency", "Latency of client operations (including queue time)", @@ -3046,7 +3046,7 @@ void OSD::create_logger() osd_plb.add_u64_counter( l_osd_op_r, "op_r", "Client read operations"); osd_plb.add_u64_counter( - l_osd_op_r_outb, "op_r_out_bytes", "Client data read"); + l_osd_op_r_outb, "op_r_out_bytes", "Client data read", NULL, PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); osd_plb.add_time_avg( l_osd_op_r_lat, "op_r_latency", "Latency of read operation (including queue time)"); @@ -3082,10 +3082,10 @@ void OSD::create_logger() "Client read-modify-write operations"); osd_plb.add_u64_counter( l_osd_op_rw_inb, "op_rw_in_bytes", - "Client read-modify-write operations write in"); + "Client read-modify-write operations write in", NULL, PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); osd_plb.add_u64_counter( l_osd_op_rw_outb,"op_rw_out_bytes", - "Client read-modify-write operations read out "); + "Client read-modify-write operations read out ", NULL, PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); osd_plb.add_time_avg( l_osd_op_rw_lat, "op_rw_latency", "Latency of read-modify-write operation (including queue time)"); @@ -3116,12 +3116,12 @@ void OSD::create_logger() osd_plb.add_u64_counter( l_osd_sop, "subop", "Suboperations"); osd_plb.add_u64_counter( - l_osd_sop_inb, "subop_in_bytes", "Suboperations total size"); + l_osd_sop_inb, "subop_in_bytes", "Suboperations total size", NULL, 0, unit_t(BYTES)); osd_plb.add_time_avg(l_osd_sop_lat, "subop_latency", "Suboperations latency"); osd_plb.add_u64_counter(l_osd_sop_w, "subop_w", "Replicated writes"); osd_plb.add_u64_counter( - l_osd_sop_w_inb, "subop_w_in_bytes", "Replicated written data size"); + l_osd_sop_w_inb, "subop_w_in_bytes", "Replicated written data size", NULL, 0, unit_t(BYTES)); osd_plb.add_time_avg( l_osd_sop_w_lat, "subop_w_latency", "Replicated writes latency"); osd_plb.add_u64_counter( @@ -3131,13 +3131,13 @@ void OSD::create_logger() osd_plb.add_u64_counter( l_osd_sop_push, "subop_push", "Suboperations push messages"); osd_plb.add_u64_counter( - l_osd_sop_push_inb, "subop_push_in_bytes", "Suboperations pushed size"); + l_osd_sop_push_inb, "subop_push_in_bytes", "Suboperations pushed size", NULL, 0, unit_t(BYTES)); osd_plb.add_time_avg( l_osd_sop_push_lat, "subop_push_latency", "Suboperations push latency"); osd_plb.add_u64_counter(l_osd_pull, "pull", "Pull requests sent"); osd_plb.add_u64_counter(l_osd_push, "push", "Push messages sent"); - osd_plb.add_u64_counter(l_osd_push_outb, "push_out_bytes", "Pushed size"); + osd_plb.add_u64_counter(l_osd_push_outb, "push_out_bytes", "Pushed size", NULL, 0, unit_t(BYTES)); osd_plb.add_u64_counter( l_osd_rop, "recovery_ops", @@ -3145,8 +3145,8 @@ void OSD::create_logger() "rop", PerfCountersBuilder::PRIO_INTERESTING); osd_plb.add_u64(l_osd_loadavg, "loadavg", "CPU load"); - osd_plb.add_u64(l_osd_buf, "buffer_bytes", "Total allocated buffer size"); - osd_plb.add_u64(l_osd_history_alloc_bytes, "history_alloc_Mbytes"); + osd_plb.add_u64(l_osd_buf, "buffer_bytes", "Total allocated buffer size", NULL, 0, unit_t(BYTES)); + osd_plb.add_u64(l_osd_history_alloc_bytes, "history_alloc_Mbytes", NULL, 0, unit_t(BYTES)); osd_plb.add_u64(l_osd_history_alloc_num, "history_alloc_num"); osd_plb.add_u64( l_osd_cached_crc, "cached_crc", "Total number getting crc from crc_cache"); @@ -3200,11 +3200,11 @@ void OSD::create_logger() osd_plb.add_u64( l_osd_stat_bytes, "stat_bytes", "OSD size", "size", - PerfCountersBuilder::PRIO_USEFUL); + PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); osd_plb.add_u64( l_osd_stat_bytes_used, "stat_bytes_used", "Used space", "used", - PerfCountersBuilder::PRIO_USEFUL); - osd_plb.add_u64(l_osd_stat_bytes_avail, "stat_bytes_avail", "Available space"); + PerfCountersBuilder::PRIO_USEFUL, unit_t(BYTES)); + osd_plb.add_u64(l_osd_stat_bytes_avail, "stat_bytes_avail", "Available space", NULL, 0, unit_t(BYTES)); osd_plb.add_u64_counter( l_osd_copyfrom, "copyfrom", "Rados \"copy-from\" operations"); diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index bb974bed670f..eb8af99a716f 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -680,9 +680,9 @@ void ObjectCacher::perf_start() plb.add_u64_counter(l_objectcacher_cache_ops_miss, "cache_ops_miss", "Miss operations"); plb.add_u64_counter(l_objectcacher_cache_bytes_hit, - "cache_bytes_hit", "Hit data"); + "cache_bytes_hit", "Hit data", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_objectcacher_cache_bytes_miss, - "cache_bytes_miss", "Miss data"); + "cache_bytes_miss", "Miss data", NULL, 0, unit_t(BYTES)); plb.add_u64_counter(l_objectcacher_data_read, "data_read", "Read data"); plb.add_u64_counter(l_objectcacher_data_written, @@ -696,7 +696,7 @@ void ObjectCacher::perf_start() "Write operations, delayed due to dirty limits"); plb.add_u64_counter(l_objectcacher_write_bytes_blocked, "write_bytes_blocked", - "Write data blocked on dirty limit"); + "Write data blocked on dirty limit", NULL, 0, unit_t(BYTES)); plb.add_time(l_objectcacher_write_time_blocked, "write_time_blocked", "Time spent blocking a write due to dirty limits"); diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 4e99ec0bbbc2..c7851e91c8e5 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -246,7 +246,7 @@ void Objecter::init() PerfCountersBuilder::PRIO_CRITICAL); pcb.add_u64(l_osdc_op_laggy, "op_laggy", "Laggy operations"); pcb.add_u64_counter(l_osdc_op_send, "op_send", "Sent operations"); - pcb.add_u64_counter(l_osdc_op_send_bytes, "op_send_bytes", "Sent data"); + pcb.add_u64_counter(l_osdc_op_send_bytes, "op_send_bytes", "Sent data", NULL, 0, unit_t(BYTES)); pcb.add_u64_counter(l_osdc_op_resend, "op_resend", "Resent operations"); pcb.add_u64_counter(l_osdc_op_reply, "op_reply", "Operation reply"); diff --git a/src/pybind/mgr/dashboard/module.py b/src/pybind/mgr/dashboard/module.py index b993c54b0015..4ba9d38bc24b 100644 --- a/src/pybind/mgr/dashboard/module.py +++ b/src/pybind/mgr/dashboard/module.py @@ -738,6 +738,43 @@ class Module(MgrModule): def servers_data(self): return self._servers() + @cherrypy.expose + def perf_counters(self, service_type, service_id): + template = env.get_template("perf_counters.html") + toplevel_data = self._toplevel_data() + + return template.render( + url_prefix = global_instance().url_prefix, + ceph_version=global_instance().version, + path_info=cherrypy.request.path_info, + toplevel_data=json.dumps(toplevel_data, indent=2), + content_data=json.dumps(self.perf_counters_data(service_type, service_id), indent=2) + ) + + @cherrypy.expose + @cherrypy.tools.json_out() + def perf_counters_data(self, service_type, service_id): + schema = global_instance().get_perf_schema(service_type, str(service_id)).values()[0] + counters = [] + + for key, value in sorted(schema.items()): + counter = dict() + counter["name"] = str(key) + counter["description"] = value["description"] + if global_instance()._stattype_to_str(value["type"]) == 'counter': + counter["value"] = global_instance().get_rate(service_type, service_id, key) + counter["unit"] = global_instance()._unit_to_str(value["units"]) + else: + counter["value"] = global_instance().get_latest(service_type, service_id, key) + counter["unit"] = "" + counters.append(counter) + + return { + 'service_type': service_type, + 'service_id': service_id, + 'counters': counters, + } + def _health(self): # Fuse osdmap with pg_summary to get description of pools # including their PG states diff --git a/src/pybind/mgr/mgr_module.py b/src/pybind/mgr/mgr_module.py index c4049a30c8e5..343b6704400d 100644 --- a/src/pybind/mgr/mgr_module.py +++ b/src/pybind/mgr/mgr_module.py @@ -224,6 +224,10 @@ class MgrModule(ceph_module.BaseMgrModule): PERFCOUNTER_HISTOGRAM = 0x10 PERFCOUNTER_TYPE_MASK = ~3 + # units supported + BYTES = 0 + NONE = 1 + def __init__(self, module_name, py_modules_ptr, this_ptr): self.module_name = module_name @@ -325,6 +329,12 @@ class MgrModule(ceph_module.BaseMgrModule): else: return value + def _unit_to_str(self, unit): + if unit == self.NONE: + return "/s" + elif unit == self.BYTES: + return "B/s" + def get_server(self, hostname): """ Called by the plugin to load information about a particular diff --git a/src/test/perf_counters.cc b/src/test/perf_counters.cc index 182af5429add..362d11b89c95 100644 --- a/src/test/perf_counters.cc +++ b/src/test/perf_counters.cc @@ -182,7 +182,7 @@ TEST(PerfCounters, MultiplePerfCounters) { ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":13,\"element2\":0.000000000," "\"element3\":{\"avgcount\":0,\"sum\":0.000000000,\"avgtime\":0.000000000}}}"), msg); ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf schema\", \"format\": \"json\" }", &msg)); - ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":{\"type\":2,\"metric_type\":\"gauge\",\"value_type\":\"integer\",\"description\":\"\",\"nick\":\"\",\"priority\":0},\"element2\":{\"type\":1,\"metric_type\":\"gauge\",\"value_type\":\"real\",\"description\":\"\",\"nick\":\"\",\"priority\":0},\"element3\":{\"type\":5,\"metric_type\":\"gauge\",\"value_type\":\"real-integer-pair\",\"description\":\"\",\"nick\":\"\",\"priority\":0}}}"), msg); + ASSERT_EQ(sd("{\"test_perfcounter_1\":{\"element1\":{\"type\":2,\"metric_type\":\"gauge\",\"value_type\":\"integer\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"},\"element2\":{\"type\":1,\"metric_type\":\"gauge\",\"value_type\":\"real\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"},\"element3\":{\"type\":5,\"metric_type\":\"gauge\",\"value_type\":\"real-integer-pair\",\"description\":\"\",\"nick\":\"\",\"priority\":0,\"units\":\"none\"}}}"), msg); coll->clear(); ASSERT_EQ("", client.do_request("{ \"prefix\": \"perf dump\", \"format\": \"json\" }", &msg)); ASSERT_EQ("{}", msg);