127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
/**
|
|
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
|
* All rights reserved.
|
|
*
|
|
* This software is proprietary and confidential.
|
|
* Unauthorized copying, modification, or distribution is prohibited.
|
|
*
|
|
* For licensing inquiries: info@hb3-accelerator.com
|
|
* Website: https://hb3-accelerator.com
|
|
* GitHub: https://github.com/HB3-ACCELERATOR
|
|
*/
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const axios = require('axios');
|
|
const db = require('../db');
|
|
const aiAssistant = require('../services/ai-assistant');
|
|
const aiCache = require('../services/ai-cache');
|
|
const logger = require('../utils/logger');
|
|
const ollamaConfig = require('../services/ollamaConfig');
|
|
|
|
router.get('/', async (req, res) => {
|
|
const results = {};
|
|
// Backend
|
|
results.backend = { status: 'ok' };
|
|
|
|
// Vector Search
|
|
try {
|
|
const baseUrl = process.env.VECTOR_SEARCH_URL || 'http://vector-search:8001';
|
|
const healthUrl = baseUrl.replace(/\/$/, '') + '/health';
|
|
const vs = await axios.get(healthUrl, { timeout: 2000 });
|
|
results.vectorSearch = { status: 'ok', ...vs.data };
|
|
} catch (e) {
|
|
console.log('Vector Search error:', e.message, 'Status:', e.response?.status);
|
|
results.vectorSearch = { status: 'error', error: e.message };
|
|
}
|
|
|
|
// Ollama
|
|
try {
|
|
const ollamaConfig = require('../services/ollamaConfig');
|
|
const ollama = await axios.get(ollamaConfig.getApiUrl('tags'), { timeout: 2000 });
|
|
results.ollama = { status: 'ok', models: ollama.data.models?.length || 0 };
|
|
} catch (e) {
|
|
results.ollama = { status: 'error', error: e.message };
|
|
}
|
|
|
|
// PostgreSQL
|
|
try {
|
|
await db.query('SELECT 1');
|
|
results.postgres = { status: 'ok' };
|
|
} catch (e) {
|
|
results.postgres = { status: 'error', error: e.message };
|
|
}
|
|
|
|
res.json({ status: 'ok', services: results, timestamp: new Date().toISOString() });
|
|
});
|
|
|
|
// GET /api/monitoring/ai-stats - статистика AI
|
|
router.get('/ai-stats', async (req, res) => {
|
|
try {
|
|
res.json({
|
|
status: 'ok',
|
|
timestamp: new Date().toISOString(),
|
|
ai: {
|
|
health: 'ok',
|
|
model: ollamaConfig.getDefaultModel(),
|
|
baseUrl: ollamaConfig.getBaseUrl()
|
|
},
|
|
cache: {
|
|
size: 0,
|
|
maxSize: 100,
|
|
hitRate: 0
|
|
},
|
|
queue: {
|
|
totalAdded: 0,
|
|
totalProcessed: 0,
|
|
totalFailed: 0,
|
|
averageProcessingTime: 0,
|
|
currentQueueSize: 0,
|
|
lastProcessedAt: null,
|
|
uptime: 0
|
|
}
|
|
});
|
|
} catch (error) {
|
|
logger.error('Error getting AI stats:', error);
|
|
res.status(500).json({
|
|
status: 'error',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// POST /api/monitoring/ai-cache/clear - очистка кэша
|
|
router.post('/ai-cache/clear', async (req, res) => {
|
|
try {
|
|
aiCache.clear();
|
|
res.json({
|
|
status: 'ok',
|
|
message: 'AI cache cleared successfully'
|
|
});
|
|
} catch (error) {
|
|
logger.error('Error clearing AI cache:', error);
|
|
res.status(500).json({
|
|
status: 'error',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// POST /api/monitoring/ai-queue/clear - очистка очереди
|
|
router.post('/ai-queue/clear', async (req, res) => {
|
|
try {
|
|
aiAssistant.aiQueue.clearQueue();
|
|
res.json({
|
|
status: 'ok',
|
|
message: 'AI queue cleared successfully'
|
|
});
|
|
} catch (error) {
|
|
logger.error('Error clearing AI queue:', error);
|
|
res.status(500).json({
|
|
status: 'error',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|