添加更多的延迟选择
This commit is contained in:
@@ -14,7 +14,8 @@ const REQUIRED_TABLES = [
|
||||
'prometheus_sources',
|
||||
'site_settings',
|
||||
'traffic_stats',
|
||||
'server_locations'
|
||||
'server_locations',
|
||||
'latency_routes'
|
||||
];
|
||||
|
||||
async function checkAndFixDatabase() {
|
||||
@@ -145,6 +146,18 @@ async function createTable(tableName) {
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||
`);
|
||||
break;
|
||||
case 'latency_routes':
|
||||
await db.query(`
|
||||
CREATE TABLE IF NOT EXISTS latency_routes (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
source_id INT NOT NULL,
|
||||
latency_source VARCHAR(100) NOT NULL,
|
||||
latency_dest VARCHAR(100) NOT NULL,
|
||||
latency_target VARCHAR(255) NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||
`);
|
||||
break;
|
||||
case 'server_locations':
|
||||
await db.query(`
|
||||
CREATE TABLE IF NOT EXISTS server_locations (
|
||||
|
||||
@@ -842,24 +842,69 @@ app.get('*', (req, res, next) => {
|
||||
});
|
||||
|
||||
|
||||
// Get latency for A-B connection
|
||||
// ==================== Latency Routes CRUD ====================
|
||||
|
||||
app.get('/api/latency-routes', async (req, res) => {
|
||||
try {
|
||||
const [rows] = await db.query(`
|
||||
SELECT r.*, s.name as source_name
|
||||
FROM latency_routes r
|
||||
LEFT JOIN prometheus_sources s ON r.source_id = s.id
|
||||
ORDER BY r.created_at DESC
|
||||
`);
|
||||
res.json(rows);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: 'Failed to fetch latency routes' });
|
||||
}
|
||||
});
|
||||
|
||||
app.post('/api/latency-routes', requireAuth, async (req, res) => {
|
||||
const { source_id, latency_source, latency_dest, latency_target } = req.body;
|
||||
try {
|
||||
await db.query('INSERT INTO latency_routes (source_id, latency_source, latency_dest, latency_target) VALUES (?, ?, ?, ?)', [source_id, latency_source, latency_dest, latency_target]);
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: 'Failed to add latency route' });
|
||||
}
|
||||
});
|
||||
|
||||
app.delete('/api/latency-routes/:id', requireAuth, async (req, res) => {
|
||||
try {
|
||||
await db.query('DELETE FROM latency_routes WHERE id = ?', [req.params.id]);
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: 'Failed to delete latency route' });
|
||||
}
|
||||
});
|
||||
|
||||
// ==================== Metrics Latency ====================
|
||||
|
||||
app.get('/api/metrics/latency', async (req, res) => {
|
||||
try {
|
||||
const [settings] = await db.query('SELECT blackbox_source_id, latency_target FROM site_settings WHERE id = 1');
|
||||
if (settings.length === 0 || !settings[0].blackbox_source_id || !settings[0].latency_target) {
|
||||
return res.json({ latency: null });
|
||||
}
|
||||
const [routes] = await db.query(`
|
||||
SELECT r.*, s.url
|
||||
FROM latency_routes r
|
||||
JOIN prometheus_sources s ON r.source_id = s.id
|
||||
`);
|
||||
|
||||
// Lookup source URL from the source ID
|
||||
const [sources] = await db.query('SELECT url FROM prometheus_sources WHERE id = ?', [settings[0].blackbox_source_id]);
|
||||
if (sources.length === 0) {
|
||||
return res.json({ latency: null });
|
||||
if (routes.length === 0) {
|
||||
// Return empty routes array instead of null for consistency
|
||||
return res.json({ routes: [] });
|
||||
}
|
||||
|
||||
const latency = await prometheusService.getLatency(sources[0].url, settings[0].latency_target);
|
||||
res.json({ latency });
|
||||
const results = await Promise.all(routes.map(async (route) => {
|
||||
const latency = await prometheusService.getLatency(route.url, route.latency_target);
|
||||
return {
|
||||
id: route.id,
|
||||
source: route.latency_source,
|
||||
dest: route.latency_dest,
|
||||
latency: latency
|
||||
};
|
||||
}));
|
||||
|
||||
res.json({ routes: results });
|
||||
} catch (err) {
|
||||
console.error('Error fetching latency:', err);
|
||||
console.error('Error fetching latencies:', err);
|
||||
res.status(500).json({ error: 'Failed to fetch latency' });
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user