#ifndef CEPH_MSG_ASYNC_STACK_H
#define CEPH_MSG_ASYNC_STACK_H
-#include "include/spinlock.h"
#include "common/perf_counters.h"
-#include "msg/msg_types.h"
+#include "common/perf_counters_key.h"
+#include "include/spinlock.h"
#include "msg/async/Event.h"
+#include "msg/msg_types.h"
+#include <string>
class Worker;
class ConnectedSocketImpl {
l_msgr_last,
};
+enum {
+ l_msgr_labeled_first = l_msgr_last + 1,
+
+ l_msgr_connection_ready_timeouts,
+ l_msgr_connection_idle_timeouts,
+
+ l_msgr_labeled_last,
+};
+
class Worker {
std::mutex init_lock;
std::condition_variable init_cond;
CephContext *cct;
PerfCounters *perf_logger;
+ PerfCounters *perf_labeled_logger;
unsigned id;
std::atomic_uint references;
Worker& operator=(const Worker&) = delete;
Worker(CephContext *c, unsigned worker_id)
- : cct(c), perf_logger(NULL), id(worker_id), references(0), center(c) {
+ : cct(c), id(worker_id), references(0), center(c) {
char name[128];
- sprintf(name, "AsyncMessenger::Worker-%u", id);
+ char name_prefix[] = "AsyncMessenger::Worker";
+ sprintf(name, "%s-%u", name_prefix, id);
+
// initialize perf_logger
PerfCountersBuilder plb(cct, name, l_msgr_first, l_msgr_last);
perf_logger = plb.create_perf_counters();
cct->get_perfcounters_collection()->add(perf_logger);
+
+ // Add labeled perfcounters
+ std::string labels = ceph::perf_counters::key_create(
+ name_prefix, {{"id", std::to_string(id)}});
+ PerfCountersBuilder plb_labeled(
+ cct, labels, l_msgr_labeled_first,
+ l_msgr_labeled_last);
+
+ plb_labeled.add_u64_counter(
+ l_msgr_connection_ready_timeouts, "msgr_connection_ready_timeouts",
+ "Number of not yet ready connections declared as dead", NULL,
+ PerfCountersBuilder::PRIO_USEFUL);
+ plb_labeled.add_u64_counter(
+ l_msgr_connection_idle_timeouts, "msgr_connection_idle_timeouts",
+ "Number of connections closed due to idleness", NULL,
+ PerfCountersBuilder::PRIO_USEFUL);
+
+ perf_labeled_logger = plb_labeled.create_perf_counters();
+ cct->get_perfcounters_collection()->add(perf_labeled_logger);
}
virtual ~Worker() {
if (perf_logger) {
cct->get_perfcounters_collection()->remove(perf_logger);
delete perf_logger;
}
+ if (perf_labeled_logger) {
+ cct->get_perfcounters_collection()->remove(perf_labeled_logger);
+ delete perf_labeled_logger;
+ }
}
virtual int listen(entity_addr_t &addr, unsigned addr_slot,
virtual void initialize() {}
PerfCounters *get_perf_counter() { return perf_logger; }
+ PerfCounters *get_labeled_perf_counter() { return perf_labeled_logger; }
void release_worker() {
int oldref = references.fetch_sub(1);
ceph_assert(oldref > 0);