#include "messages/MClientRequestForward.h"
#include "messages/MClientSession.h"
#include "messages/MClientSnap.h"
+#include "messages/MClientMetrics.h"
#include "messages/MCommandReply.h"
#include "messages/MFSMap.h"
#include "messages/MFSMapUser.h"
auto m = make_message<MClientSession>(CEPH_SESSION_REQUEST_OPEN);
m->metadata = metadata;
m->supported_features = feature_bitset_t(CEPHFS_FEATURES_CLIENT_SUPPORTED);
+ m->metric_spec = feature_bitset_t(CEPHFS_METRIC_FEATURES_ALL);
session->con->send_message2(std::move(m));
return session;
}
check_caps(in, CHECK_CAPS_NODELAY);
}
+ collect_and_send_metrics();
+
trim_cache(true);
if (blacklisted && mounted &&
}
}
+void Client::collect_and_send_metrics() {
+ ldout(cct, 20) << __func__ << dendl;
+
+ ceph_assert(ceph_mutex_is_locked_by_me(client_lock));
+
+ // right now, we only track and send global metrics. its sufficient
+ // to send these metrics to MDS rank0.
+ collect_and_send_global_metrics();
+}
+
+void Client::collect_and_send_global_metrics() {
+ ldout(cct, 20) << __func__ << dendl;
+ ceph_assert(ceph_mutex_is_locked_by_me(client_lock));
+
+ if (!have_open_session((mds_rank_t)0)) {
+ ldout(cct, 5) << __func__ << ": no session with rank=0 -- not sending metric"
+ << dendl;
+ return;
+ }
+ auto session = _get_or_open_mds_session((mds_rank_t)0);
+ if (!session->mds_features.test(CEPHFS_FEATURE_METRIC_COLLECT)) {
+ ldout(cct, 5) << __func__ << ": rank=0 does not support metrics" << dendl;
+ return;
+ }
+
+ ClientMetricMessage metric;
+ std::vector<ClientMetricMessage> message;
+
+ // read latency
+ metric = ClientMetricMessage(ReadLatencyPayload(logger->tget(l_c_read)));
+ message.push_back(metric);
+
+ // write latency
+ metric = ClientMetricMessage(WriteLatencyPayload(logger->tget(l_c_wrlat)));
+ message.push_back(metric);
+
+ // metadata latency
+ metric = ClientMetricMessage(MetadataLatencyPayload(logger->tget(l_c_lat)));
+ message.push_back(metric);
+
+ // cap hit ratio -- nr_caps is unused right now
+ auto [cap_hits, cap_misses] = get_cap_hit_rates();
+ metric = ClientMetricMessage(CapInfoPayload(cap_hits, cap_misses, 0));
+ message.push_back(metric);
+
+ session->con->send_message2(make_message<MClientMetrics>(std::move(message)));
+}
+
void Client::renew_caps()
{
ldout(cct, 10) << "renew_caps()" << dendl;
#include "include/types.h"
#include "include/unordered_map.h"
#include "include/unordered_set.h"
+#include "include/cephfs/metrics/Types.h"
#include "mds/mdstypes.h"
#include "msg/Dispatcher.h"
#include "msg/MessageRef.h"
int _lookup_ino(inodeno_t ino, const UserPerm& perms, Inode **inode=NULL);
bool _ll_forget(Inode *in, uint64_t count);
+ void collect_and_send_metrics();
+ void collect_and_send_global_metrics();
uint32_t deleg_timeout = 0;
#ifndef CEPHFS_FEATURES_H
#define CEPHFS_FEATURES_H
+#include "include/cephfs/metrics/Types.h"
+
class feature_bitset_t;
namespace ceph {
class Formatter;
CEPHFS_FEATURE_METRIC_COLLECT, \
}
+#define CEPHFS_METRIC_FEATURES_ALL { \
+ CLIENT_METRIC_TYPE_CAP_INFO, \
+ CLIENT_METRIC_TYPE_READ_LATENCY, \
+ CLIENT_METRIC_TYPE_WRITE_LATENCY, \
+ CLIENT_METRIC_TYPE_METADATA_LATENCY, \
+}
+
#define CEPHFS_FEATURES_MDS_SUPPORTED CEPHFS_FEATURES_ALL
#define CEPHFS_FEATURES_MDS_REQUIRED {}