| |
| |
| |
| |
| |
| |
|
|
| |
| let db: ReturnType<typeof import('../vfs/adapters/sqlite-connection').getCoreDatabase> | null = null; |
|
|
| |
| |
| |
| function getDB() { |
| if (!db) { |
| |
| |
| |
| const { getCoreDatabase } = require('../vfs/adapters/sqlite-connection'); |
| db = getCoreDatabase(); |
| } |
| return db; |
| } |
|
|
|
|
| |
| |
| |
| export function getRequestStats(hoursBack: number = 24): { |
| requestsLastHour: number; |
| requestsLastDay: number; |
| errorCount: number; |
| topDeployments: Array<{ deploymentId: string; count: number }>; |
| recentErrors: Array<{ deploymentId: string; path: string; statusCode: number; timestamp: string }>; |
| } { |
| try { |
| const database = getDB(); |
| if (!database) { |
| return { |
| requestsLastHour: 0, |
| requestsLastDay: 0, |
| errorCount: 0, |
| topDeployments: [], |
| recentErrors: [], |
| }; |
| } |
|
|
| |
| const lastHour = database.prepare(` |
| SELECT COUNT(*) as count FROM request_log |
| WHERE timestamp > datetime('now', '-1 hour') |
| `).get() as { count: number }; |
|
|
| |
| const lastDay = database.prepare(` |
| SELECT COUNT(*) as count FROM request_log |
| WHERE timestamp > datetime('now', '-24 hours') |
| `).get() as { count: number }; |
|
|
| |
| const errors = database.prepare(` |
| SELECT COUNT(*) as count FROM request_log |
| WHERE timestamp > datetime('now', '-24 hours') |
| AND status_code >= 400 |
| `).get() as { count: number }; |
|
|
| |
| const topDeployments = database.prepare(` |
| SELECT site_id as deploymentId, COUNT(*) as count FROM request_log |
| WHERE timestamp > datetime('now', '-24 hours') |
| GROUP BY site_id |
| ORDER BY count DESC |
| LIMIT 10 |
| `).all() as Array<{ deploymentId: string; count: number }>; |
|
|
| |
| const recentErrors = database.prepare(` |
| SELECT site_id as deploymentId, path, status_code as statusCode, timestamp FROM request_log |
| WHERE status_code >= 400 |
| ORDER BY timestamp DESC |
| LIMIT 10 |
| `).all() as Array<{ deploymentId: string; path: string; statusCode: number; timestamp: string }>; |
|
|
| return { |
| requestsLastHour: lastHour.count, |
| requestsLastDay: lastDay.count, |
| errorCount: errors.count, |
| topDeployments, |
| recentErrors, |
| }; |
| } catch (error) { |
| console.error('[RequestLogger] Failed to get stats:', error); |
| return { |
| requestsLastHour: 0, |
| requestsLastDay: 0, |
| errorCount: 0, |
| topDeployments: [], |
| recentErrors: [], |
| }; |
| } |
| } |
|
|
| |
| |
| |
| |
| export function cleanupOldLogs(daysToKeep: number = 7): number { |
| try { |
| const database = getDB(); |
| if (!database) return 0; |
|
|
| const result = database.prepare(` |
| DELETE FROM request_log |
| WHERE timestamp < datetime('now', '-' || ? || ' days') |
| `).run(daysToKeep); |
|
|
| return result.changes; |
| } catch (error) { |
| console.error('[RequestLogger] Failed to cleanup logs:', error); |
| return 0; |
| } |
| } |
|
|