#include <boost/optional.hpp>
#include "msg/Message.h"
+#include "mgr/MetricTypes.h"
#include "mgr/OSDPerfMetricTypes.h"
#include "common/perf_counters.h"
+#include "include/common_fwd.h"
#include "mgr/DaemonHealthMetric.h"
class PerfCounterType
uint8_t priority = PerfCountersBuilder::PRIO_USEFUL;
enum unit_t unit;
- void encode(bufferlist &bl) const
+ void encode(ceph::buffer::list &bl) const
{
// TODO: decide whether to drop the per-type
// encoding here, we could rely on the MgrReport
ENCODE_FINISH(bl);
}
- void decode(bufferlist::const_iterator &p)
+ void decode(ceph::buffer::list::const_iterator &p)
{
DECODE_START(3, p);
decode(path, p);
};
WRITE_CLASS_ENCODER(PerfCounterType)
-class MMgrReport : public MessageInstance<MMgrReport> {
-public:
- friend factory;
+class MMgrReport : public Message {
private:
-
- static constexpr int HEAD_VERSION = 7;
+ static constexpr int HEAD_VERSION = 9;
static constexpr int COMPAT_VERSION = 1;
public:
// Decode: iterate over the types we know about, sorted by idx,
// and use the current type's type to decide how to decode
- // the next bytes from the bufferlist.
- bufferlist packed;
+ // the next bytes from the ceph::buffer::list.
+ ceph::buffer::list packed;
std::string daemon_name;
std::string service_name; // optional; otherwise infer from entity type
// for service registration
boost::optional<std::map<std::string,std::string>> daemon_status;
+ boost::optional<std::map<std::string,std::string>> task_status;
std::vector<DaemonHealthMetric> daemon_health_metrics;
// encode map<string,map<int32_t,string>> of current config
- bufferlist config_bl;
+ ceph::buffer::list config_bl;
std::map<OSDPerfMetricQuery, OSDPerfMetricReport> osd_perf_metric_reports;
+ boost::optional<MetricReportMessage> metric_report_message;
+
void decode_payload() override
{
+ using ceph::decode;
auto p = payload.cbegin();
decode(daemon_name, p);
decode(declare_types, p);
if (header.version >= 7) {
decode(osd_perf_metric_reports, p);
}
+ if (header.version >= 8) {
+ decode(task_status, p);
+ }
+ if (header.version >= 9) {
+ decode(metric_report_message, p);
+ }
}
void encode_payload(uint64_t features) override {
encode(daemon_health_metrics, payload);
encode(config_bl, payload);
encode(osd_perf_metric_reports, payload);
+ encode(task_status, payload);
+ encode(metric_report_message, payload);
}
std::string_view get_type_name() const override { return "mgrreport"; }
- void print(ostream& out) const override {
+ void print(std::ostream& out) const override {
out << get_type_name() << "(";
if (service_name.length()) {
out << service_name;
if (!daemon_health_metrics.empty()) {
out << " daemon_metrics=" << daemon_health_metrics.size();
}
+ if (task_status) {
+ out << " task_status=" << task_status->size();
+ }
out << ")";
}
+private:
MMgrReport()
- : MessageInstance(MSG_MGR_REPORT, HEAD_VERSION, COMPAT_VERSION)
+ : Message{MSG_MGR_REPORT, HEAD_VERSION, COMPAT_VERSION}
{}
+ using RefCountedObject::put;
+ using RefCountedObject::get;
+ template<class T, typename... Args>
+ friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
};
#endif
-