#include "MgrClient.h"
+#include "common/perf_counters_key.h"
#include "mgr/MgrContext.h"
#include "mon/MonMap.h"
const PerfCounters::perf_counter_data_any_d &ctr,
const PerfCounters &perf_counters)
{
+ // FIXME: We don't send labeled perf counters to the mgr currently.
+ auto labels = ceph::perf_counters::key_labels(perf_counters.get_name());
+ if (labels.begin() != labels.end()) {
+ return false;
+ }
+
return perf_counters.get_adjusted_priority(ctr.prio) >= (int)stats_threshold;
};
}
if (session->declared.count(path) == 0) {
- ldout(cct,20) << " declare " << path << dendl;
- PerfCounterType type;
- type.path = path;
- if (data.description) {
- type.description = data.description;
- }
- if (data.nick) {
- type.nick = data.nick;
- }
- type.type = data.type;
- 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);
+ ldout(cct, 20) << " declare " << path << dendl;
+ PerfCounterType type;
+ type.path = path;
+ if (data.description) {
+ type.description = data.description;
+ }
+ if (data.nick) {
+ type.nick = data.nick;
+ }
+ type.type = data.type;
+ 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);
}
encode(static_cast<uint64_t>(data.u64), report->packed);
// Add labeled perfcounters
std::string labels = ceph::perf_counters::key_create(
- name_prefix, {{"id", std::to_string(id)}});
+ name_prefix, {{"id", std::to_string(id)}});
PerfCountersBuilder plb_labeled(
cct, labels, l_msgr_labeled_first,
l_msgr_labeled_last);
@EndpointDoc("Display Perf Counters",
responses={200: PERF_SCHEMA})
def list(self):
- return mgr.get_all_perf_counters()
+ return mgr.get_unlabeled_perf_counters()
}
def get_daemon_stats(self, now: str) -> Iterator[Dict[str, Any]]:
- for daemon, counters in self.get_all_perf_counters().items():
+ for daemon, counters in self.get_unlabeled_perf_counters().items():
svc_type, svc_id = daemon.split(".", 1)
metadata = self.get_metadata(svc_type, svc_id)
if metadata is not None:
@API.expose
@profile_method()
- def get_all_perf_counters(self, prio_limit: int = PRIO_USEFUL,
+ def get_unlabeled_perf_counters(self, prio_limit: int = PRIO_USEFUL,
services: Sequence[str] = ("mds", "mon", "osd",
"rbd-mirror", "rgw",
"tcmu-runner")) -> Dict[str, dict]:
"""
Get the perf counters for all daemons
"""
- for daemon, counters in self.get_all_perf_counters().items():
+ for daemon, counters in self.get_unlabeled_perf_counters().items():
for path, counter_info in counters.items():
# Skip histograms, they are represented by long running avgs
stattype = self._stattype_to_str(counter_info['type'])
- 'daemon' -- filter by daemon, accepts Python regexp
"""
- counters = context.instance.get_all_perf_counters()
+ counters = context.instance.get_unlabeled_perf_counters()
if 'daemon' in kwargs:
_re = re.compile(kwargs['daemon'])
}
def get_daemon_stats(self) -> Iterable[Dict[str, Any]]:
- for daemon, counters in self.get_all_perf_counters().items():
+ for daemon, counters in self.get_unlabeled_perf_counters().items():
svc_type, svc_id = daemon.split('.', 1)
metadata = self.get_metadata(svc_type, svc_id)
if not metadata:
return crashlist
def gather_perf_counters(self, mode: str = 'separated') -> Dict[str, dict]:
- # Extract perf counter data with get_all_perf_counters(), a method
+ # Extract perf counter data with get_unlabeled_perf_counters(), a method
# from mgr/mgr_module.py. This method returns a nested dictionary that
# looks a lot like perf schema, except with some additional fields.
#
# "value": 88814109
# },
# },
- all_perf_counters = self.get_all_perf_counters()
+ perf_counters = self.get_unlabeled_perf_counters()
# Initialize 'result' dict
result: Dict[str, dict] = defaultdict(lambda: defaultdict(
# 'separated' mode
anonymized_daemon_dict = {}
- for daemon, all_perf_counters_by_daemon in all_perf_counters.items():
+ for daemon, perf_counters_by_daemon in perf_counters.items():
daemon_type = daemon[0:3] # i.e. 'mds', 'osd', 'rgw'
if mode == 'separated':
else:
result[daemon_type]['num_combined_daemons'] += 1
- for collection in all_perf_counters_by_daemon:
+ for collection in perf_counters_by_daemon:
# Split the collection to avoid redundancy in final report; i.e.:
# bluestore.kv_flush_lat, bluestore.kv_final_lat -->
# bluestore: kv_flush_lat, kv_final_lat
if mode == 'separated':
# Add value to result
result[daemon][col_0][col_1]['value'] = \
- all_perf_counters_by_daemon[collection]['value']
+ perf_counters_by_daemon[collection]['value']
# Check that 'count' exists, as not all counters have a count field.
- if 'count' in all_perf_counters_by_daemon[collection]:
+ if 'count' in perf_counters_by_daemon[collection]:
result[daemon][col_0][col_1]['count'] = \
- all_perf_counters_by_daemon[collection]['count']
+ perf_counters_by_daemon[collection]['count']
elif mode == 'aggregated':
# Not every rgw daemon has the same schema. Specifically, each rgw daemon
# has a uniquely-named collection that starts off identically (i.e.
# the files are of type 'pair' (real-integer-pair, integer-integer pair).
# In those cases, the value is a dictionary, and not a number.
# i.e. throttle-msgr_dispatch_throttler-hbserver["wait"]
- if isinstance(all_perf_counters_by_daemon[collection]['value'], numbers.Number):
+ if isinstance(perf_counters_by_daemon[collection]['value'], numbers.Number):
result[daemon_type][col_0][col_1]['value'] += \
- all_perf_counters_by_daemon[collection]['value']
+ perf_counters_by_daemon[collection]['value']
# Check that 'count' exists, as not all counters have a count field.
- if 'count' in all_perf_counters_by_daemon[collection]:
+ if 'count' in perf_counters_by_daemon[collection]:
result[daemon_type][col_0][col_1]['count'] += \
- all_perf_counters_by_daemon[collection]['count']
+ perf_counters_by_daemon[collection]['count']
else:
self.log.error('Incorrect mode specified in gather_perf_counters: {}'.format(mode))
return {}