Start adding metrics to `collab` server

Antonio Scandurra created

Change summary

crates/collab/src/rpc.rs       | 11 ++++++++++-
crates/collab/src/rpc/store.rs | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 1 deletion(-)

Detailed changes

crates/collab/src/rpc.rs 🔗

@@ -218,7 +218,7 @@ impl Server {
             let receipt = envelope.receipt();
             let handler = handler.clone();
             async move {
-                let mut store = server.store.write().await;
+                let mut store = server.state_mut().await;
                 let response = (handler)(server.clone(), &mut *store, envelope);
                 match response {
                     Ok(response) => {
@@ -1094,6 +1094,15 @@ impl<'a> Drop for StoreWriteGuard<'a> {
     fn drop(&mut self) {
         #[cfg(test)]
         self.check_invariants();
+
+        let metrics = self.metrics();
+        tracing::info!(
+            connections = metrics.connections,
+            registered_projects = metrics.registered_projects,
+            shared_projects = metrics.shared_projects,
+            collaborators_per_project = metrics.collaborators_per_project,
+            "metrics"
+        );
     }
 }
 

crates/collab/src/rpc/store.rs 🔗

@@ -81,7 +81,41 @@ pub struct LeftProject {
     pub authorized_user_ids: Vec<UserId>,
 }
 
+#[derive(Copy, Clone)]
+pub struct Metrics {
+    pub connections: usize,
+    pub registered_projects: usize,
+    pub shared_projects: usize,
+    pub collaborators_per_project: f32,
+}
+
 impl Store {
+    pub fn metrics(&self) -> Metrics {
+        let connections = self.connections.len();
+        let mut registered_projects = 0;
+        let mut shared_projects = 0;
+        let mut collaborators = 0;
+        for project in self.projects.values() {
+            registered_projects += 1;
+            if let Some(share) = project.share.as_ref() {
+                shared_projects += 1;
+                collaborators += share.active_replica_ids.len();
+            }
+        }
+        let collaborators_per_project = if shared_projects == 0 || collaborators == 0 {
+            0.
+        } else {
+            collaborators as f32 / shared_projects as f32
+        };
+
+        Metrics {
+            connections,
+            registered_projects,
+            shared_projects,
+            collaborators_per_project,
+        }
+    }
+
     #[instrument(skip(self))]
     pub fn add_connection(&mut self, connection_id: ConnectionId, user_id: UserId) {
         self.connections.insert(