From 07886ec317acffdc7975a0ad0bbc2e1c0d321768 Mon Sep 17 00:00:00 2001 From: Christoffer Martinsson Date: Mon, 13 Oct 2025 19:01:21 +0200 Subject: [PATCH] Add MongoDB/mongod service monitoring and description --- agent/src/collectors/service.rs | 40 +++++++++++++++++++++++++++++++++ agent/src/discovery.rs | 1 + 2 files changed, 41 insertions(+) diff --git a/agent/src/collectors/service.rs b/agent/src/collectors/service.rs index 1bd0084..0333f26 100644 --- a/agent/src/collectors/service.rs +++ b/agent/src/collectors/service.rs @@ -439,6 +439,7 @@ impl ServiceCollector { "postgresql" | "postgres" => self.get_postgres_connections().await.map(|s| vec![s]), "mysql" | "mariadb" => self.get_mysql_connections().await.map(|s| vec![s]), "redis" | "redis-immich" => self.get_redis_info().await.map(|s| vec![s]), + "mongodb" | "mongod" => self.get_mongodb_info().await.map(|s| vec![s]), "gitea" => self.get_gitea_info().await.map(|s| vec![s]), "immich-server" | "immich" => self.get_immich_info().await.map(|s| vec![s]), "vaultwarden" => self.get_vaultwarden_info().await.map(|s| vec![s]), @@ -1042,6 +1043,45 @@ impl ServiceCollector { None } + + async fn get_mongodb_info(&self) -> Option { + // Check MongoDB connections on port 27017 + let output = Command::new("/run/current-system/sw/bin/ss") + .args(["-tn", "state", "established", "dport", "= :27017"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .await + .ok()?; + + if output.status.success() { + let stdout = String::from_utf8_lossy(&output.stdout); + let connection_count = stdout.lines().count().saturating_sub(1); + if connection_count > 0 { + return Some(format!("{} connections", connection_count)); + } else { + return Some("No connections".to_string()); + } + } + + // Fallback: check data directory size + let output = Command::new("sudo") + .args(["/run/current-system/sw/bin/du", "-sh", "/var/lib/mongodb"]) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .output() + .await + .ok()?; + + if output.status.success() { + let stdout = String::from_utf8_lossy(&output.stdout); + if let Some(size) = stdout.split_whitespace().next() { + return Some(format!("Data: {}", size)); + } + } + + None + } } #[async_trait] diff --git a/agent/src/discovery.rs b/agent/src/discovery.rs index b089aa9..163f876 100644 --- a/agent/src/discovery.rs +++ b/agent/src/discovery.rs @@ -232,6 +232,7 @@ impl AutoDiscovery { "mariadb", "redis", "mongodb", + "mongod", // Backup and storage "borg", "rclone",