feat: add metrics for number of editing users (#730)

This commit is contained in:
Khor Shu Heng 2024-08-27 11:56:07 +08:00 committed by GitHub
parent 15b2e81579
commit 045b6f09cb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 5 deletions

View File

@ -135,16 +135,29 @@ impl GroupManagementState {
object_id: object_id.to_string(), object_id: object_id.to_string(),
}; };
self let entry = self.editing_by_user.entry(user.clone());
.editing_by_user match entry {
.entry(user.clone()) dashmap::mapref::entry::Entry::Occupied(_) => {},
.or_default() dashmap::mapref::entry::Entry::Vacant(_) => {
.insert(editing); self
.metrics_calculate
.num_of_editing_users
.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
},
}
entry.or_default().insert(editing);
Ok(()) Ok(())
} }
pub(crate) async fn remove_user(&self, user: &RealtimeUser) { pub(crate) async fn remove_user(&self, user: &RealtimeUser) {
let entry = self.editing_by_user.remove(user); let entry = self.editing_by_user.remove(user);
if entry.is_some() {
self
.metrics_calculate
.num_of_editing_users
.fetch_sub(1, std::sync::atomic::Ordering::Relaxed);
}
if let Some(editing_objects) = entry.map(|(_, e)| e) { if let Some(editing_objects) = entry.map(|(_, e)| e) {
for editing in editing_objects { for editing in editing_objects {
match self.group_by_object_id.try_get(&editing.object_id) { match self.group_by_object_id.try_get(&editing.object_id) {

View File

@ -12,6 +12,7 @@ pub struct CollabRealtimeMetrics {
total_success_get_encode_collab_from_redis: Gauge, total_success_get_encode_collab_from_redis: Gauge,
total_attempt_get_encode_collab_from_redis: Gauge, total_attempt_get_encode_collab_from_redis: Gauge,
opening_collab_count: Gauge, opening_collab_count: Gauge,
num_of_editing_users: Gauge,
/// The number of apply update /// The number of apply update
apply_update_count: Gauge, apply_update_count: Gauge,
/// The number of apply update failed /// The number of apply update failed
@ -27,6 +28,7 @@ impl CollabRealtimeMetrics {
total_success_get_encode_collab_from_redis: Gauge::default(), total_success_get_encode_collab_from_redis: Gauge::default(),
total_attempt_get_encode_collab_from_redis: Gauge::default(), total_attempt_get_encode_collab_from_redis: Gauge::default(),
opening_collab_count: Gauge::default(), opening_collab_count: Gauge::default(),
num_of_editing_users: Gauge::default(),
apply_update_count: Default::default(), apply_update_count: Default::default(),
apply_update_failed_count: Default::default(), apply_update_failed_count: Default::default(),
acquire_collab_lock_count: Default::default(), acquire_collab_lock_count: Default::default(),
@ -57,6 +59,11 @@ impl CollabRealtimeMetrics {
"number of opening collabs", "number of opening collabs",
metrics.opening_collab_count.clone(), metrics.opening_collab_count.clone(),
); );
realtime_registry.register(
"editing_users_count",
"number of editing users",
metrics.num_of_editing_users.clone(),
);
realtime_registry.register( realtime_registry.register(
"apply_update_count", "apply_update_count",
"number of apply update", "number of apply update",
@ -91,6 +98,7 @@ pub(crate) struct CollabMetricsCalculate {
pub(crate) apply_update_count: Arc<AtomicI64>, pub(crate) apply_update_count: Arc<AtomicI64>,
pub(crate) apply_update_failed_count: Arc<AtomicI64>, pub(crate) apply_update_failed_count: Arc<AtomicI64>,
pub(crate) num_of_active_collab: Arc<AtomicI64>, pub(crate) num_of_active_collab: Arc<AtomicI64>,
pub(crate) num_of_editing_users: Arc<AtomicI64>,
} }
pub(crate) fn spawn_metrics<S>( pub(crate) fn spawn_metrics<S>(
@ -115,6 +123,13 @@ pub(crate) fn spawn_metrics<S>(
.load(std::sync::atomic::Ordering::Relaxed), .load(std::sync::atomic::Ordering::Relaxed),
); );
// editing users
metrics.num_of_editing_users.set(
metrics_calculation
.num_of_editing_users
.load(std::sync::atomic::Ordering::Relaxed),
);
// connect user // connect user
metrics.connected_users.set( metrics.connected_users.set(
metrics_calculation metrics_calculation