diff --git a/data-plane/src/stats_client.rs b/data-plane/src/stats_client.rs
index cb8e954e..4bfb74d7 100644
--- a/data-plane/src/stats_client.rs
+++ b/data-plane/src/stats_client.rs
@@ -3,6 +3,7 @@ use cadence::{BufferedUdpMetricSink, QueuingMetricSink};
 use cadence_macros::{set_global_default, statsd_count, statsd_gauge};
 use shared::stats::StatsError;
 use shared::{publish_count, publish_count_dynamic_label, publish_gauge, ENCLAVE_STATSD_PORT};
+use std::fs;
 use std::net::UdpSocket;
 
 use crate::EnclaveContext;
@@ -31,6 +32,26 @@ impl StatsClient {
         }
     }
 
+    fn get_file_descriptor_info() -> Result<(u64, u64, u64), StatsError> {
+        let content = fs::read_to_string("/proc/sys/fs/file-nr")?;
+        let parts: Vec<&str> = content.split_whitespace().collect();
+
+        if parts.len() == 3 {
+            let allocated: u64 = parts[0]
+                .parse()
+                .map_err(|_| StatsError::FDUsageParseError)?;
+            let free: u64 = parts[1]
+                .parse()
+                .map_err(|_| StatsError::FDUsageParseError)?;
+            let max: u64 = parts[2]
+                .parse()
+                .map_err(|_| StatsError::FDUsageParseError)?;
+            Ok((allocated, free, max))
+        } else {
+            Err(StatsError::FDUsageReadError)
+        }
+    }
+
     pub fn record_encrypt() {
         if let Ok(context) = EnclaveContext::get() {
             publish_count!("evervault.enclaves.encrypt.count", 1, context);
@@ -52,24 +73,42 @@ impl StatsClient {
     }
 
     pub fn try_record_system_metrics() -> Result<(), StatsError> {
-        let mem_info = sys_info::mem_info()?;
-        let cpu = sys_info::loadavg()?;
-        let cpu_num = sys_info::cpu_num()?;
+        let mem_info =
+            sys_info::mem_info().map_err(|e| log::error!("Couldn't obtain mem info: {e}"));
+        let cpu = sys_info::loadavg().map_err(|e| log::error!("Couldn't obtain cpu info: {e}"));
+        let cpu_num = sys_info::cpu_num().map_err(|e| log::error!("Couldn't obtain cpu num: {e}"));
+        let fd_info = Self::get_file_descriptor_info()
+            .map_err(|e| log::error!("Couldn't obtain fd info: {e}"));
 
         if let Ok(context) = EnclaveContext::get() {
-            publish_gauge!(
-                "evervault.enclaves.memory.total",
-                mem_info.total as f64,
-                context
-            );
-            publish_gauge!(
-                "evervault.enclaves.memory.avail",
-                mem_info.avail as f64,
-                context
-            );
-            publish_gauge!("evervault.enclaves.cpu.cores", cpu_num as f64, context);
-            publish_gauge!("evervault.enclaves.cpu.one", cpu.one, context);
-        };
+            if let Ok(mem_info) = mem_info {
+                publish_gauge!(
+                    "evervault.enclaves.memory.total",
+                    mem_info.total as f64,
+                    context
+                );
+                publish_gauge!(
+                    "evervault.enclaves.memory.avail",
+                    mem_info.avail as f64,
+                    context
+                );
+            }
+
+            if let Ok(cpu_num) = cpu_num {
+                publish_gauge!("evervault.enclaves.cpu.cores", cpu_num as f64, context);
+            }
+
+            if let Ok(cpu) = cpu {
+                publish_gauge!("evervault.enclaves.cpu.one", cpu.one, context);
+            }
+
+            if let Ok((allocated, free, max)) = fd_info {
+                publish_gauge!("evervault.enclaves.fd.allocated", allocated, context);
+                publish_gauge!("evervault.enclaves.fd.free", free, context);
+                publish_gauge!("evervault.enclaves.fd.max", max, context);
+            }
+        }
+
         Ok(())
     }
 }
diff --git a/e2e-tests/e2e.js b/e2e-tests/e2e.js
index e094cb36..a20c0a30 100644
--- a/e2e-tests/e2e.js
+++ b/e2e-tests/e2e.js
@@ -178,6 +178,15 @@ describe("Enclave is runnning", () => {
         expect(keys).to.include(
           "evervault.enclaves.cpu.cores;enclave_uuid=enclave_123;app_uuid=app_12345678"
         );
+        expect(keys).to.include(
+          "evervault.enclaves.fd.allocated;enclave_uuid=enclave_123;app_uuid=app_12345678"
+        );
+        expect(keys).to.include(
+          "evervault.enclaves.fd.max;enclave_uuid=enclave_123;app_uuid=app_12345678"
+        );
+        expect(keys).to.include(
+          "evervault.enclaves.fd.free;enclave_uuid=enclave_123;app_uuid=app_12345678"
+        );
       } finally {
         sysClient.destroy();
         done();
diff --git a/shared/src/stats.rs b/shared/src/stats.rs
index dd36c23f..7457677e 100644
--- a/shared/src/stats.rs
+++ b/shared/src/stats.rs
@@ -11,6 +11,10 @@ pub enum StatsError {
     MetricError(#[from] MetricError),
     #[error("IO error {0}")]
     IOError(#[from] Error),
+    #[error("Couldn't parse file descriptor values info from /proc/sys/fs/file-nr")]
+    FDUsageParseError,
+    #[error("Couldn't read file descriptor info from /proc/sys/fs/file-nr")]
+    FDUsageReadError,
 }
 
 #[macro_export]