1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_INCLUDE_CEPHFS_METRICS_TYPES_H
5 #define CEPH_INCLUDE_CEPHFS_METRICS_TYPES_H
8 #include <boost/variant.hpp>
10 #include "common/Formatter.h"
11 #include "include/buffer_fwd.h"
12 #include "include/encoding.h"
13 #include "include/int_types.h"
14 #include "include/stringify.h"
15 #include "include/utime.h"
17 namespace ceph
{ class Formatter
; }
19 enum ClientMetricType
{
20 CLIENT_METRIC_TYPE_CAP_INFO
,
21 CLIENT_METRIC_TYPE_READ_LATENCY
,
22 CLIENT_METRIC_TYPE_WRITE_LATENCY
,
23 CLIENT_METRIC_TYPE_METADATA_LATENCY
,
24 CLIENT_METRIC_TYPE_DENTRY_LEASE
,
25 CLIENT_METRIC_TYPE_OPENED_FILES
,
26 CLIENT_METRIC_TYPE_PINNED_ICAPS
,
27 CLIENT_METRIC_TYPE_OPENED_INODES
,
29 inline std::ostream
&operator<<(std::ostream
&os
, const ClientMetricType
&type
) {
31 case ClientMetricType::CLIENT_METRIC_TYPE_CAP_INFO
:
34 case ClientMetricType::CLIENT_METRIC_TYPE_READ_LATENCY
:
37 case ClientMetricType::CLIENT_METRIC_TYPE_WRITE_LATENCY
:
38 os
<< "WRITE_LATENCY";
40 case ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY
:
41 os
<< "METADATA_LATENCY";
43 case ClientMetricType::CLIENT_METRIC_TYPE_DENTRY_LEASE
:
46 case ClientMetricType::CLIENT_METRIC_TYPE_OPENED_FILES
:
49 case ClientMetricType::CLIENT_METRIC_TYPE_PINNED_ICAPS
:
52 case ClientMetricType::CLIENT_METRIC_TYPE_OPENED_INODES
:
53 os
<< "OPENED_INODES";
62 struct CapInfoPayload
{
63 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_CAP_INFO
;
65 uint64_t cap_hits
= 0;
66 uint64_t cap_misses
= 0;
70 CapInfoPayload(uint64_t cap_hits
, uint64_t cap_misses
, uint64_t nr_caps
)
71 : cap_hits(cap_hits
), cap_misses(cap_misses
), nr_caps(nr_caps
) {
74 void encode(bufferlist
&bl
) const {
76 ENCODE_START(1, 1, bl
);
78 encode(cap_misses
, bl
);
83 void decode(bufferlist::const_iterator
&iter
) {
85 DECODE_START(1, iter
);
86 decode(cap_hits
, iter
);
87 decode(cap_misses
, iter
);
88 decode(nr_caps
, iter
);
92 void dump(Formatter
*f
) const {
93 f
->dump_int("cap_hits", cap_hits
);
94 f
->dump_int("cap_misses", cap_misses
);
95 f
->dump_int("num_caps", nr_caps
);
98 void print(ostream
*out
) const {
99 *out
<< "cap_hits: " << cap_hits
<< " "
100 << "cap_misses: " << cap_misses
<< " "
101 << "num_caps: " << nr_caps
;
105 struct ReadLatencyPayload
{
106 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_READ_LATENCY
;
110 ReadLatencyPayload() { }
111 ReadLatencyPayload(utime_t lat
)
115 void encode(bufferlist
&bl
) const {
117 ENCODE_START(1, 1, bl
);
122 void decode(bufferlist::const_iterator
&iter
) {
124 DECODE_START(1, iter
);
129 void dump(Formatter
*f
) const {
130 f
->dump_int("latency", lat
);
133 void print(ostream
*out
) const {
134 *out
<< "latency: " << lat
;
138 struct WriteLatencyPayload
{
139 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_WRITE_LATENCY
;
143 WriteLatencyPayload() { }
144 WriteLatencyPayload(utime_t lat
)
148 void encode(bufferlist
&bl
) const {
150 ENCODE_START(1, 1, bl
);
155 void decode(bufferlist::const_iterator
&iter
) {
157 DECODE_START(1, iter
);
162 void dump(Formatter
*f
) const {
163 f
->dump_int("latency", lat
);
166 void print(ostream
*out
) const {
167 *out
<< "latency: " << lat
;
171 struct MetadataLatencyPayload
{
172 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY
;
176 MetadataLatencyPayload() { }
177 MetadataLatencyPayload(utime_t lat
)
181 void encode(bufferlist
&bl
) const {
183 ENCODE_START(1, 1, bl
);
188 void decode(bufferlist::const_iterator
&iter
) {
190 DECODE_START(1, iter
);
195 void dump(Formatter
*f
) const {
196 f
->dump_int("latency", lat
);
199 void print(ostream
*out
) const {
200 *out
<< "latency: " << lat
;
204 struct DentryLeasePayload
{
205 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_DENTRY_LEASE
;
207 uint64_t dlease_hits
= 0;
208 uint64_t dlease_misses
= 0;
209 uint64_t nr_dentries
= 0;
211 DentryLeasePayload() { }
212 DentryLeasePayload(uint64_t dlease_hits
, uint64_t dlease_misses
, uint64_t nr_dentries
)
213 : dlease_hits(dlease_hits
), dlease_misses(dlease_misses
), nr_dentries(nr_dentries
) {
216 void encode(bufferlist
&bl
) const {
218 ENCODE_START(1, 1, bl
);
219 encode(dlease_hits
, bl
);
220 encode(dlease_misses
, bl
);
221 encode(nr_dentries
, bl
);
225 void decode(bufferlist::const_iterator
&iter
) {
227 DECODE_START(1, iter
);
228 decode(dlease_hits
, iter
);
229 decode(dlease_misses
, iter
);
230 decode(nr_dentries
, iter
);
234 void dump(Formatter
*f
) const {
235 f
->dump_int("dlease_hits", dlease_hits
);
236 f
->dump_int("dlease_misses", dlease_misses
);
237 f
->dump_int("num_dentries", nr_dentries
);
240 void print(ostream
*out
) const {
241 *out
<< "dlease_hits: " << dlease_hits
<< " "
242 << "dlease_misses: " << dlease_misses
<< " "
243 << "num_dentries: " << nr_dentries
;
247 struct OpenedFilesPayload
{
248 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_OPENED_FILES
;
250 uint64_t opened_files
= 0;
251 uint64_t total_inodes
= 0;
253 OpenedFilesPayload() { }
254 OpenedFilesPayload(uint64_t opened_files
, uint64_t total_inodes
)
255 : opened_files(opened_files
), total_inodes(total_inodes
) {
258 void encode(bufferlist
&bl
) const {
260 ENCODE_START(1, 1, bl
);
261 encode(opened_files
, bl
);
262 encode(total_inodes
, bl
);
266 void decode(bufferlist::const_iterator
&iter
) {
268 DECODE_START(1, iter
);
269 decode(opened_files
, iter
);
270 decode(total_inodes
, iter
);
274 void dump(Formatter
*f
) const {
275 f
->dump_int("opened_files", opened_files
);
276 f
->dump_int("total_inodes", total_inodes
);
279 void print(ostream
*out
) const {
280 *out
<< "opened_files: " << opened_files
<< " "
281 << "total_inodes: " << total_inodes
;
285 struct PinnedIcapsPayload
{
286 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_PINNED_ICAPS
;
288 uint64_t pinned_icaps
= 0;
289 uint64_t total_inodes
= 0;
291 PinnedIcapsPayload() { }
292 PinnedIcapsPayload(uint64_t pinned_icaps
, uint64_t total_inodes
)
293 : pinned_icaps(pinned_icaps
), total_inodes(total_inodes
) {
296 void encode(bufferlist
&bl
) const {
298 ENCODE_START(1, 1, bl
);
299 encode(pinned_icaps
, bl
);
300 encode(total_inodes
, bl
);
304 void decode(bufferlist::const_iterator
&iter
) {
306 DECODE_START(1, iter
);
307 decode(pinned_icaps
, iter
);
308 decode(total_inodes
, iter
);
312 void dump(Formatter
*f
) const {
313 f
->dump_int("pinned_icaps", pinned_icaps
);
314 f
->dump_int("total_inodes", total_inodes
);
317 void print(ostream
*out
) const {
318 *out
<< "pinned_icaps: " << pinned_icaps
<< " "
319 << "total_inodes: " << total_inodes
;
323 struct OpenedInodesPayload
{
324 static const ClientMetricType METRIC_TYPE
= ClientMetricType::CLIENT_METRIC_TYPE_OPENED_INODES
;
326 uint64_t opened_inodes
= 0;
327 uint64_t total_inodes
= 0;
329 OpenedInodesPayload() { }
330 OpenedInodesPayload(uint64_t opened_inodes
, uint64_t total_inodes
)
331 : opened_inodes(opened_inodes
), total_inodes(total_inodes
) {
334 void encode(bufferlist
&bl
) const {
336 ENCODE_START(1, 1, bl
);
337 encode(opened_inodes
, bl
);
338 encode(total_inodes
, bl
);
342 void decode(bufferlist::const_iterator
&iter
) {
344 DECODE_START(1, iter
);
345 decode(opened_inodes
, iter
);
346 decode(total_inodes
, iter
);
350 void dump(Formatter
*f
) const {
351 f
->dump_int("opened_inodes", opened_inodes
);
352 f
->dump_int("total_inodes", total_inodes
);
355 void print(ostream
*out
) const {
356 *out
<< "opened_inodes: " << opened_inodes
<< " "
357 << "total_inodes: " << total_inodes
;
361 struct UnknownPayload
{
362 static const ClientMetricType METRIC_TYPE
= static_cast<ClientMetricType
>(-1);
366 void encode(bufferlist
&bl
) const {
369 void decode(bufferlist::const_iterator
&iter
) {
371 DECODE_START(254, iter
);
372 iter
.seek(struct_len
);
376 void dump(Formatter
*f
) const {
379 void print(ostream
*out
) const {
383 typedef boost::variant
<CapInfoPayload
,
386 MetadataLatencyPayload
,
391 UnknownPayload
> ClientMetricPayload
;
393 // metric update message sent by clients
394 struct ClientMetricMessage
{
396 ClientMetricMessage(const ClientMetricPayload
&payload
= UnknownPayload())
400 class EncodePayloadVisitor
: public boost::static_visitor
<void> {
402 explicit EncodePayloadVisitor(bufferlist
&bl
) : m_bl(bl
) {
405 template <typename ClientMetricPayload
>
406 inline void operator()(const ClientMetricPayload
&payload
) const {
408 encode(static_cast<uint32_t>(ClientMetricPayload::METRIC_TYPE
), m_bl
);
409 payload
.encode(m_bl
);
416 class DecodePayloadVisitor
: public boost::static_visitor
<void> {
418 DecodePayloadVisitor(bufferlist::const_iterator
&iter
) : m_iter(iter
) {
421 template <typename ClientMetricPayload
>
422 inline void operator()(ClientMetricPayload
&payload
) const {
424 payload
.decode(m_iter
);
428 bufferlist::const_iterator
&m_iter
;
431 class DumpPayloadVisitor
: public boost::static_visitor
<void> {
433 explicit DumpPayloadVisitor(Formatter
*formatter
) : m_formatter(formatter
) {
436 template <typename ClientMetricPayload
>
437 inline void operator()(const ClientMetricPayload
&payload
) const {
438 ClientMetricType metric_type
= ClientMetricPayload::METRIC_TYPE
;
439 m_formatter
->dump_string("client_metric_type", stringify(metric_type
));
440 payload
.dump(m_formatter
);
444 Formatter
*m_formatter
;
447 class PrintPayloadVisitor
: public boost::static_visitor
<void> {
449 explicit PrintPayloadVisitor(ostream
*out
) : _out(out
) {
452 template <typename ClientMetricPayload
>
453 inline void operator()(const ClientMetricPayload
&payload
) const {
454 ClientMetricType metric_type
= ClientMetricPayload::METRIC_TYPE
;
455 *_out
<< "[client_metric_type: " << metric_type
;
464 void encode(bufferlist
&bl
) const {
465 boost::apply_visitor(EncodePayloadVisitor(bl
), payload
);
468 void decode(bufferlist::const_iterator
&iter
) {
471 uint32_t metric_type
;
472 decode(metric_type
, iter
);
474 switch (metric_type
) {
475 case ClientMetricType::CLIENT_METRIC_TYPE_CAP_INFO
:
476 payload
= CapInfoPayload();
478 case ClientMetricType::CLIENT_METRIC_TYPE_READ_LATENCY
:
479 payload
= ReadLatencyPayload();
481 case ClientMetricType::CLIENT_METRIC_TYPE_WRITE_LATENCY
:
482 payload
= WriteLatencyPayload();
484 case ClientMetricType::CLIENT_METRIC_TYPE_METADATA_LATENCY
:
485 payload
= MetadataLatencyPayload();
487 case ClientMetricType::CLIENT_METRIC_TYPE_DENTRY_LEASE
:
488 payload
= DentryLeasePayload();
490 case ClientMetricType::CLIENT_METRIC_TYPE_OPENED_FILES
:
491 payload
= OpenedFilesPayload();
493 case ClientMetricType::CLIENT_METRIC_TYPE_PINNED_ICAPS
:
494 payload
= PinnedIcapsPayload();
496 case ClientMetricType::CLIENT_METRIC_TYPE_OPENED_INODES
:
497 payload
= OpenedInodesPayload();
500 payload
= UnknownPayload();
504 boost::apply_visitor(DecodePayloadVisitor(iter
), payload
);
507 void dump(Formatter
*f
) const {
508 apply_visitor(DumpPayloadVisitor(f
), payload
);
511 void print(ostream
*out
) const {
512 apply_visitor(PrintPayloadVisitor(out
), payload
);
515 ClientMetricPayload payload
;
517 WRITE_CLASS_ENCODER(ClientMetricMessage
);
519 #endif // CEPH_INCLUDE_CEPHFS_METRICS_TYPES_H