From 83ad64b824df565674c47c074923501db0622c96 Mon Sep 17 00:00:00 2001
From: timothycarambat <rambat1010@gmail.com>
Date: Thu, 10 Aug 2023 13:23:23 -0700
Subject: [PATCH] add service metrics

---
 server/endpoints/utils.js | 52 +++++++++++++++++++++++++++++++++++++++
 server/index.js           |  2 ++
 server/package.json       |  1 +
 server/yarn.lock          |  5 ++++
 4 files changed, 60 insertions(+)
 create mode 100644 server/endpoints/utils.js

diff --git a/server/endpoints/utils.js b/server/endpoints/utils.js
new file mode 100644
index 000000000..8bfa3cc8a
--- /dev/null
+++ b/server/endpoints/utils.js
@@ -0,0 +1,52 @@
+const { SystemSettings } = require("../models/systemSettings");
+
+function getGitVersion() {
+  return require("child_process")
+    .execSync("git rev-parse HEAD")
+    .toString()
+    .trim();
+}
+
+function byteToGigaByte(n) {
+  return n / Math.pow(10, 9);
+}
+
+async function getDiskStorage() {
+  try {
+    const checkDiskSpace = require("check-disk-space").default;
+    const { free, size } = await checkDiskSpace("/dev/sda1");
+    return {
+      current: Math.floor(byteToGigaByte(free)),
+      capacity: Math.floor(byteToGigaByte(size)),
+    };
+  } catch {
+    return {
+      current: null,
+      capacity: null,
+    };
+  }
+}
+
+function utilEndpoints(app) {
+  if (!app) return;
+
+  app.get("/utils/metrics", async (_, response) => {
+    try {
+      const metrics = {
+        online: true,
+        version: getGitVersion(),
+        mode: (await SystemSettings.isMultiUserMode())
+          ? "multi-user"
+          : "single-user",
+        vectorDB: process.env.VECTOR_DB || "lancedb",
+        storage: await getDiskStorage(),
+      };
+      response.status(200).json(metrics);
+    } catch (e) {
+      console.error(e);
+      response.sendStatus(500).end();
+    }
+  });
+}
+
+module.exports = { utilEndpoints };
diff --git a/server/index.js b/server/index.js
index 0164a03e2..5c788daf7 100644
--- a/server/index.js
+++ b/server/index.js
@@ -15,6 +15,7 @@ const { getVectorDbClass } = require("./utils/helpers");
 const { validateTablePragmas } = require("./utils/database");
 const { adminEndpoints } = require("./endpoints/admin");
 const { inviteEndpoints } = require("./endpoints/invite");
+const { utilEndpoints } = require("./endpoints/utils");
 const app = express();
 const apiRouter = express.Router();
 
@@ -33,6 +34,7 @@ workspaceEndpoints(apiRouter);
 chatEndpoints(apiRouter);
 adminEndpoints(apiRouter);
 inviteEndpoints(apiRouter);
+utilEndpoints(apiRouter);
 
 apiRouter.post("/v/:command", async (request, response) => {
   try {
diff --git a/server/package.json b/server/package.json
index 3d8ec2b80..73f9a20be 100644
--- a/server/package.json
+++ b/server/package.json
@@ -21,6 +21,7 @@
     "archiver": "^5.3.1",
     "bcrypt": "^5.1.0",
     "body-parser": "^1.20.2",
+    "check-disk-space": "^3.4.0",
     "chromadb": "^1.5.2",
     "cors": "^2.8.5",
     "dotenv": "^16.0.3",
diff --git a/server/yarn.lock b/server/yarn.lock
index cd1514e7a..9474d4607 100644
--- a/server/yarn.lock
+++ b/server/yarn.lock
@@ -566,6 +566,11 @@ chalk@^2.4.2:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
+check-disk-space@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/check-disk-space/-/check-disk-space-3.4.0.tgz#eb8e69eee7a378fd12e35281b8123a8b4c4a8ff7"
+  integrity sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==
+
 chokidar@^3.5.2:
   version "3.5.3"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
-- 
GitLab