#include "msg/Message.h"
#include "common/perf_counters.h"
+#include "osd/OSDHealthMetric.h"
class PerfCounterType
{
std::string nick;
enum perfcounter_type_d type;
+ // For older clients that did not send priority, pretend everything
+ // 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;
+
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(1, 1, bl);
+ ENCODE_START(2, 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_FINISH(bl);
}
void decode(bufferlist::iterator &p)
{
- DECODE_START(1, p);
+ DECODE_START(2, p);
::decode(path, p);
::decode(description, p);
::decode(nick, p);
::decode((uint8_t&)type, p);
+ if (struct_v >= 2) {
+ ::decode(priority, p);
+ }
DECODE_FINISH(p);
}
};
class MMgrReport : public Message
{
- static const int HEAD_VERSION = 4;
+ static const int HEAD_VERSION = 5;
static const int COMPAT_VERSION = 1;
public:
// for service registration
boost::optional<std::map<std::string,std::string>> daemon_status;
+ std::vector<OSDHealthMetric> osd_health_metrics;
+
void decode_payload() override
{
bufferlist::iterator p = payload.begin();
::decode(service_name, p);
::decode(daemon_status, p);
}
+ if (header.version >= 5) {
+ ::decode(osd_health_metrics, p);
+ }
}
void encode_payload(uint64_t features) override {
::encode(undeclare_types, payload);
::encode(service_name, payload);
::encode(daemon_status, payload);
+ ::encode(osd_health_metrics, payload);
}
const char *get_type_name() const override { return "mgrreport"; }
if (daemon_status) {
out << " status=" << daemon_status->size();
}
+ if (!osd_health_metrics.empty()) {
+ out << " osd_metrics=" << osd_health_metrics.size();
+ }
out << ")";
}