health panel implementation

This commit is contained in:
Storme-bit
2026-04-17 23:32:33 -07:00
parent afae2af85b
commit 8a5caf7399
4 changed files with 42 additions and 2 deletions

View File

@@ -189,3 +189,9 @@ export async function updateSettings(updates) {
if (!res.ok) throw new Error(`Failed to update settings: ${res.status}`);
return res.json();
}
export async function getServiceHealth() {
const res = await fetch(`${BASE_URL}/health/services`);
if (!res.ok) throw new Error(`Failed to fetch health: ${res.status}`);
return res.json();
}

View File

@@ -14,6 +14,8 @@ export default defineConfig({
'/models': 'http://192.168.0.205:4000',
'/projects': 'http://192.168.0.205:4000',
'/episodes': 'http://192.168.0.205:4000',
'/settings': 'http://192.168.0.205:4000',
'/health': 'http://192.168.0.205:4000',
},
},
});

View File

@@ -7,8 +7,9 @@ const chatRouter = require('./routes/chat');
const sessionsRouter = require('./routes/sessions');
const modelsRouter = require('./routes/models');
const projectsRouter = require('./routes/projects');
const episodesRouter = require('./routes/episodes')
const settingsRouter = require('./routes/settings')
const episodesRouter = require('./routes/episodes');
const settingsRouter = require('./routes/settings');
const healthRouter = require('./routes/health');
const cors = require('cors');
@@ -46,6 +47,7 @@ app.use('/models', modelsRouter);
app.use('/projects', projectsRouter);
app.use('/episodes', episodesRouter);
app.use('/settings', settingsRouter);
app.use('/health/services', healthRouter);
/******* Start the server ************/
app.listen(PORT, () => {

View File

@@ -0,0 +1,30 @@
const { Router } = require('express');
const fetch = require('node-fetch');
const { getEnv, SERVICES, PORTS } = require('@nexusai/shared');
const router = Router();
const SERVICES_MAP = [
{ key: 'inference', label: 'Inference', url: `${getEnv('INFERENCE_SERVICE_URL', SERVICES.INFERENCE_URL)}/health` },
{ key: 'memory', label: 'Memory', url: `${getEnv('MEMORY_SERVICE_URL', SERVICES.MEMORY_URL)}/health` },
{ key: 'embedding', label: 'Embedding', url: `${getEnv('EMBEDDING_SERVICE_URL', SERVICES.EMBEDDING_URL)}/health` },
{ key: 'orchestration', label: 'Orchestration', url: `http://localhost:${getEnv('PORT', PORTS.ORCHESTRATION)}/health` },
];
router.get('/', async (req, res) => {
const results = await Promise.all(
SERVICES_MAP.map(async ({ key, label, url }) => {
const start = Date.now();
try {
const r = await fetch(url, { signal: AbortSignal.timeout(3000) });
const data = await r.json();
return { key, label, status: 'healthy', latency: Date.now() - start, detail: data };
} catch (err) {
return { key, label, status: 'unreachable', latency: Date.now() - start, detail: null };
}
})
);
res.json(results);
});
module.exports = router;