CLIENT_METRIC_TYPE_OPENED_INODES,
CLIENT_METRIC_TYPE_READ_IO_SIZES,
CLIENT_METRIC_TYPE_WRITE_IO_SIZES,
+ CLIENT_METRIC_TYPE_AVG_READ_LATENCY,
+ CLIENT_METRIC_TYPE_STDEV_READ_LATENCY,
+ CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY,
+ CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY,
+ CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY,
+ CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,
};
inline std::ostream &operator<<(std::ostream &os, const ClientMetricType &type) {
switch(type) {
case ClientMetricType::CLIENT_METRIC_TYPE_WRITE_IO_SIZES:
os << "WRITE_IO_SIZES";
break;
+ case ClientMetricType::CLIENT_METRIC_TYPE_AVG_READ_LATENCY:
+ os << "AVG_READ_LATENCY";
+ break;
+ case ClientMetricType::CLIENT_METRIC_TYPE_STDEV_READ_LATENCY:
+ os << "STDEV_READ_LATENCY";
+ break;
+ case ClientMetricType::CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY:
+ os << "AVG_WRITE_LATENCY";
+ break;
+ case ClientMetricType::CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY:
+ os << "STDEV_WRITE_LATENCY";
+ break;
+ case ClientMetricType::CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY:
+ os << "AVG_METADATA_LATENCY";
+ break;
+ case ClientMetricType::CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY:
+ os << "STDEV_METADATA_LATENCY";
+ break;
default:
os << "(UNKNOWN:" << static_cast<std::underlying_type<ClientMetricType>::type>(type) << ")";
break;
struct ReadLatencyPayload : public ClientMetricPayloadBase {
utime_t lat;
+ utime_t mean;
+ uint64_t sq_sum; // sum of squares
+ uint64_t count; // IO count
ReadLatencyPayload()
: ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_READ_LATENCY) { }
- ReadLatencyPayload(utime_t lat)
- : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_READ_LATENCY), lat(lat) {
+ ReadLatencyPayload(utime_t lat, utime_t mean, uint64_t sq_sum, uint64_t count)
+ : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_READ_LATENCY),
+ lat(lat),
+ mean(mean),
+ sq_sum(sq_sum),
+ count(count) {
}
void encode(bufferlist &bl) const {
using ceph::encode;
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
encode(lat, bl);
+ encode(mean, bl);
+ encode(sq_sum, bl);
+ encode(count, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::const_iterator &iter) {
using ceph::decode;
- DECODE_START(1, iter);
+ DECODE_START(2, iter);
decode(lat, iter);
+ if (struct_v >= 2) {
+ decode(mean, iter);
+ decode(sq_sum, iter);
+ decode(count, iter);
+ }
DECODE_FINISH(iter);
}
void dump(Formatter *f) const {
f->dump_int("latency", lat);
+ f->dump_int("avg_latency", mean);
+ f->dump_unsigned("sq_sum", sq_sum);
+ f->dump_unsigned("count", count);
}
void print(std::ostream *out) const {
- *out << "latency: " << lat;
+ *out << "latency: " << lat << ", avg_latency: " << mean
+ << ", sq_sum: " << sq_sum << ", count=" << count;
}
};
struct WriteLatencyPayload : public ClientMetricPayloadBase {
utime_t lat;
+ utime_t mean;
+ uint64_t sq_sum; // sum of squares
+ uint64_t count; // IO count
WriteLatencyPayload()
: ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_WRITE_LATENCY) { }
- WriteLatencyPayload(utime_t lat)
- : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_WRITE_LATENCY), lat(lat) {
+ WriteLatencyPayload(utime_t lat, utime_t mean, uint64_t sq_sum, uint64_t count)
+ : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_WRITE_LATENCY),
+ lat(lat),
+ mean(mean),
+ sq_sum(sq_sum),
+ count(count){
}
void encode(bufferlist &bl) const {
using ceph::encode;
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
encode(lat, bl);
+ encode(mean, bl);
+ encode(sq_sum, bl);
+ encode(count, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::const_iterator &iter) {
using ceph::decode;
- DECODE_START(1, iter);
+ DECODE_START(2, iter);
decode(lat, iter);
+ if (struct_v >= 2) {
+ decode(mean, iter);
+ decode(sq_sum, iter);
+ decode(count, iter);
+ }
DECODE_FINISH(iter);
}
void dump(Formatter *f) const {
f->dump_int("latency", lat);
+ f->dump_int("avg_latency", mean);
+ f->dump_unsigned("sq_sum", sq_sum);
+ f->dump_unsigned("count", count);
}
void print(std::ostream *out) const {
- *out << "latency: " << lat;
+ *out << "latency: " << lat << ", avg_latency: " << mean
+ << ", sq_sum: " << sq_sum << ", count=" << count;
}
};
struct MetadataLatencyPayload : public ClientMetricPayloadBase {
utime_t lat;
+ utime_t mean;
+ uint64_t sq_sum; // sum of squares
+ uint64_t count; // IO count
MetadataLatencyPayload()
- : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY) { }
- MetadataLatencyPayload(utime_t lat)
- : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY), lat(lat) {
+ : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY) { }
+ MetadataLatencyPayload(utime_t lat, utime_t mean, uint64_t sq_sum, uint64_t count)
+ : ClientMetricPayloadBase(ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY),
+ lat(lat),
+ mean(mean),
+ sq_sum(sq_sum),
+ count(count) {
}
void encode(bufferlist &bl) const {
using ceph::encode;
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
encode(lat, bl);
+ encode(mean, bl);
+ encode(sq_sum, bl);
+ encode(count, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::const_iterator &iter) {
using ceph::decode;
- DECODE_START(1, iter);
+ DECODE_START(2, iter);
decode(lat, iter);
+ if (struct_v >= 2) {
+ decode(mean, iter);
+ decode(sq_sum, iter);
+ decode(count, iter);
+ }
DECODE_FINISH(iter);
}
void dump(Formatter *f) const {
f->dump_int("latency", lat);
+ f->dump_int("avg_latency", mean);
+ f->dump_unsigned("sq_sum", sq_sum);
+ f->dump_unsigned("count", count);
}
void print(std::ostream *out) const {
- *out << "latency: " << lat;
+ *out << "latency: " << lat << ", avg_latency: " << mean
+ << ", sq_sum: " << sq_sum << ", count=" << count;
}
};
struct ReadLatencyMetric {
utime_t lat;
+ utime_t mean;
+ uint64_t sq_sum;
+ uint64_t count;
bool updated = false;
DENC(ReadLatencyMetric, v, p) {
- DENC_START(2, 1, p);
+ DENC_START(3, 1, p);
denc(v.lat, p);
if (struct_v >= 2)
denc(v.updated, p);
+ if (struct_v >= 3) {
+ denc(v.mean, p);
+ denc(v.sq_sum, p);
+ denc(v.count, p);
+ }
DENC_FINISH(p);
}
void dump(Formatter *f) const {
f->dump_object("read_latency", lat);
+ f->dump_object("avg_read_alatency", mean);
+ f->dump_unsigned("sq_sum", sq_sum);
+ f->dump_unsigned("count", count);
}
friend std::ostream& operator<<(std::ostream& os, const ReadLatencyMetric &metric) {
- os << "{latency=" << metric.lat << "}";
+ os << "{latency=" << metric.lat << ", avg_latency=" << metric.mean
+ << ", sq_sum=" << metric.sq_sum << ", count=" << metric.count << "}";
return os;
}
};
struct WriteLatencyMetric {
utime_t lat;
+ utime_t mean;
+ uint64_t sq_sum;
+ uint64_t count;
bool updated = false;
DENC(WriteLatencyMetric, v, p) {
- DENC_START(2, 1, p);
+ DENC_START(3, 1, p);
denc(v.lat, p);
if (struct_v >= 2)
denc(v.updated, p);
+ if (struct_v >= 3) {
+ denc(v.mean, p);
+ denc(v.sq_sum, p);
+ denc(v.count, p);
+ }
DENC_FINISH(p);
}
void dump(Formatter *f) const {
f->dump_object("write_latency", lat);
+ f->dump_object("avg_write_alatency", mean);
+ f->dump_unsigned("sq_sum", sq_sum);
+ f->dump_unsigned("count", count);
}
friend std::ostream& operator<<(std::ostream& os, const WriteLatencyMetric &metric) {
- os << "{latency=" << metric.lat << "}";
+ os << "{latency=" << metric.lat << ", avg_latency=" << metric.mean
+ << ", sq_sum=" << metric.sq_sum << ", count=" << metric.count << "}";
return os;
}
};
struct MetadataLatencyMetric {
utime_t lat;
+ utime_t mean;
+ uint64_t sq_sum;
+ uint64_t count;
bool updated = false;
DENC(MetadataLatencyMetric, v, p) {
- DENC_START(2, 1, p);
+ DENC_START(3, 1, p);
denc(v.lat, p);
if (struct_v >= 2)
denc(v.updated, p);
+ if (struct_v >= 3) {
+ denc(v.mean, p);
+ denc(v.sq_sum, p);
+ denc(v.count, p);
+ }
DENC_FINISH(p);
}
void dump(Formatter *f) const {
f->dump_object("metadata_latency", lat);
+ f->dump_object("avg_metadata_alatency", mean);
+ f->dump_unsigned("sq_sum", sq_sum);
+ f->dump_unsigned("count", count);
}
friend std::ostream& operator<<(std::ostream& os, const MetadataLatencyMetric &metric) {
- os << "{latency=" << metric.lat << "}";
+ os << "{latency=" << metric.lat << ", avg_latency=" << metric.mean
+ << ", sq_sum=" << metric.sq_sum << ", count=" << metric.count << "}";
return os;
}
};
c->second = metrics.write_io_sizes_metric.total_size;
}
break;
+ case MDSPerformanceCounterType::AVG_READ_LATENCY_METRIC:
+ if (metrics.read_latency_metric.updated) {
+ c->first = metrics.read_latency_metric.mean.tv.tv_sec;
+ c->second = metrics.read_latency_metric.mean.tv.tv_nsec;
+ }
+ break;
+ case MDSPerformanceCounterType::STDEV_READ_LATENCY_METRIC:
+ if (metrics.read_latency_metric.updated) {
+ c->first = metrics.read_latency_metric.sq_sum;
+ c->second = metrics.read_latency_metric.count;
+ }
+ break;
+ case MDSPerformanceCounterType::AVG_WRITE_LATENCY_METRIC:
+ if (metrics.write_latency_metric.updated) {
+ c->first = metrics.write_latency_metric.mean.tv.tv_sec;
+ c->second = metrics.write_latency_metric.mean.tv.tv_nsec;
+ }
+ break;
+ case MDSPerformanceCounterType::STDEV_WRITE_LATENCY_METRIC:
+ if (metrics.write_latency_metric.updated) {
+ c->first = metrics.write_latency_metric.sq_sum;
+ c->second = metrics.write_latency_metric.count;
+ }
+ break;
+ case MDSPerformanceCounterType::AVG_METADATA_LATENCY_METRIC:
+ if (metrics.metadata_latency_metric.updated) {
+ c->first = metrics.metadata_latency_metric.mean.tv.tv_sec;
+ c->second = metrics.metadata_latency_metric.mean.tv.tv_nsec;
+ }
+ break;
+ case MDSPerformanceCounterType::STDEV_METADATA_LATENCY_METRIC:
+ if (metrics.metadata_latency_metric.updated) {
+ c->first = metrics.metadata_latency_metric.sq_sum;
+ c->second = metrics.metadata_latency_metric.count;
+ }
+ break;
default:
ceph_abort_msg("unknown counter type");
}
void MetricsHandler::handle_payload(Session *session, const ReadLatencyPayload &payload) {
dout(20) << ": type=" << payload.get_type()
- << ", session=" << session << ", latency=" << payload.lat << dendl;
+ << ", session=" << session << ", latency=" << payload.lat
+ << ", avg=" << payload.mean << ", sq_sum=" << payload.sq_sum
+ << ", count=" << payload.count << dendl;
auto it = client_metrics_map.find(session->info.inst);
if (it == client_metrics_map.end()) {
auto &metrics = it->second.second;
metrics.update_type = UPDATE_TYPE_REFRESH;
metrics.read_latency_metric.lat = payload.lat;
+ metrics.read_latency_metric.mean = payload.mean;
+ metrics.read_latency_metric.sq_sum = payload.sq_sum;
+ metrics.read_latency_metric.count = payload.count;
metrics.read_latency_metric.updated = true;
}
void MetricsHandler::handle_payload(Session *session, const WriteLatencyPayload &payload) {
dout(20) << ": type=" << payload.get_type()
- << ", session=" << session << ", latency=" << payload.lat << dendl;
+ << ", session=" << session << ", latency=" << payload.lat
+ << ", avg=" << payload.mean << ", sq_sum=" << payload.sq_sum
+ << ", count=" << payload.count << dendl;
auto it = client_metrics_map.find(session->info.inst);
if (it == client_metrics_map.end()) {
auto &metrics = it->second.second;
metrics.update_type = UPDATE_TYPE_REFRESH;
metrics.write_latency_metric.lat = payload.lat;
+ metrics.write_latency_metric.mean = payload.mean;
+ metrics.write_latency_metric.sq_sum = payload.sq_sum;
+ metrics.write_latency_metric.count = payload.count;
metrics.write_latency_metric.updated = true;
}
void MetricsHandler::handle_payload(Session *session, const MetadataLatencyPayload &payload) {
dout(20) << ": type=" << payload.get_type()
- << ", session=" << session << ", latency=" << payload.lat << dendl;
+ << ", session=" << session << ", latency=" << payload.lat
+ << ", avg=" << payload.mean << ", sq_sum=" << payload.sq_sum
+ << ", count=" << payload.count << dendl;
auto it = client_metrics_map.find(session->info.inst);
if (it == client_metrics_map.end()) {
auto &metrics = it->second.second;
metrics.update_type = UPDATE_TYPE_REFRESH;
metrics.metadata_latency_metric.lat = payload.lat;
+ metrics.metadata_latency_metric.mean = payload.mean;
+ metrics.metadata_latency_metric.sq_sum = payload.sq_sum;
+ metrics.metadata_latency_metric.count = payload.count;
metrics.metadata_latency_metric.updated = true;
}
{"opened_inodes", MDSPerformanceCounterType::OPENED_INODES_METRIC},
{"read_io_sizes", MDSPerformanceCounterType::READ_IO_SIZES_METRIC},
{"write_io_sizes", MDSPerformanceCounterType::WRITE_IO_SIZES_METRIC},
+ {"avg_read_latency", MDSPerformanceCounterType::AVG_READ_LATENCY_METRIC},
+ {"stdev_read_latency", MDSPerformanceCounterType::STDEV_READ_LATENCY_METRIC},
+ {"avg_write_latency", MDSPerformanceCounterType::AVG_WRITE_LATENCY_METRIC},
+ {"stdev_write_latency", MDSPerformanceCounterType::STDEV_WRITE_LATENCY_METRIC},
+ {"avg_metadata_latency", MDSPerformanceCounterType::AVG_METADATA_LATENCY_METRIC},
+ {"stdev_metadata_latency", MDSPerformanceCounterType::STDEV_METADATA_LATENCY_METRIC},
};
PyObject *py_query = nullptr;
case MDSPerformanceCounterType::OPENED_INODES_METRIC:
case MDSPerformanceCounterType::READ_IO_SIZES_METRIC:
case MDSPerformanceCounterType::WRITE_IO_SIZES_METRIC:
+ case MDSPerformanceCounterType::AVG_READ_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_READ_LATENCY_METRIC:
+ case MDSPerformanceCounterType::AVG_WRITE_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_WRITE_LATENCY_METRIC:
+ case MDSPerformanceCounterType::AVG_METADATA_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_METADATA_LATENCY_METRIC:
break;
default:
ceph_abort_msg("unknown counter type");
case MDSPerformanceCounterType::OPENED_INODES_METRIC:
case MDSPerformanceCounterType::READ_IO_SIZES_METRIC:
case MDSPerformanceCounterType::WRITE_IO_SIZES_METRIC:
+ case MDSPerformanceCounterType::AVG_READ_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_READ_LATENCY_METRIC:
+ case MDSPerformanceCounterType::AVG_WRITE_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_WRITE_LATENCY_METRIC:
+ case MDSPerformanceCounterType::AVG_METADATA_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_METADATA_LATENCY_METRIC:
break;
default:
ceph_abort_msg("unknown counter type");
case MDSPerformanceCounterType::WRITE_IO_SIZES_METRIC:
os << "write_io_sizes_metric";
break;
+ case MDSPerformanceCounterType::AVG_READ_LATENCY_METRIC:
+ os << "avg_read_latency";
+ break;
+ case MDSPerformanceCounterType::STDEV_READ_LATENCY_METRIC:
+ os << "stdev_read_latency";
+ break;
+ case MDSPerformanceCounterType::AVG_WRITE_LATENCY_METRIC:
+ os << "avg_write_latency";
+ break;
+ case MDSPerformanceCounterType::STDEV_WRITE_LATENCY_METRIC:
+ os << "stdev_write_latency";
+ break;
+ case MDSPerformanceCounterType::AVG_METADATA_LATENCY_METRIC:
+ os << "avg_metadata_latency";
+ break;
+ case MDSPerformanceCounterType::STDEV_METADATA_LATENCY_METRIC:
+ os << "stdev_metadata_latency";
+ break;
}
return os;
OPENED_INODES_METRIC = 7,
READ_IO_SIZES_METRIC = 8,
WRITE_IO_SIZES_METRIC = 9,
+ AVG_READ_LATENCY_METRIC = 10,
+ STDEV_READ_LATENCY_METRIC = 11,
+ AVG_WRITE_LATENCY_METRIC = 12,
+ STDEV_WRITE_LATENCY_METRIC = 13,
+ AVG_METADATA_LATENCY_METRIC = 14,
+ STDEV_METADATA_LATENCY_METRIC = 15,
};
struct MDSPerformanceCounterDescriptor {
case MDSPerformanceCounterType::OPENED_INODES_METRIC:
case MDSPerformanceCounterType::READ_IO_SIZES_METRIC:
case MDSPerformanceCounterType::WRITE_IO_SIZES_METRIC:
+ case MDSPerformanceCounterType::AVG_READ_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_READ_LATENCY_METRIC:
+ case MDSPerformanceCounterType::AVG_WRITE_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_WRITE_LATENCY_METRIC:
+ case MDSPerformanceCounterType::AVG_METADATA_LATENCY_METRIC:
+ case MDSPerformanceCounterType::STDEV_METADATA_LATENCY_METRIC:
return true;
default:
return false;