From: Sage Weil Date: Tue, 28 Mar 2017 02:45:09 +0000 (-0400) Subject: common/perf_counters: allow priorities to be assigned to perf counters X-Git-Tag: v12.0.3~71^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6216f21395e6ef145f98b986785ec39560df2244;p=ceph.git common/perf_counters: allow priorities to be assigned to perf counters The idea is that higher priority counters can be surfaced by user tools automatically (e.g., 'ceph daemonperf') without enshrining knowledge in the tool of the internal workings of the daemon. Similarly, the tool may not know which counters are in use for a particular daemon (e.g., filestore vs bluestore). This requires a bit of discipline in the ceph code to use consistent priorities, but as long as developers are using the tools that consume the priorities (and I expect they will if we make the counters useful) we should converge on good values. Signed-off-by: Sage Weil --- diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index 0e8355ccde2b..404b39810e18 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -383,6 +383,9 @@ void PerfCounters::dump_formatted_generic(Formatter *f, bool schema, } else { f->dump_string("nick", ""); } + if (d->prio) { + f->dump_int("priority", d->prio); + } f->close_section(); } else { if (d->type & PERFCOUNTER_LONGRUNAVG) { @@ -453,48 +456,59 @@ PerfCountersBuilder::~PerfCountersBuilder() m_perf_counters = NULL; } -void PerfCountersBuilder::add_u64_counter(int idx, const char *name, - const char *description, const char *nick) +void PerfCountersBuilder::add_u64_counter( + int idx, const char *name, + const char *description, const char *nick, int prio) { - add_impl(idx, name, description, nick, PERFCOUNTER_U64 | PERFCOUNTER_COUNTER); + add_impl(idx, name, description, nick, prio, + PERFCOUNTER_U64 | PERFCOUNTER_COUNTER); } -void PerfCountersBuilder::add_u64(int idx, const char *name, - const char *description, const char *nick) +void PerfCountersBuilder::add_u64( + int idx, const char *name, + const char *description, const char *nick, int prio) { - add_impl(idx, name, description, nick, PERFCOUNTER_U64); + add_impl(idx, name, description, nick, prio, PERFCOUNTER_U64); } -void PerfCountersBuilder::add_u64_avg(int idx, const char *name, - const char *description, const char *nick) +void PerfCountersBuilder::add_u64_avg( + int idx, const char *name, + const char *description, const char *nick, int prio) { - add_impl(idx, name, description, nick, PERFCOUNTER_U64 | PERFCOUNTER_LONGRUNAVG); + add_impl(idx, name, description, nick, prio, + PERFCOUNTER_U64 | PERFCOUNTER_LONGRUNAVG); } -void PerfCountersBuilder::add_time(int idx, const char *name, - const char *description, const char *nick) +void PerfCountersBuilder::add_time( + int idx, const char *name, + const char *description, const char *nick, int prio) { - add_impl(idx, name, description, nick, PERFCOUNTER_TIME); + add_impl(idx, name, description, nick, prio, PERFCOUNTER_TIME); } -void PerfCountersBuilder::add_time_avg(int idx, const char *name, - const char *description, const char *nick) +void PerfCountersBuilder::add_time_avg( + int idx, const char *name, + const char *description, const char *nick, int prio) { - add_impl(idx, name, description, nick, PERFCOUNTER_TIME | PERFCOUNTER_LONGRUNAVG); + add_impl(idx, name, description, nick, prio, + PERFCOUNTER_TIME | PERFCOUNTER_LONGRUNAVG); } -void PerfCountersBuilder::add_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) +void PerfCountersBuilder::add_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) { - add_impl(idx, name, description, nick, PERFCOUNTER_U64 | PERFCOUNTER_HISTOGRAM, + add_impl(idx, name, description, nick, prio, + PERFCOUNTER_U64 | PERFCOUNTER_HISTOGRAM, 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 ty, - unique_ptr> histogram) +void PerfCountersBuilder::add_impl( + int idx, const char *name, + const char *description, const char *nick, int prio, int ty, + unique_ptr> histogram) { assert(idx > m_perf_counters->m_lower_bound); assert(idx < m_perf_counters->m_upper_bound); @@ -509,6 +523,7 @@ void PerfCountersBuilder::add_impl(int idx, const char *name, assert(strlen(nick) <= 4); } data.nick = nick; + data.prio = prio; data.type = (enum perfcounter_type_d)ty; data.histogram = std::move(histogram); } diff --git a/src/common/perf_counters.h b/src/common/perf_counters.h index 11b616c353d3..516667d18874 100644 --- a/src/common/perf_counters.h +++ b/src/common/perf_counters.h @@ -102,6 +102,7 @@ public: const char *name; const char *description; const char *nick; + int prio = 0; enum perfcounter_type_d type; atomic64_t u64; atomic64_t avgcount; @@ -282,26 +283,47 @@ public: PerfCountersBuilder(CephContext *cct, const std::string &name, int first, int last); ~PerfCountersBuilder(); + + // prio values: higher is better, and higher values get included in + // 'ceph daemonperf' (and similar) results. + enum { + PRIO_CRITICAL = 10, + PRIO_INTERESTING = 8, + PRIO_USEFUL = 5, + PRIO_UNINTERESTING = 2, + PRIO_DEBUGONLY = 0, + }; void add_u64(int key, const char *name, - const char *description=NULL, const char *nick = NULL); + const char *description=NULL, const char *nick = NULL, + int prio=0); void add_u64_counter(int key, const char *name, - const char *description=NULL, const char *nick = NULL); + const char *description=NULL, + const char *nick = NULL, + int prio=0); void add_u64_avg(int key, const char *name, - const char *description=NULL, const char *nick = NULL); + const char *description=NULL, + const char *nick = NULL, + int prio=0); void add_time(int key, const char *name, - const char *description=NULL, const char *nick = NULL); + const char *description=NULL, + const char *nick = NULL, + int prio=0); void add_time_avg(int key, const char *name, - const char *description=NULL, const char *nick = NULL); + const char *description=NULL, + const char *nick = NULL, + int prio=0); void add_histogram(int key, const char* name, - PerfHistogramCommon::axis_config_d x_axis_config, - PerfHistogramCommon::axis_config_d y_axis_config, - const char *description=NULL, const char* nick = NULL); + PerfHistogramCommon::axis_config_d x_axis_config, + PerfHistogramCommon::axis_config_d y_axis_config, + const char *description=NULL, + const char* nick = NULL, + int prio=0); PerfCounters* create_perf_counters(); 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 ty, + const char *description, const char *nick, int prio, int ty, unique_ptr> histogram = nullptr); PerfCounters *m_perf_counters;