diff --git a/services/appflowy-collaborate/src/group/state.rs b/services/appflowy-collaborate/src/group/state.rs index 4ac4dddc..887026b3 100644 --- a/services/appflowy-collaborate/src/group/state.rs +++ b/services/appflowy-collaborate/src/group/state.rs @@ -135,16 +135,29 @@ impl GroupManagementState { object_id: object_id.to_string(), }; - self - .editing_by_user - .entry(user.clone()) - .or_default() - .insert(editing); + let entry = self.editing_by_user.entry(user.clone()); + match entry { + dashmap::mapref::entry::Entry::Occupied(_) => {}, + dashmap::mapref::entry::Entry::Vacant(_) => { + self + .metrics_calculate + .num_of_editing_users + .fetch_add(1, std::sync::atomic::Ordering::Relaxed); + }, + } + + entry.or_default().insert(editing); Ok(()) } pub(crate) async fn remove_user(&self, user: &RealtimeUser) { 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) { for editing in editing_objects { match self.group_by_object_id.try_get(&editing.object_id) { diff --git a/services/appflowy-collaborate/src/metrics.rs b/services/appflowy-collaborate/src/metrics.rs index 36cb3e46..a1b73c48 100644 --- a/services/appflowy-collaborate/src/metrics.rs +++ b/services/appflowy-collaborate/src/metrics.rs @@ -12,6 +12,7 @@ pub struct CollabRealtimeMetrics { total_success_get_encode_collab_from_redis: Gauge, total_attempt_get_encode_collab_from_redis: Gauge, opening_collab_count: Gauge, + num_of_editing_users: Gauge, /// The number of apply update apply_update_count: Gauge, /// The number of apply update failed @@ -27,6 +28,7 @@ impl CollabRealtimeMetrics { total_success_get_encode_collab_from_redis: Gauge::default(), total_attempt_get_encode_collab_from_redis: Gauge::default(), opening_collab_count: Gauge::default(), + num_of_editing_users: Gauge::default(), apply_update_count: Default::default(), apply_update_failed_count: Default::default(), acquire_collab_lock_count: Default::default(), @@ -57,6 +59,11 @@ impl CollabRealtimeMetrics { "number of opening collabs", metrics.opening_collab_count.clone(), ); + realtime_registry.register( + "editing_users_count", + "number of editing users", + metrics.num_of_editing_users.clone(), + ); realtime_registry.register( "apply_update_count", "number of apply update", @@ -91,6 +98,7 @@ pub(crate) struct CollabMetricsCalculate { pub(crate) apply_update_count: Arc, pub(crate) apply_update_failed_count: Arc, pub(crate) num_of_active_collab: Arc, + pub(crate) num_of_editing_users: Arc, } pub(crate) fn spawn_metrics( @@ -115,6 +123,13 @@ pub(crate) fn spawn_metrics( .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 metrics.connected_users.set( metrics_calculation