static const std::string NAME_SUB_KEY_REGEX = "regex";
static const std::map<std::string, OSDPerfMetricSubKeyType> sub_key_types = {
{"client_id", OSDPerfMetricSubKeyType::CLIENT_ID},
+ {"client_address", OSDPerfMetricSubKeyType::CLIENT_ADDRESS},
{"pool_id", OSDPerfMetricSubKeyType::POOL_ID},
+ {"namespace", OSDPerfMetricSubKeyType::NAMESPACE},
+ {"osd_id", OSDPerfMetricSubKeyType::OSD_ID},
+ {"pg_id", OSDPerfMetricSubKeyType::PG_ID},
{"object_name", OSDPerfMetricSubKeyType::OBJECT_NAME},
+ {"snap_id", OSDPerfMetricSubKeyType::SNAP_ID},
};
static const std::map<std::string, PerformanceCounterType> counter_types = {
{"write_ops", PerformanceCounterType::WRITE_OPS},
case OSDPerfMetricSubKeyType::CLIENT_ID:
os << "client_id";
break;
+ case OSDPerfMetricSubKeyType::CLIENT_ADDRESS:
+ os << "client_address";
+ break;
case OSDPerfMetricSubKeyType::POOL_ID:
os << "pool_id";
break;
+ case OSDPerfMetricSubKeyType::NAMESPACE:
+ os << "namespace";
+ break;
+ case OSDPerfMetricSubKeyType::OSD_ID:
+ os << "osd_id";
+ break;
+ case OSDPerfMetricSubKeyType::PG_ID:
+ os << "pg_id";
+ break;
case OSDPerfMetricSubKeyType::OBJECT_NAME:
os << "object_name";
break;
+ case OSDPerfMetricSubKeyType::SNAP_ID:
+ os << "snap_id";
+ break;
default:
os << "unknown (" << static_cast<int>(d.type) << ")";
}
enum class OSDPerfMetricSubKeyType : uint8_t {
CLIENT_ID = 0,
- POOL_ID = 1,
- OBJECT_NAME = 2,
+ CLIENT_ADDRESS = 1,
+ POOL_ID = 2,
+ NAMESPACE = 3,
+ OSD_ID = 4,
+ PG_ID = 5,
+ OBJECT_NAME = 6,
+ SNAP_ID = 7,
};
struct OSDPerfMetricSubKeyDescriptor {
bool is_supported() const {
switch (type) {
case OSDPerfMetricSubKeyType::CLIENT_ID:
+ case OSDPerfMetricSubKeyType::CLIENT_ADDRESS:
case OSDPerfMetricSubKeyType::POOL_ID:
+ case OSDPerfMetricSubKeyType::NAMESPACE:
+ case OSDPerfMetricSubKeyType::OSD_ID:
+ case OSDPerfMetricSubKeyType::PG_ID:
case OSDPerfMetricSubKeyType::OBJECT_NAME:
+ case OSDPerfMetricSubKeyType::SNAP_ID:
return true;
default:
return false;
#include "messages/MOSDOp.h"
#include "mgr/OSDPerfMetricTypes.h"
+#include "osd/OSD.h"
#include "osd/OpRequest.h"
class DynamicPerfStats {
return !data.empty();
}
- void add(const OpRequest& op, uint64_t inb, uint64_t outb,
- const utime_t &latency) {
+ void add(const OSDService *osd, const pg_info_t &pg_info, const OpRequest& op,
+ uint64_t inb, uint64_t outb, const utime_t &latency) {
auto update_counter_fnc =
[&op, inb, outb, &latency](const PerformanceCounterDescriptor &d,
};
auto get_subkey_fnc =
- [&op](const OSDPerfMetricSubKeyDescriptor &d,
- OSDPerfMetricSubKey *sub_key) {
+ [&osd, &pg_info, &op](const OSDPerfMetricSubKeyDescriptor &d,
+ OSDPerfMetricSubKey *sub_key) {
ceph_assert(d.is_supported());
auto m = static_cast<const MOSDOp*>(op.get_req());
case OSDPerfMetricSubKeyType::CLIENT_ID:
match_string = stringify(m->get_reqid().name);
break;
+ case OSDPerfMetricSubKeyType::CLIENT_ADDRESS:
+ match_string = stringify(m->get_connection()->get_peer_addr());
+ break;
case OSDPerfMetricSubKeyType::POOL_ID:
match_string = stringify(m->get_spg().pool());
break;
+ case OSDPerfMetricSubKeyType::NAMESPACE:
+ match_string = m->get_hobj().nspace;
+ break;
+ case OSDPerfMetricSubKeyType::OSD_ID:
+ match_string = stringify(osd->get_nodeid());
+ break;
+ case OSDPerfMetricSubKeyType::PG_ID:
+ match_string = stringify(pg_info.pgid);
+ break;
case OSDPerfMetricSubKeyType::OBJECT_NAME:
match_string = m->get_oid().name;
break;
+ case OSDPerfMetricSubKeyType::SNAP_ID:
+ match_string = stringify(m->get_snapid());
+ break;
default:
ceph_abort_msg("unknown counter type");
}
<< " lat " << latency << dendl;
if (m_dynamic_perf_stats.is_enabled()) {
- m_dynamic_perf_stats.add(op, inb, outb, latency);
+ m_dynamic_perf_stats.add(osd, info, op, inb, outb, latency);
}
}
],
}
- Valid subkey types: 'client_id', 'pool_id', 'object_name'
+ Valid subkey types:
+ 'client_id', 'client_address', 'pool_id', 'namespace', 'osd_id',
+ 'pg_id', 'object_name', 'snap_id'
Valid performance counter types:
'write_ops', 'read_ops', 'write_bytes', 'read_bytes',
'write_latency', 'read_latency'