1f9009efaSXiubo Li /* SPDX-License-Identifier: GPL-2.0 */
2f9009efaSXiubo Li #ifndef _FS_CEPH_MDS_METRIC_H
3f9009efaSXiubo Li #define _FS_CEPH_MDS_METRIC_H
4f9009efaSXiubo Li
58d728c76SVenky Shankar #include <linux/ceph/types.h>
6f9009efaSXiubo Li #include <linux/percpu_counter.h>
797e27aaaSXiubo Li #include <linux/ktime.h>
8f9009efaSXiubo Li
918f473b3SXiubo Li extern bool disable_send_metrics;
1018f473b3SXiubo Li
1118f473b3SXiubo Li enum ceph_metric_type {
1218f473b3SXiubo Li CLIENT_METRIC_TYPE_CAP_INFO,
1318f473b3SXiubo Li CLIENT_METRIC_TYPE_READ_LATENCY,
1418f473b3SXiubo Li CLIENT_METRIC_TYPE_WRITE_LATENCY,
1518f473b3SXiubo Li CLIENT_METRIC_TYPE_METADATA_LATENCY,
1618f473b3SXiubo Li CLIENT_METRIC_TYPE_DENTRY_LEASE,
173d8b6987SXiubo Li CLIENT_METRIC_TYPE_OPENED_FILES,
183d8b6987SXiubo Li CLIENT_METRIC_TYPE_PINNED_ICAPS,
193d8b6987SXiubo Li CLIENT_METRIC_TYPE_OPENED_INODES,
20903f4fecSXiubo Li CLIENT_METRIC_TYPE_READ_IO_SIZES,
21903f4fecSXiubo Li CLIENT_METRIC_TYPE_WRITE_IO_SIZES,
22*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_AVG_READ_LATENCY,
23*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_STDEV_READ_LATENCY,
24*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY,
25*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY,
26*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY,
27*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,
2818f473b3SXiubo Li
29*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_MAX = CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY,
3018f473b3SXiubo Li };
3118f473b3SXiubo Li
323b4168ddSXiubo Li /*
333b4168ddSXiubo Li * This will always have the highest metric bit value
343b4168ddSXiubo Li * as the last element of the array.
353b4168ddSXiubo Li */
363b4168ddSXiubo Li #define CEPHFS_METRIC_SPEC_CLIENT_SUPPORTED { \
373b4168ddSXiubo Li CLIENT_METRIC_TYPE_CAP_INFO, \
383b4168ddSXiubo Li CLIENT_METRIC_TYPE_READ_LATENCY, \
393b4168ddSXiubo Li CLIENT_METRIC_TYPE_WRITE_LATENCY, \
403b4168ddSXiubo Li CLIENT_METRIC_TYPE_METADATA_LATENCY, \
418ba3b8c7SXiubo Li CLIENT_METRIC_TYPE_DENTRY_LEASE, \
423d8b6987SXiubo Li CLIENT_METRIC_TYPE_OPENED_FILES, \
433d8b6987SXiubo Li CLIENT_METRIC_TYPE_PINNED_ICAPS, \
443d8b6987SXiubo Li CLIENT_METRIC_TYPE_OPENED_INODES, \
45903f4fecSXiubo Li CLIENT_METRIC_TYPE_READ_IO_SIZES, \
46903f4fecSXiubo Li CLIENT_METRIC_TYPE_WRITE_IO_SIZES, \
47*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_AVG_READ_LATENCY, \
48*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_STDEV_READ_LATENCY, \
49*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_AVG_WRITE_LATENCY, \
50*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_STDEV_WRITE_LATENCY, \
51*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_AVG_METADATA_LATENCY, \
52*54d7b821SVenky Shankar CLIENT_METRIC_TYPE_STDEV_METADATA_LATENCY, \
533b4168ddSXiubo Li \
543b4168ddSXiubo Li CLIENT_METRIC_TYPE_MAX, \
553b4168ddSXiubo Li }
563b4168ddSXiubo Li
578ecd34c7SXiubo Li struct ceph_metric_header {
5818f473b3SXiubo Li __le32 type; /* ceph metric type */
5918f473b3SXiubo Li __u8 ver;
6018f473b3SXiubo Li __u8 compat;
6118f473b3SXiubo Li __le32 data_len; /* length of sizeof(hit + mis + total) */
628ecd34c7SXiubo Li } __packed;
638ecd34c7SXiubo Li
648ecd34c7SXiubo Li /* metric caps header */
658ecd34c7SXiubo Li struct ceph_metric_cap {
668ecd34c7SXiubo Li struct ceph_metric_header header;
6718f473b3SXiubo Li __le64 hit;
6818f473b3SXiubo Li __le64 mis;
6918f473b3SXiubo Li __le64 total;
7018f473b3SXiubo Li } __packed;
7118f473b3SXiubo Li
7218f473b3SXiubo Li /* metric read latency header */
7318f473b3SXiubo Li struct ceph_metric_read_latency {
748ecd34c7SXiubo Li struct ceph_metric_header header;
758d728c76SVenky Shankar struct ceph_timespec lat;
76*54d7b821SVenky Shankar struct ceph_timespec avg;
77*54d7b821SVenky Shankar __le64 sq_sum;
78*54d7b821SVenky Shankar __le64 count;
7918f473b3SXiubo Li } __packed;
8018f473b3SXiubo Li
8118f473b3SXiubo Li /* metric write latency header */
8218f473b3SXiubo Li struct ceph_metric_write_latency {
838ecd34c7SXiubo Li struct ceph_metric_header header;
848d728c76SVenky Shankar struct ceph_timespec lat;
85*54d7b821SVenky Shankar struct ceph_timespec avg;
86*54d7b821SVenky Shankar __le64 sq_sum;
87*54d7b821SVenky Shankar __le64 count;
8818f473b3SXiubo Li } __packed;
8918f473b3SXiubo Li
9018f473b3SXiubo Li /* metric metadata latency header */
9118f473b3SXiubo Li struct ceph_metric_metadata_latency {
928ecd34c7SXiubo Li struct ceph_metric_header header;
938d728c76SVenky Shankar struct ceph_timespec lat;
94*54d7b821SVenky Shankar struct ceph_timespec avg;
95*54d7b821SVenky Shankar __le64 sq_sum;
96*54d7b821SVenky Shankar __le64 count;
9718f473b3SXiubo Li } __packed;
9818f473b3SXiubo Li
998ba3b8c7SXiubo Li /* metric dentry lease header */
1008ba3b8c7SXiubo Li struct ceph_metric_dlease {
1018ecd34c7SXiubo Li struct ceph_metric_header header;
1028ba3b8c7SXiubo Li __le64 hit;
1038ba3b8c7SXiubo Li __le64 mis;
1048ba3b8c7SXiubo Li __le64 total;
1058ba3b8c7SXiubo Li } __packed;
1068ba3b8c7SXiubo Li
1073d8b6987SXiubo Li /* metric opened files header */
1083d8b6987SXiubo Li struct ceph_opened_files {
1098ecd34c7SXiubo Li struct ceph_metric_header header;
1103d8b6987SXiubo Li __le64 opened_files;
1113d8b6987SXiubo Li __le64 total;
1123d8b6987SXiubo Li } __packed;
1133d8b6987SXiubo Li
1143d8b6987SXiubo Li /* metric pinned i_caps header */
1153d8b6987SXiubo Li struct ceph_pinned_icaps {
1168ecd34c7SXiubo Li struct ceph_metric_header header;
1173d8b6987SXiubo Li __le64 pinned_icaps;
1183d8b6987SXiubo Li __le64 total;
1193d8b6987SXiubo Li } __packed;
1203d8b6987SXiubo Li
1213d8b6987SXiubo Li /* metric opened inodes header */
1223d8b6987SXiubo Li struct ceph_opened_inodes {
1238ecd34c7SXiubo Li struct ceph_metric_header header;
1243d8b6987SXiubo Li __le64 opened_inodes;
1253d8b6987SXiubo Li __le64 total;
1263d8b6987SXiubo Li } __packed;
1273d8b6987SXiubo Li
128903f4fecSXiubo Li /* metric read io size header */
129903f4fecSXiubo Li struct ceph_read_io_size {
130903f4fecSXiubo Li struct ceph_metric_header header;
131903f4fecSXiubo Li __le64 total_ops;
132903f4fecSXiubo Li __le64 total_size;
133903f4fecSXiubo Li } __packed;
134903f4fecSXiubo Li
135903f4fecSXiubo Li /* metric write io size header */
136903f4fecSXiubo Li struct ceph_write_io_size {
137903f4fecSXiubo Li struct ceph_metric_header header;
138903f4fecSXiubo Li __le64 total_ops;
139903f4fecSXiubo Li __le64 total_size;
140903f4fecSXiubo Li } __packed;
141903f4fecSXiubo Li
14218f473b3SXiubo Li struct ceph_metric_head {
14318f473b3SXiubo Li __le32 num; /* the number of metrics that will be sent */
14418f473b3SXiubo Li } __packed;
14518f473b3SXiubo Li
14617e9fc9fSLuís Henriques enum metric_type {
14717e9fc9fSLuís Henriques METRIC_READ,
14817e9fc9fSLuís Henriques METRIC_WRITE,
14917e9fc9fSLuís Henriques METRIC_METADATA,
150c02cb7bdSLuís Henriques METRIC_COPYFROM,
15117e9fc9fSLuís Henriques METRIC_MAX
15217e9fc9fSLuís Henriques };
15317e9fc9fSLuís Henriques
15417e9fc9fSLuís Henriques struct ceph_metric {
15517e9fc9fSLuís Henriques spinlock_t lock;
15617e9fc9fSLuís Henriques u64 total;
15717e9fc9fSLuís Henriques u64 size_sum;
15817e9fc9fSLuís Henriques u64 size_min;
15917e9fc9fSLuís Henriques u64 size_max;
16017e9fc9fSLuís Henriques ktime_t latency_sum;
161367290e6SVenky Shankar ktime_t latency_avg;
16217e9fc9fSLuís Henriques ktime_t latency_sq_sum;
16317e9fc9fSLuís Henriques ktime_t latency_min;
16417e9fc9fSLuís Henriques ktime_t latency_max;
16517e9fc9fSLuís Henriques };
16617e9fc9fSLuís Henriques
167f9009efaSXiubo Li /* This is the global metrics */
168f9009efaSXiubo Li struct ceph_client_metric {
169f9009efaSXiubo Li atomic64_t total_dentries;
170f9009efaSXiubo Li struct percpu_counter d_lease_hit;
171f9009efaSXiubo Li struct percpu_counter d_lease_mis;
1721af16d54SXiubo Li
1734f1d756dSXiubo Li atomic64_t total_caps;
1741af16d54SXiubo Li struct percpu_counter i_caps_hit;
1751af16d54SXiubo Li struct percpu_counter i_caps_mis;
17697e27aaaSXiubo Li
17717e9fc9fSLuís Henriques struct ceph_metric metric[METRIC_MAX];
17818f473b3SXiubo Li
1791dd8d470SXiubo Li /* The total number of directories and files that are opened */
1801dd8d470SXiubo Li atomic64_t opened_files;
1811dd8d470SXiubo Li
1821dd8d470SXiubo Li /* The total number of inodes that have opened files or directories */
1831dd8d470SXiubo Li struct percpu_counter opened_inodes;
1841dd8d470SXiubo Li struct percpu_counter total_inodes;
1851dd8d470SXiubo Li
18618f473b3SXiubo Li struct ceph_mds_session *session;
18718f473b3SXiubo Li struct delayed_work delayed_work; /* delayed work */
188f9009efaSXiubo Li };
189f9009efaSXiubo Li
metric_schedule_delayed(struct ceph_client_metric * m)19018f473b3SXiubo Li static inline void metric_schedule_delayed(struct ceph_client_metric *m)
19118f473b3SXiubo Li {
19218f473b3SXiubo Li if (disable_send_metrics)
19318f473b3SXiubo Li return;
19418f473b3SXiubo Li
19518f473b3SXiubo Li /* per second */
19618f473b3SXiubo Li schedule_delayed_work(&m->delayed_work, round_jiffies_relative(HZ));
19718f473b3SXiubo Li }
19818f473b3SXiubo Li
199f9009efaSXiubo Li extern int ceph_metric_init(struct ceph_client_metric *m);
200f9009efaSXiubo Li extern void ceph_metric_destroy(struct ceph_client_metric *m);
2011af16d54SXiubo Li
ceph_update_cap_hit(struct ceph_client_metric * m)2021af16d54SXiubo Li static inline void ceph_update_cap_hit(struct ceph_client_metric *m)
2031af16d54SXiubo Li {
2041af16d54SXiubo Li percpu_counter_inc(&m->i_caps_hit);
2051af16d54SXiubo Li }
2061af16d54SXiubo Li
ceph_update_cap_mis(struct ceph_client_metric * m)2071af16d54SXiubo Li static inline void ceph_update_cap_mis(struct ceph_client_metric *m)
2081af16d54SXiubo Li {
2091af16d54SXiubo Li percpu_counter_inc(&m->i_caps_mis);
2101af16d54SXiubo Li }
21197e27aaaSXiubo Li
21217e9fc9fSLuís Henriques extern void ceph_update_metrics(struct ceph_metric *m,
21397e27aaaSXiubo Li ktime_t r_start, ktime_t r_end,
214903f4fecSXiubo Li unsigned int size, int rc);
21517e9fc9fSLuís Henriques
ceph_update_read_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,unsigned int size,int rc)21617e9fc9fSLuís Henriques static inline void ceph_update_read_metrics(struct ceph_client_metric *m,
21797e27aaaSXiubo Li ktime_t r_start, ktime_t r_end,
21817e9fc9fSLuís Henriques unsigned int size, int rc)
21917e9fc9fSLuís Henriques {
22017e9fc9fSLuís Henriques ceph_update_metrics(&m->metric[METRIC_READ],
22117e9fc9fSLuís Henriques r_start, r_end, size, rc);
22217e9fc9fSLuís Henriques }
ceph_update_write_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,unsigned int size,int rc)22317e9fc9fSLuís Henriques static inline void ceph_update_write_metrics(struct ceph_client_metric *m,
22470c94820SXiubo Li ktime_t r_start, ktime_t r_end,
22517e9fc9fSLuís Henriques unsigned int size, int rc)
22617e9fc9fSLuís Henriques {
22717e9fc9fSLuís Henriques ceph_update_metrics(&m->metric[METRIC_WRITE],
22817e9fc9fSLuís Henriques r_start, r_end, size, rc);
22917e9fc9fSLuís Henriques }
ceph_update_metadata_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,int rc)23017e9fc9fSLuís Henriques static inline void ceph_update_metadata_metrics(struct ceph_client_metric *m,
23117e9fc9fSLuís Henriques ktime_t r_start, ktime_t r_end,
23217e9fc9fSLuís Henriques int rc)
23317e9fc9fSLuís Henriques {
23417e9fc9fSLuís Henriques ceph_update_metrics(&m->metric[METRIC_METADATA],
23517e9fc9fSLuís Henriques r_start, r_end, 0, rc);
23617e9fc9fSLuís Henriques }
ceph_update_copyfrom_metrics(struct ceph_client_metric * m,ktime_t r_start,ktime_t r_end,unsigned int size,int rc)237c02cb7bdSLuís Henriques static inline void ceph_update_copyfrom_metrics(struct ceph_client_metric *m,
238c02cb7bdSLuís Henriques ktime_t r_start, ktime_t r_end,
239c02cb7bdSLuís Henriques unsigned int size, int rc)
240c02cb7bdSLuís Henriques {
241c02cb7bdSLuís Henriques ceph_update_metrics(&m->metric[METRIC_COPYFROM],
242c02cb7bdSLuís Henriques r_start, r_end, size, rc);
243c02cb7bdSLuís Henriques }
244f9009efaSXiubo Li #endif /* _FS_CEPH_MDS_METRIC_H */
245